Se puede usar otro array de tipo int para tener un contador por cada posible caracter.
Hay 27 posibles caracteres, en tu ejercicio salen 28 pero es porque la 'A' se repite dos veces, supongo que es un error.
Así que podemos declarar un array de int con tamaño 27.
Cada posición del array será un contador para cada carácter. Así la posición 0 contará las 'A', la posición 1 contará las 'B', etc...
Cada vez que generamos un carácter al azar, comprobamos cuál ha sido y aumentamos el contador correspondiente.
Luego, recorremos ese array a ver cuál es el contador que más se ha incrementado y así sabremos cuál es el carácter más repetido.
Si por ejemplo el contador de la posición 3 es el mayor de todos, pues sabemos que el carácter más repetido es 'D', ya que es el que le corresponde.
Voy a poner dos versiones.
Esta primera, funciona y es eficaz, pero no es eficiente. Porque se utiliza un switch muy grande, con las 27 posibilidades.
Como digo, funciona perfectamente. Pero hay que intentar ser más eficientes y buscar como evitar usar un switch tan grande.
Y en realidad basta con conservar el número que nos genera el objeto Random.
Este número nos dice de cuál posición del String de caracteres debemos extraer uno.
Y como las posiciones del String se corresponden con las posiciones de los contadores, esto significa que ese Random también nos está diciendo que contador debemos incrementar, sin tener que usar ningún switch.
Espero que estos dos ejemplos te sirvan.
Si algo no está claro o los ejemplos no son correctos por algún motivo, coméntalo aquí y lo vemos.
Un saludo.