Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] ¿Para que sirve este comando de java "intern()?

Estas en el tema de ¿Para que sirve este comando de java "intern()? en el foro de Java en Foros del Web. ¿Para que sirve este comando de java "intern()? Estoy viendo Strings, pero no entendi esta parte...
  #1 (permalink)  
Antiguo 31/10/2013, 11:50
 
Fecha de Ingreso: noviembre-2012
Ubicación: en casa
Mensajes: 150
Antigüedad: 11 años, 5 meses
Puntos: 1
¿Para que sirve este comando de java "intern()?

¿Para que sirve este comando de java "intern()?
Estoy viendo Strings, pero no entendi esta parte
  #2 (permalink)  
Antiguo 31/10/2013, 12:51
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: ¿Para que sirve este comando de java "intern()?

Imagina que tienes dos String iguales así

Código Java:
Ver original
  1. String a = new String ("hola");
  2. String b = new String ("hola");
  3. System.out.println (a==b); // Devuelve false, son zonas de memoria distintas.
  4. System.out.println(a.equals(b));  // Devuelve true, ambas cadenas contienen lo mismo.

Los dos String contienen lo mismo, la cadena "hola", pero ocupan cada uno una zona distinta de memoria, ya que se han hecho dos news. Puesto que un String no se puede cambiar (String no tiene métodos para cambiar su contenido), es un desperdicio de memoria.

Para evitar esto, String mantiene dentro una lista de textos de forma que si el texto ya existe, te devuelve la zona de memoria de ese texto y si no existe, lo añade. La forma de añadirlo o obtener esta cadena almacenada es llamando al método intern(). El mismo ejemplo anterior

Código Java:
Ver original
  1. // Se crea la cadena "hola" y se registra en la clase String.
  2. String a = new String ("hola").intern();
  3.  
  4. // Se crea la cadena "hola" y como ya está registrada, intern() devuelve la que ya está
  5. // registrada.
  6. String b = new String ("hola").intern();
  7.  
  8. System.out.println (a==b); // Devuelve true, ahora las dos son la misma memoria.
  9. System.out.println(a.equals(b));  // Devuelve true, ambas cadenas contienen lo mismo, realmente son la misma zona de memoria.

Temporalmente, se reserva memoria dos veces, ya que se hacen dos new String("hola"), pero el segundo new lo recoge el recolector de basura, ya que no nos guardamos ninguna referencia a el. El segundo new String("hola").intern() nos devuelve el String que creamos en la primera línea y asignamos a la variable a.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 31/10/2013, 13:04
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: ¿Para que sirve este comando de java "intern()?

Es algo que nunca he tenido que utilizar y que implica aspectos bastante teóricos de java, pero ya que te has molestado en intentar entenderlo voy a dar mi interpretación aunque puedo estar equivocado.

Las String son un tipo de dato extraño en java, pueden ser primitivas y objetos a la vez.

Además existe una zona de memoria especial llamado pool de Strings donde se guardan un tipo de Strings, los literales "esto es un literal". Un literal sólo existe existe una vez en el pool, por lo qe cada vez que "crees" ese literal de nuevo, estarás recuperándolo del pool.

Sin embargo, como también son objetos, si los creas mediante su constructor o (new String) o otras clases (StringBuilder) ese String estará en el heap, la zona de memoria reservada a todos los objetos.

¿Qué sucede si comparas el mismo String que esá en el pool con uno que está en el heap?

Si lo haces con == será falso, porque un objeto del pool y del heap son dos objetos distintos.

Si lo haces con equals, te dirá que son iguales, porque equals digamos que sólo se preocupa de que tengan las mismas letras.

¿Para que sirve entonces intern?

Pues si lo llamas desde un String del pool o desde un String del heap, siempre te devolverá un String del pool (si no existe lo crea)

¿Para qué sirve?

A mí no me ha hecho nunca falta, aunque me suena de haber leído en alguna de las librerías que suelo usar.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #4 (permalink)  
Antiguo 05/11/2013, 14:46
 
Fecha de Ingreso: noviembre-2012
Ubicación: en casa
Mensajes: 150
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: ¿Para que sirve este comando de java "intern()?

Cita:
Iniciado por chuidiang Ver Mensaje
Imagina que tienes dos String iguales así

Código Java:
Ver original
  1. String a = new String ("hola");
  2. String b = new String ("hola");
  3. System.out.println (a==b); // Devuelve false, son zonas de memoria distintas.
  4. System.out.println(a.equals(b));  // Devuelve true, ambas cadenas contienen lo mismo.

Los dos String contienen lo mismo, la cadena "hola", pero ocupan cada uno una zona distinta de memoria, ya que se han hecho dos news. Puesto que un String no se puede cambiar (String no tiene métodos para cambiar su contenido), es un desperdicio de memoria.

Para evitar esto, String mantiene dentro una lista de textos de forma que si el texto ya existe, te devuelve la zona de memoria de ese texto y si no existe, lo añade. La forma de añadirlo o obtener esta cadena almacenada es llamando al método intern(). El mismo ejemplo anterior

Código Java:
Ver original
  1. // Se crea la cadena "hola" y se registra en la clase String.
  2. String a = new String ("hola").intern();
  3.  
  4. // Se crea la cadena "hola" y como ya está registrada, intern() devuelve la que ya está
  5. // registrada.
  6. String b = new String ("hola").intern();
  7.  
  8. System.out.println (a==b); // Devuelve true, ahora las dos son la misma memoria.
  9. System.out.println(a.equals(b));  // Devuelve true, ambas cadenas contienen lo mismo, realmente son la misma zona de memoria.

Temporalmente, se reserva memoria dos veces, ya que se hacen dos new String("hola"), pero el segundo new lo recoge el recolector de basura, ya que no nos guardamos ninguna referencia a el. El segundo new String("hola").intern() nos devuelve el String que creamos en la primera línea y asignamos a la variable a.

Se bueno.
Por fin alguien que lo explica claramente
  #5 (permalink)  
Antiguo 06/11/2013, 06:37
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 2 meses
Puntos: 78
Respuesta: ¿Para que sirve este comando de java "intern()?

La explicación de chuidiang mejor imposible. Yo lo desconocía, y se me hace difícil pensar en tener la necesidad de usarlo.

Saludos

Etiquetas: string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:19.