Como contar las palabras de una frase en java e imprimir las que se repiten y el número de veces que se repiten

Aquí dejo el código que permite dividir una frase, e imprimir el numero de palabras que la componen, las palabras que se repiten y el número de veces de la repetición


import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author jmg39
 */
public class pruebas {

    /**
     * @param args the command line arguments
     */
    
    //se genera un metodo que recorre el string compara los valores y guarda el numero de veces que aparece cada uno
    public static ArrayList<palabras> buscarValoresaparecen( String[] frase,ArrayList<palabras> palabras ){
   
        int j=0;
        int contador=0;
        while(j<frase.length){ 
        for(int x=0;x<frase.length;x++) {
        if(frase[x].equals(frase[j])){
             contador++;
             palabras.add(new palabras());
             palabras.get(j).setPalabra(frase[x]);
             palabras.get(j).setIteracion(contador);
            }
        if(x==frase.length-1){
           j++;
           contador=0;
        }
       }
     } 
    
    return palabras;
    }
    //funcion para imprimir el array de palabras duplicadas
    public static void imprimir(ArrayList<String> dups){
        System.out.println("En esta frase se repiten las palabras:");
        for(int i=0;i<dups.size();i++){
        System.out.println(dups.get(i));
     }
    }
    //función para comprobar si una palabra existe en un arrayList
    public static boolean duplicado( ArrayList<String> dups,String palabras){
      boolean existe=false;
      for(int i=0; i<dups.size();i++){
       if(dups.get(i).equals(palabras)){
        existe=true;
       }
    }
    return existe;
    }
   // se crea una clase con constructores setters y getters para tratar el como objetos las palabras extraidas de la frase
    public static class palabras{
      String palabra;
      int iteracion;
      //constructor con parametros
    public palabras(String palabra, int iteracion){
     this.palabra=palabra;
    }
    
    //contructor vacio
     public palabras() {
        }
    //setter palabra
    public void setPalabra(String palabra) {
        this.palabra = palabra;
    }
    //setter iteraciones
    public void setIteracion(int iteracion) {
        this.iteracion = iteracion;
    }

    public int getIteracion() {
        return iteracion;
    }

        public  String getPalabra() {
            return palabra;
        }
    }
    
        //el main
    public static void main(String[] args) {
        //la frase sobre la que hay que buscar palabras duplicadas
          String sentence = "The cat sat  on the mat.  The mat  was blue.";
        //se crea un arrayList de la clase palabras para guardar los valores
          ArrayList<palabras> palabras = new ArrayList<palabras>();

        // se genera un arrayList para que guarde los valores duplicados utilizando el metodo de busqueda de duplicados
          ArrayList<String> dups= new ArrayList<String>();
      
        //se divide la frase eliminando espacios y signos de puntuacion
          String[] frase = sentence.split("\\W+");
        //varible para contar las veces que se repite una palabra
          System.out.println("Número de palabras: " + frase.length);
          buscarValoresaparecen(frase,palabras);
       
        for(int i=0;i<palabras.size();i++){
        if(palabras.get(i).getIteracion()>1){
          if(duplicado(dups,palabras.get(i).getPalabra()+" "+palabras.get(i).getIteracion()+" veces")==false){
            dups.add(palabras.get(i).getPalabra()+" "+palabras.get(i).getIteracion()+" veces");
          }
         }
        }
         //se imprimen los resultados
        imprimir(dups); 
}

   
}