Hola. Ante todo te voy a dar una ayuda, no una solución final, pues nos comprometemos con el aprendizaje, y realizar esta clase de ejercicios es vital para tal.
Bueno tienes la opción de los arrays de la A a la Z si sabes que no hay más caracteres que esos, donde vas a ir guardando un contador para cada letra (también puedes curarte en salud y hacer un Array con todos los caracteres Unicode, para otros caracteres como puntos, arrobas, guiones, etc).
Por el problema, te recomendaría mejor utilizar HashMap (http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html), además de ser mucho más potente que un Array (y te puedo asegurar que al programar con Java, los List y HashMap se utilizan mucho más que los Arrays por todas las ventajas que ofrecen). La idea es que el programa aprenda si el carácter existe o no (sin tener que inicializar, como se hace en el Array. De esta manera te puede llegar cualquier carácter, exista o no), y si existe cuente más uno por cada coincidencia. La particularidad de los HashMap es que guardan una clave única y un valor. Si la clave única es un carácter y el valor es un número del contador, cada vez que leas un carácter preguntarás al HashMap ¿Tienes este carácter de clave? y si lo tiene sumarás uno a su valor, y si no lo tiene crearás la clave con el carácter y el valor iniciado en uno. Como supongo que no lo habrás dado el HashMap, te pongo un ejemplo rápido:
//Donde en <String, Integer> equivale a <Clave, Valor>
HashMap<String, Integer> mapa = new HashMap<String, Integer>();
//Para guardar un carácter
mapa.put("a", 1);
//Para preguntar si contiene la clave. Devuelve true si la contiene
boolean existeCaracter = mapa.containsKey("a");
//Para obtener el contador de un carácter
int contador = mapa.get("a");
//Aplicas mapa.put("a", contador+1). Al ya existir la clave, se sobrescribe el valor
Evidentemente falta toda la lógica de ciclos. Esto ya es trabajo tuyo :)