As subclasses de Map funcionam como uma List qualquer, mas com 2 valores, uma "Key" e o conteúdo salvo naquela Key.
É como em banco de dados, você tem sua tabela de Usuários onde sua Key é um ID por exemplo que nunca será repetido, e para cada ID você tem os valores (nome, idade etc etc)
A idéia que o nei te deu foi você salvar a lista de atores em um Map onde a Key é o nome do ator (que nunca se repete) e você usaria o segundo atributo para salvar um valor int (Integer) que representaria quantas vezes esse ator foi atribuido a um filme, ou seja, primeiramente você adicionaria o ator na Map colocando o valor do int como 0, e sempre que esse ator for adicionao a um filme, você incrementaria esse inteiro inicializado em 0 fazendo ele salvar em quantos filmes aquele ator participou.
Depois bastaria iterar no seu Map e buscar a key (nome do ator) que tem o valor mais alto.
Sobre sua primeira solução que seria mais dispendiosa, segue alguns métodos que poderia te ajudar com sua ArrayList contendo todos os personagens de todos os filmes:
Set<String> atoresSemRepeticao = new HashSet<String>(atores);
Criaria um objeto Set tomando base sua lista de atores. Lembrando que "Set" (Conjunto) não possui elementos repetidos, então esse Set teria todos os atores contidos no ArrayList "atores" mas sem repeti-los.
Agora, tendo a ArrayList e o Set em mãos, você pode iterar o Set e usar o seguinte método para ver quantas vezes aquele nome aparece no ArrayList:
Collections.frequency(atores, iteradorParaSet.next());
Esse método retorna o número de vezes que o segundo parâmetro aparece na Collection passada como primeiro parâmetro
Um exemplo de como ficaria:
ArrayList<String> atores = new ArrayList<String>();
atores.add("Manuel");
atores.add("Ronaldo");
atores.add("Talita");
atores.add("Ana");
atores.add("Manuel");
atores.add("Roberto");
atores.add("Talita");
atores.add("Ronaldo");
atores.add("Talita");
atores.add("Manuel");
Set<String> atoresSemRepeticao = new HashSet<String>(atores);
int quantidadeDeFilmesDoAtorSalvo = 0;
int quantidadeDeFilmesDoAtorAtual;
String atorSalvo = "";
String atorAtual;
Iterator<String> iteradorParaSet = atoresSemRepeticao.iterator();
while (iteradorParaSet.hasNext()) {
atorAtual = iteradorParaSet.next();
quantidadeDeFilmesDoAtorAtual = Collections.frequency(atores,
atorAtual);
if (quantidadeDeFilmesDoAtorAtual > quantidadeDeFilmesDoAtorSalvo) {
quantidadeDeFilmesDoAtorSalvo = quantidadeDeFilmesDoAtorAtual;
atorSalvo = atorAtual;
}
} // while
System.out.println(atorSalvo);
Sendo o ArrayList atores uma representação do seu array.