style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Me repite valores de objeto.

Hola les cuento, que tengo que llenar una lista de objetos pero al pesarle el valor del objeto a la lista me repite el mismo
para todos. acá pongo el código y lo platico para que puedan entender mas.

he probado agregando el usernew = new user(); dentro del for algo asi

for(int i=0; i<=10; i++){
   usernew = new user();

el problema de esto es que crea cada que entra una instancia, este solo es un ejemplo porque en realidad manejo mas de medio millon de registros y cuando hago lo que anteriormente comentaba, me aparece un error de memoria en java OutOfMemoryError. el problema se resuelve si lo saco del for pero me deja el mismo valor.

public static void main (String args[]){
                user usernew;
                List listTablaFlujo = new ArrayList();
                usernew = new user();
               
                for(int i=0; i<=10; i++){
                       
                        usernew.setAnio("a"+i+"s");
                        listTablaFlujo.add(usernew);
                        usernew = null;
                }
               
                Iterator it = listTablaFlujo.iterator();
                user us;
             while(it.hasNext()){
                  us = (user) it.next();
                        System.out.println("valor de=="+us.getAnio());
             }
               
               
        }

resultado de la consola.
valor de==a10s
valor de==a10s
valor de==a10s
valor de==a10s
valor de==a10s

espero puedan darme una mano, saludos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de julgo

estas guardando el mismo

estas guardando el mismo objeto usernew por eso se repite la propiedad anio para todos.
podrias guardar la propiedad anio en el list y ya no guardas el objeto.
y no hagas ciclos tan grandes para crear objetos por la memoria que se te acaba ,guarda una parte y continuas .

public static void main (String args[]){
                 user usernew;
                 List listTablaFlujo = new ArrayList();
                 usernew = new user();
                 
                 for(int i=0; i<=10; i++){
                         
                         usernew.setAnio("a"+i+"s");
                     //    listTablaFlujo.add(usernew);
               listTablaFlujo.add(usernew.getAnio());
//no le pongas null
                        // usernew = null;
                 }
               
                 Iterator it = listTablaFlujo.iterator();
           //el recorrido cambia
              while(it.hasNext()){
             
                         System.out.println("valor de=="+it.next());
              }
                 
                 
         }

Hola julgo

Hola julgo

Gracias por responder, el problema que tengo es que necesito guardar en la lista un objeto en cada espacio de la lista (no solo la propiedad del objeto) el cual contiene aprox 13 propiedades distintas al anio (nombe.apellido, edad, etc), es por eso que creaba un objeto en cada ciclo de for para no repetir el valor, pero al realizar aprox 20 mil objetos la memoria termina.
he probado invocar al GC System.gc() pero sigo con el problema de la memoria.

 for(int i=0; i<=10; i++){
                       
                        usernew.setAnio("a"+i+"s");
                        listTablaFlujo.add(usernew);
                        usernew = null;
                        System.gc();
                }

no hagas ciclos tan grandes para crear objetos por la memoria que se te acaba ,guarda una parte y continuas .

como me sugieres que haga esta parte tomando en cuenta que son registros de mas de 200 personas.

gracias

Imagen de neko069

Para tu último ciclo

Para lo último que acabas de ejemplificar:

 for(int i=0; i<=10; i++){
                       User u = new User(); //la declaracion de objetos va en Mayuscula
                        u.setAnio("a"+i+"s");
                        u.setPropiedad2(otra propiedad);
                        //... todo lo que vayas a darle set a tu objeto u
                        listTablaFlujo.add(u);
}

Y ya, no veo porqué invocar al GC si la creación de tus objetos la haces desde dentro del ciclo, así cada iteración te crea un objeto nuevo.

Hola neko069 Gracias por el

Hola neko069

Gracias por el comentario, así como ejemplificas el for es como actualmente se encuentra en producción pero el problema viene cuando creo mas de 50 mil objetos me arroja un error de memoria OutOfMemoryError .

como ya comente antes el problema viene al crear demasiados objetos para agregarlos a la lista, una cosa que no mencione y podría ser importante es que trabajo con WebSphere 6.0 y con JDK 1.4. ya que es una aplicación web que tiene tiempo de creada.

gracias

Imagen de julgo

se me ocurren varias maneras

se me ocurren varias maneras una simple por ejemplo un for dentro de otro for que dividen los 50000 en 5 partes no se como estas trabajando pero tampoco voy a estar puliéndome en los detalles prueba y comentas

    public static void main (String args[]){
               user usernew;
                  List listTablaFlujo = new ArrayList();
                  usernew = new user();
                 
                  for(int j=0;j<5;j++){
                     
                  for(int i=0; i<=10000; i++){
                          usernew = new user();
                          usernew.setAnio("a"+i+"s");
                    //llenar los otros setters q son como 13
         
                listTablaFlujo.add(usernew);
//no le pongas null
                         // usernew = null;
                  }
                  //muestro los mil elementos
                    System.out.println(listTablaFlujo.size());
                   
         //llenar x ejemplo una tabla de base de datos eso ya lo creas tu
             //vaciar lista      
                  listTablaFlujo.clear();
     
                  }
         
         }
 

Lo he probado

julgo de echo ya habia probado esa manera de dividirlo en partes, pero al llegar a los 20000 me lanza el mismo error sin importar que invoque al GB al terminar el segundo for.

 for(int j=0;j<5;j++){
                     
                  for(int i=0; i<=10000; i++){
                          usernew = new user();
                          usernew.setAnio("a"+i+"s");
                      listTablaFlujo.add(usernew);

                         // usernew = null;
                  }
   System.gc();
}

comentas que se te ocurren varias maneras cual seria otra?

gracias por el apoyo

Imagen de julgo

pero has probado con el

pero has probado con el código que puse donde primero guardo los datos y después vacio la lista.
estas manteniendo los objetos vivos de alguna manera

Imagen de julgo

ese ultimo código que

ese ultimo código que publicas invoca al recolector pero sigues usando la lista con lo cual crece y crece y sigue manteniendo los objetos dentro de ella

Si lo probe

julgo lo he probado sin el gc pero la parte de que limpie la lista cada que termina un ciclo de 1000 por ejemplo, no creo que sea posible porque al final cuando tenga el total tengo que pasarlo a un archivo en excel y después el navegador me dirá si quiero abrirlo o guardarlo (es una aplicación web jsp).

pensaba tal vez en lugar de guardarlo en una tabla (porque no me dejaran hacerlo) y si fuera posible porque no he revisado aun irlo guardando en un excel que este en el disco y después al terminar todo llamar al excel y que el navegador me permita descargarlo. (es solo una idea)

como ves julgo? o que harías tu?

muchas gracias por comentar pasa que ya he sacado muchos bugs de esa aplicación XD.

Imagen de julgo

asi como dices ir guardándolo

asi como dices ir guardándolo en el Excel y al final si no quieres usarlo mas pues lo puedes eliminar , pero no te olvides de vaciar siempre la lista , prueba si no lo has hecho con tu forma .

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">