Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Pablo Videla en 18 Enero 2012, 19:35 pm



Título: Consulta sobre los map JAVA
Publicado por: Pablo Videla en 18 Enero 2012, 19:35 pm
La cosa es que tengo el siguiente metodo en java
Código
  1.  public String getJson() throws JSONException {
  2.  
  3.        JSONArray eventos = new JSONArray();
  4.        Date fecha = new Date();
  5.        JSONObject json = new JSONObject();
  6.    //    JSONObject jsondos = new JSONObject();
  7.        json.put("title", "prueba desde MB 1");
  8.        json.put("start", fecha.toGMTString());//"2012"+"-"+fecha.getMonth()+1+"-"+fecha.getDay()+1
  9.  
  10.        eventos.put(json);
  11.  
  12.        json.clearAll();
  13.  
  14.        json.put("title", "Otro objeto");
  15.        json.put("start", fecha.toGMTString());
  16.        eventos.put(json);
  17.      //  json.clearAll();
  18.        System.out.println("Desde JSON : " + eventos.toString());
  19.  
  20.        return eventos.toString();
  21.    }

La pregunta es porque al borrar todo del map no lo ingresa al otro map siendo que lo ingrese primero y despues elimine los objetos del primer map, no debio haberlos guardado primero y despues eliminado, pero no pasa esto, se borran todos.

Si lo hago con un ArrayList, estoy seguro que funcionaría pero mi pregunta es, porque no funciona con un map?


Título: Re: Consulta sobre los map JAVA
Publicado por: Proteus1989 en 19 Enero 2012, 00:48 am
No se exactamente lo que preguntas pero lo que he visto es que el objeto json que insertas en evento es el mismo 2 veces.
Recuerda que java es todo dinámico. Lo que estás pasandole a eventos cuando haces eventos.put(json) es lo un puntero al objeto.

No se si esa era tu duda porque la verdad es que no se cual es el map en ese código... No se como funcionará internamente JSONArray.


Título: Re: Consulta sobre los map JAVA
Publicado por: Pablo Videla en 19 Enero 2012, 14:56 pm
No se exactamente lo que preguntas pero lo que he visto es que el objeto json que insertas en evento es el mismo 2 veces.
Recuerda que java es todo dinámico. Lo que estás pasandole a eventos cuando haces eventos.put(json) es lo un puntero al objeto.

No se si esa era tu duda porque la verdad es que no se cual es el map en ese código... No se como funcionará internamente JSONArray.

Mi pregunta es porque al insertar el objeto ya creado y despues lo elimino despues de insertar, se borra completamente en donde lo inserte.

Debio haberse borrado solo el primer objeto, no donde lo inserte nuevamente.


Título: Re: Consulta sobre los map JAVA
Publicado por: Proteus1989 en 19 Enero 2012, 15:32 pm
Pues eso es exactamente lo que te he explicado antes. En java TODO ES DINAMICO y funciona con punteros.

Cuando te creas el json te creas una zona de memoria referenciada por un puntero (llamado json). Cuando tu haces eventos.put(json) no haces una copia de esa memoria y se guarda dentro de eventos, sino que eventos lo único que guarda es el puntero que apunta a esa zona de memoria que creastes en un principio. Por eso cuando haces el json.clearAll() afecta directamente al eventos.

Lo que en realidad estás haciendo es guardar dos punteros que apuntan a la misma zona de memoria.
Para arreglarlo en lugar de json.clearAll(); haz un json = new JSONObject();


Saludos y lo siento si no me he explicado bien


Título: Re: Consulta sobre los map JAVA
Publicado por: Pablo Videla en 19 Enero 2012, 15:57 pm
Pues eso es exactamente lo que te he explicado antes. En java TODO ES DINAMICO y funciona con punteros.

Cuando te creas el json te creas una zona de memoria referenciada por un puntero (llamado json). Cuando tu haces eventos.put(json) no haces una copia de esa memoria y se guarda dentro de eventos, sino que eventos lo único que guarda es el puntero que apunta a esa zona de memoria que creastes en un principio. Por eso cuando haces el json.clearAll() afecta directamente al eventos.

Lo que en realidad estás haciendo es guardar dos punteros que apuntan a la misma zona de memoria.
Para arreglarlo en lugar de json.clearAll(); haz un json = new JSONObject();


Saludos y lo siento si no me he explicado bien

De hecho asi lo habìa solucionado, te explicaste a la perfección gracias por tu respuesta, no encontre otra solucion xD
Saludos!