¿Cómo funcionan los elementos en un ArrayList?

Si agrego un objeto a un ArrayList en Java, le agrego una referencia, ¿verdad? Así que asume esta situación. Creo un objeto llamado obj y lo establezco en un valor. Luego hago un bucle una cierta cantidad de veces y cada vez modifico un poco obj (como cambiar su posición) y luego lo agrego a ArrayList. Después de cada secuencia del bucle, restablezco obj al valor predeterminado para que la siguiente secuencia tenga un obj nuevo para modificar. Suponiendo que haya estado pasando referencias de obj todo el tiempo, ¿todo en ArrayList también se establecerá en el valor predeterminado? De las pruebas, veo que los valores no cambian y son todos diferentes, lo que me parece extraño. ¿Alguien podría elaborar?

Block b = block.clone();

    for(int x = 0; x < amountX; x++){
        Vector3f offset = new Vector3f(0, 0, 0);
        offset.x = x * block.getScale().x;

        for(int y = 0; y < amountY; y++){
            offset.y = y * block.getScale().y;

            for(int z = 0; z < amountZ; z++){
                offset.z = z * block.getScale().z;
                b.move(offset);
                addBlocks(b);
                b = block.clone();
            }
        }
    }

    for(Block a : blocks)
        System.out.println(a.getPosition());

addBlocks agrega un bloque a ArrayList. El último ciclo imprime todas las posiciones diferentes. Block.clone() simplemente crea un nuevo bloque con los mismos parámetros.

preguntado el 22 de noviembre de 13 a las 15:11

Mucho texto con poco código. ¿Puedes compartir el código con el que trabajaste? -

Odiamos leer texto :) Muéstrenos el código para restablecer el valor predeterminado del objeto. -

1 Respuestas

 Object o = new Object(); 

En este punto ya no está modificando el objeto, está modificando la referencia. es decir, creando un nuevo objeto y apuntando esta variable hacia él.

 do
 {
   Object o = new Object(); // set o to point to a new Object
   arrayList.add(o); //add a reference to the new object to the ArrayList
 }while(true)

la segunda vez a través de este bucle, arrayList[1] hace referencia al primer objeto creado en la memoria en pos1. Pero luego cambia a dónde apunta el objeto o en la memoria creando uno nuevo (en pos2) y apuntándolo con o. Ahora tiene dos objetos en la memoria, uno al que se hace referencia en [1] en arrayList y otro al que se hace referencia en el objeto o.

Si modifica el objeto y no la referencia, obtendrá el comportamiento del que habla, por ejemplo

  do
 {
   g.setName("Steven");
   arrayList.add(o);
 }while(true)

respondido 22 nov., 13:15

Entonces, si creo una nueva instancia del objeto, ¿también crea un nuevo objeto en el montón? ¿Significa que ahora el objeto no apunta a lo que solía? - Chipre

Sí. Está diciendo que el objeto o se vuelve igual a un nuevo objeto en el montón. - ross dibujó

Excelente explicación de un concepto muy importante. - Andrés

Bien, lo tengo. ¡Gracias! - Chipre

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.