Más o menos.
Digamos que hay dos tipos de datos:
- los primitivos, que son muy básicos, ya que la única información que contienen es su propio valor.
Estos datos, en Java, son: byte, int, float, double, char(en realidad es un int) y boolean.
- Los objetos de clase, son mucho más avanzados. No solo contienen su propio valor, de hecho, pueden contener muchos valores distintos al mismo tiempo, pero además incorporan funcionalidades a través de sus "métodos".
Un objeto de clase, es prácticamente un programa autónomo, que podemos diseñar para que sea todo lo sencillo, o todo lo complejo que queramos.
Este tipo de dato "nació" cuando se desarrolló la POO(Programación Orientada a Objetos)
Los array(o arreglos, o vectores, o como queramos llamarlos...), en este ejercicio, almacena el tipo primitivo int.
Sin embargo, también pueden almacenar objetos de clase, podría hacerse un array de Integer.
Los ArrayList, así como el resto de colecciones de Java (los List, los Map,...) solo pueden trabajar con objetos de clase, no aceptan tipos primitivos.
Bueno, en realidad si los aceptan, lo que pasa es que los transforman en objetos sin que nosotros lo veamos.
Por ejemplo, en esta línea:
lista1.add(miArray1[i]);
Al ArrayList lista1, que es de hecho un objeto de clase ArrayList, le estamos pasando un valor int primitivo (porque es lo que lo tiene el array) a través de su método add().
Este método, coge el int primitivo, y sin que lo veamos, construye a partir de él un objeto Integer para poder almacenarlo en el ArrayList.
Eso no ocurre por arte de magia, alguien escribió el código del método add() para que haga ese proceso y así la clase ArrayList es capaz de aceptar ints primitivos, transformándolos automáticamente en objetos Integer.
Eso es lo maravilloso de la POO, cada objeto es como un programa individual que contiene y ejecuta sus propios algoritmos de forma ajena al programa principal.
Un saludo.