¡Hola Victor, espero que estés bien!
Entiendo tu confusión al ver la línea de código que mencionas:
List<Titulo> lista = new ArrayList<>();
En este caso, lo que está sucediendo es que se está creando una instancia de la clase ArrayList que implementa la interfaz List. La ventaja de hacerlo de esta manera es que, al referenciar la lista como un tipo List, en lugar de ArrayList, estás programando orientado a la interfaz, lo que te da flexibilidad para cambiar la implementación subyacente en el futuro sin tener que cambiar mucho código.
Por ejemplo, si en el futuro decides cambiar de ArrayList a LinkedList, simplemente tendrías que cambiar la parte derecha de la asignación:
List<Titulo> lista = new LinkedList<>();
Y el resto del código que utiliza la lista seguiría funcionando sin cambios, ya que ambas implementan la interfaz List.
Espero que esto aclare tu duda. Si tienes alguna otra pregunta, no dudes en preguntar.
Espero haber ayudado y buenos estudios!