Начиная с Java 8, самый простой способ - использовать потоки:
Map<String, Long> counts =
list.stream().collect(
Collectors.groupingBy(
Function.identity(), Collectors.counting()));
До Java 8 ваш намеченный подход работает просто отлично. (И способ Java 8+ делает в основном то же самое, только с более кратким синтаксисом).