Hola, para tratar de responder veamos lo que dice el api de Java sobre los métodos de los objetos de tipo Iterator:
boolean hasNext() Returns true if the iteration has more elements.
E next() Returns the next element in the iteration.
El método hasNext() devuelve true si hay algún elemento de la colección que aún no se ha recorrido. El método next() devuelve el siguiente elemento dentro de la colección, entiendo que en el orden por defecto que esté establecido para esa colección. En un caso como este el orden viene dado por la posición del elemento dentro del ArrayList, por tanto next() nos devolverá en la primera petición el elemento 0, en la segunda petición el elemento 1 y así sucesivamente hasta devolvernos el último elemento de la colección. Una vez esto ocurre, hasNext() devuelve false porque ya no quedan más elementos por recorrer.
Lo que hacemos con este código es recorrer todos los elementos dentro del ArrayList de uno en uno, y comprobar si alguno contiene la cadena buscada.
Si ponemos como cadena a buscar J el resultado que obtenemos es:
La cadena que buscamos es J
Analizando elemento... Juan Pérez Sánchez
Cadena encontrada!!!
Analizando elemento... José Alberto Reverón Montes
Cadena encontrada!!!
Es decir, recorre cada uno de los elementos y encuentra la cadena dos veces, porque está en los dos elementos (tanto en Juan Pérez Sánchez como en José Alberto Reverón Montes)
Nota: una letra como J puede tratarse como un carácter o como una cadena de una sola letra. En este caso la hemos tratado como una cadena de una sola letra.
Espero que haya aclarado algo
Saludos