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

2 objetos String!

Estas en el tema de 2 objetos String! en el foro de Java en Foros del Web. Pues eso tengo la siguiente duda, segun la siguiente linea de codigo no deberia de ejecutarse el system.out.println ya que la sentencia deberia de ser ...
  #1 (permalink)  
Antiguo 08/12/2011, 11:33
 
Fecha de Ingreso: octubre-2011
Mensajes: 90
Antigüedad: 12 años, 6 meses
Puntos: 1
2 objetos String!

Pues eso tengo la siguiente duda, segun la siguiente linea de codigo no deberia de ejecutarse el system.out.println ya que la sentencia deberia de ser falsa, son 2 objetos distintos con la misma cadena, al utilizar el operador == deberia de dar falso, cosa distinta si utilizo equals, asi si deberia de dar verdadero, no entiendo entonces porque me da verdadero?,pongo a continuacion el codigo:

String n1 = "hola";
String n2 = "hola";
if (n1==n2) System.out.println("son iguales");
  #2 (permalink)  
Antiguo 08/12/2011, 12:14
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: 2 objetos String!

Las cadenas en Java son inmutables. Según tengo entendido, al crear un String, Java "reserva" ese String a un lado (en el heap) y lo deja ahi. Si creas un String con la misma cadena, Java no crea un objeto nuevo, sino que hace referencia al String que esta creado anteriormente en el heap.
  #3 (permalink)  
Antiguo 08/12/2011, 12:23
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: 2 objetos String!

Las String son una cosa extraña entre objeto y primitiva.

Cuando creas una String como "primitiva", java primero comprueba que no esté ya creada, si lo está la reutiliza.

Sin embargo si creas esa misma String de otra forma, para java es un objeto nuevo, y así lo identifica.

Prueba por ejemplo a comparar esa String con la misma leída desde un archivo de texto o la consola.

Ya sabes, lo correcto es siempre usar equals para comparar cadenas.
__________________
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 08/12/2011, 16:29
 
Fecha de Ingreso: octubre-2011
Mensajes: 90
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: 2 objetos String!

PUes si que es una cosa seria amigos, os explico si hago lo siguiente:

String n1 = new String("hola");
Strin n2 = new String("hola");
if (n1==n2) System.out.println("es cierto");

en este codigo si que da como resultado falso y no se imprime lo que hay en el if, creando los objetos si que no son iguales, ahora si los creas de forma implicita no funciona esa linea de codigo y te dice que es cierto porque compara las cadenas y no el objeto, en fin sera cuestion de java.
  #5 (permalink)  
Antiguo 09/12/2011, 02:22
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: 2 objetos String!

Ya lo he explicado, ahí no estás creando la String como "primitiva", sino como objeto.

Y es algo de lo que no te tienes que preocupar, ya que la forma correcta de comparar cadenas es con equals.
__________________
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.
  #6 (permalink)  
Antiguo 09/12/2011, 08:08
 
Fecha de Ingreso: octubre-2011
Mensajes: 90
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: 2 objetos String!

Amigo se que las comparaciones de cadenas tienen su metodo equals, cuando he escrito este post es por esa duda referente a los STrings, como bien dices y escribi al crear los objetos y compararlos con == da falso, si lo creas de forma implicita te da verdadero. Referente a lo que dices que cuando lo creas de forma implicita son primitivas y no objetos entonces vamos a tener que aprender de nuevo java o tendre que empezar a escribir cartas a profesores,libros y editoriales para corregir dicho error, sigo java desde videotutoriales, y libros que se venden en todo el mundo y en ellos siempre afirman que String no es primitivo, no existe primitivo para String, String es una clase y a su vez objeto que ayuda a trabajar con cadena, a ver si tengo un momento y te voy a hace un copy-paste de un libro en el que dice lo que yo escribi en el post pero supuestamente deberia de dar negativo y no es asi, no se si me explico.

En el libro ponen un ejemplo que al comparar 2 cadenas de forma implicita da negativo y he querido demostrar que eso es falso, cuando compara de forma implicita es positivo y compara las cadenas, he hecho varias comprobaciones de ello.

String n1="hola";
String n2= new String(2hola");
if (n1==n2) // aqui tambien da falso y supuestamente me dices estoy comparando un String objeto con String primitiva.

En fin lo que intento decir y hacer ver que si los libros,profesores y demas dicen que String no es primitivo que son puro objetos, poque lanza ese codigo?

Nada mas, por lo demas lo tengo bastante claro al comparar con equals, y hablo desde el punto de vista mas bien basico, porque jamas programe en java y es ahora que lo estoy haciendo.

solo da
  #7 (permalink)  
Antiguo 09/12/2011, 08:38
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: 2 objetos String!

En ningun momento se te dijo que String era o un primitivo o un objeto. Sino, que es un hibrido raro entre ambos por tener ese comportamiento. Los String deben ser siempre tratados como objetos para evitar inconvenientes al comparar.

Si les empiezas a decir a los estudiantes que puedes hacer:
String x = "hola";
String y = "hola";
if(x == y) //true
Entonces comenzaran las malas practicas y los inconvenientes tontos. Para evitar eso se debe siempre tratar como un objeto independientemente de su comportamiento extraño.
  #8 (permalink)  
Antiguo 09/12/2011, 09:09
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: 2 objetos String!

Cita:
eferente a lo que dices que cuando lo creas de forma implicita son primitivas y no objetos entonces vamos a tener que aprender de nuevo java o tendre que empezar a escribir cartas a profesores,libros y editoriales para corregir dicho error, sigo java desde videotutoriales, y libros que se venden en todo el mundo y en ellos siempre afirman que String no es primitivo, no existe primitivo para String, String es una clase y a su vez objeto que ayuda a trabajar con cadena, a ver si tengo un momento y te voy a hace un copy-paste de un libro en el que dice lo que yo escribi en el post pero supuestamente deberia de dar negativo y no es asi, no se si me explico.
Bla bla bla bla

Ya que estamos haciendo un concurso de egos, me pondré a tu nivel

Si te fijas, todas las veces que he puesto primitiva, lo he hecho con comillas. Eso es por algo (Opción c).

La forma de crear las String como String variable = "valor" se llama literal, no implícita. Lo de llamarlas "primitiva" fue por no confundirte con términos que seguramente no conocías.

Tal y como te había contado, cuando se crea una String de forma literal este pasa a la "piscina de strings", si creas una nueva referencia de forma literal a una cadena que ya está en la piscina, le asigna la misma posición de memoria, por eso con == sale como verdadera. Cuando la creas como objeto, como dice Ronruby, va al heap, y entonces la cadena de la "piscina" y la del heap ya no se consideran iguales.

Cita:
Iniciado por
String n1="hola";
String n2= new String(2hola");
if (n1==n2) // aqui tambien da falso y supuestamente me dices estoy comparando un String objeto con String primitiva.
Cita:
Iniciado por Yo
Sin embargo si creas esa misma String de otra forma, para java es un objeto nuevo, y así lo identifica.
Si hubieses tratado de entender lo que te explicaba, sabrías que evidentemente el resultado es falso. Porque está claro que un literal y un constructor, no son la misma forma.

http://www3.ntu.edu.sg/home/ehchua/p...3d_String.html

Así que ahórrate el hacerme copy-pastes, reescribir libros y hablar con profesores, que yo sí sé por qué pasa.

Y dudo mucho que hayas visto en ningún sitio que una comparación entre literales da falso, ya que precisamente es el problema de los que empiezan en java, sus primeras comparaciones son con literales y luego piensan que == es una forma válida de comparar Strings.

Disfruta de tu soberbia.
__________________
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.
  #9 (permalink)  
Antiguo 09/12/2011, 09:09
 
Fecha de Ingreso: octubre-2011
Mensajes: 90
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: 2 objetos String!

Ronruby amigo eso es lo que intento hacer ver, y creo que todavia no me habeis entendido, en el libro que tengo pone lo siguiente, te pongo el ejemplo detallado para que me entendais:

String InstanciaDeString = “El amigo de los osos”;
String Greenpeace = “El amigo de los osos”;
(InstanciaDeString == Greenpeace) -> falso

a esto me refiero esto es incorrecto, (InstanciaDeString==Greenpeace) da verdadero y no falso como dice el libro, espero ahora haberme explicado bien y porque el post que he escrito, si una persona aprende java y lee esto y despues demuestra que no es eso, esa persona no sabra si es una papa o es una coliflor, nada mas amigo, yo atraves de ejemplo saque mis conclusiones, pero ese soy yo hay personas que no indagan y luego tendran errores dificiles de detectar y mas cuando tú lees en un libro una explicacion como esta.
  #10 (permalink)  
Antiguo 09/12/2011, 09:22
 
Fecha de Ingreso: octubre-2011
Mensajes: 90
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: 2 objetos String!

Bueno amigo me dices que no hay ningun libro o que dudas de que exista, pues he puesto el ejemplo hace un rato y ahora te paso el nombre del libro, le echas un vistazo y luego me comentas.

JAVA atraves_de_ejemplos-Jesus Bobadilla

ahi tienes el libro en cuestion, y a lo que tu llamas String como variables y lo que yo entiendo perfectamente, tu lo llamas literal, en videotutoriales de Jesus conde y un monton de libros afirman y concluyen que lo que tu llamas Variable String es un STring declarado implicitamente, a mi no me lo digas y empiezes a darme clases de java diselo a los que escribieron esos libros y a Jesus Conde que creo a mi entender que es un gran profesor de programacion, tanto de java,c, c++,php et....., deberias de verte el videotutorial de String y me dirias si dice que los String son implicitos y explicito.

implicito : String n1 = " hola
explicito : String n1 = new String("hola")
en esos libros a nivel mundial en ningun momento he leido que sean variables o literales como tu bien dices, mas bien he leido lo que yo te estoy escribiendo.

Y desde aqui sin tener ni puñtera idea de lo que tu sabes solo intento corregir errores que pueden llegar a confusiones para demas compañeros, yo fui programador en cobol,pascal,gwbasic,etc....han pasado muchos años desde entonces igual tu ni habias nacido, intento hacer esto por hobby no porque trabaje en ello, y si puedo ayudar con errores como este lo hare, para ti como bien dices no es un error de transcripcion, para mi es un error de transcripcion, y un error en el aprendizaje del java para usuarios principiantes, nada mas amigo, solo se lo que se y si tu sabes mucho mas que yo pues mejor.
  #11 (permalink)  
Antiguo 09/12/2011, 11:21
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: 2 objetos String!

Cita:
a mi no me lo digas y empiezes a darme clases de java
Aquí el que ha empezado a querer dar clases a los demás has sido tú

Cita:
vamos a tener que aprender de nuevo java o tendre que empezar a escribir cartas a profesores,libros y editoriales para corregir dicho error
¿Lo recuerdas? Y no te estabas refiriendo al error real del libro, si no a que yo hablara de "primitivas"

Cita:
solo intento corregir errores que pueden llegar a confusiones para demas compañeros
Vuelve a leer tu contestación y reconoce que tu posible altruismo queda eclipsado por la forma en que me dices que no tengo ni puta idea.

Con lo de las denominaciones no me voy a extender, mucha gente tiene la manía de cambiarlas, pero el término implícito ahí no tiene sentido.

Según Sun

Cita:
A string literal consists of zero or more characters enclosed in double quotes. Each character may be represented by an escape sequence.

A string literal is always of type String (§4.3.3. A string literal always refers to the same instance (§4.3.1) of class String.
Además de que como puedes comprobar, dice claramente que dos literales de la misma cadena apuntan a una misma instancia (la que está en la "piscina"), por lo que lo esperado que ahí funcione ==.

¿Que tu libro dice que no? Pues lo dirá, pero está claro que es un error como cualquiera puede comprobar al ejecutar el código, y te hemos dicho desde un principio cómo funciona, sin entrar en lo que dice o no tu libro. El profesor será muy bueno, pero eso es un error de concepto, no una errata, y además fácilmente comprobable.vídeo de Perico de los palotes... no son argumentos.

Te voy a dar un consejo sobre argumentación, no recurras a cosas como que si sabes otros lenguajes, si tienes más años, si lo has visto en el tutorial o en el vídeo de Perico de los palotes, que si en un libro mundialísimo... no son argumentos, se llaman falacias.

En fin, yo paso ya de este tema.
__________________
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.
  #12 (permalink)  
Antiguo 09/12/2011, 11:33
 
Fecha de Ingreso: octubre-2011
Mensajes: 90
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: 2 objetos String!

Amigo en ningun momento he dejado en evidencia todo lo que sabes de este lenguaje de programacion y me parece perfecta la explicacion que me has dado, porque a mi personalmente me ha ayudado bastante, unicamente he querido dejar claro que compañeros de estos foros u otros no se dejen llevar por libros o videotutoriales porque como bien he comprobado tienen errores y para mi son errores graves porque desvarian todo el aprendizaje de java.

Si te has sentido ofendido por todo lo he escrito jamas lo he hecho para menospreciarte, todo lo contrario tu me dejaste claro un concepto que no es como dicen esos libros o demas como tu bién dices.

Referente a que fui programador, no lo escribi como recochineo ni nada por el estilo, lo hice para que comprendieras que referente a lenguajes como java soy principiante, no tiene nada que ver la programacion orientada a objetos con la estructurada que yo estudie hace como 21 años, asi que imaginate porque lo escribi, como bien te digo porque aunque tengo conocimientos que me ayudan mas que a otras personas en este lenguaje puedo perderme bastante.

Nada mas amigo, aqui no se trata de discusion ni de que yo se mas que tú, estoy bastante convencido de que eres una persona con muchos conocimientos de esto, me lo has demostrado al dejarme claro un concepto que puede despistar muchas personas empezando en esto.

De hecho por eso entre en estos foros, porque se que se aprende mucho mas que algunas veces leyendo libros y es lo que quiero.

De nuevo te dejo claro que jamas escribi esto para dejar en evidencia a nadie, todo lo contrario, me gusta que me ayuden y de yo intentar ayudar y eso intente desde el principio de este post, ayudar a los mas principiantes como yo con ese tipo de error. nada mas.

Gracias y un saludo.
  #13 (permalink)  
Antiguo 09/12/2011, 12:06
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: 2 objetos String!

Mi opinión es, que aun funcione hacer esto:
String x = "hola";
String y = "hola";
if(x == y) //true
Es que no se le debe decir a los principiantes. No es que sea un error, es que es mas fácil enseñarte a hacer las cosas correctas que enseñarte una mala maña que solo funciona aveces.

En fin, es mas fácil decirle a un principiante:
"Esto no se puede, NUNCA"
Que decirle:
"Esto se puede, pero aveces no se puede"

Obviamente la 2da forma causaría mas confusión que otra cosa y a la larga puede que una persona (ya cuando tenga mas experiencia) verifique que se puede, pero no se debe.

Si te enseñan desde un principio lo 2do, entonces al programar trataran de comparar cadenas de esa forma solo porque le dijeron que aveces se podía.

Lo que digan X cantidad de personas en internet, vale ... absolutamente nada.
  #14 (permalink)  
Antiguo 09/12/2011, 15:45
 
Fecha de Ingreso: octubre-2011
Mensajes: 90
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: 2 objetos String!

Totalmente de acuerdo en esto ultimo que has escrito, pero unicamente inicie este post por eso mismo, y de nuevo pido disculpa al compañero si penso que era otra cosa.

La explicacion que me dio me sirve, pero unicamente queria que me comprendiera al ver ese error, en fin como él dice no hay que darles mas vuelta a algo que ya esta aclarado, y espero que mas de una vez me ayude como lo hizo esta vez.

SALUDOS Y GRACIAS A TODOS.
  #15 (permalink)  
Antiguo 11/12/2011, 04:34
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 2 meses
Puntos: 78
Respuesta: 2 objetos String!

Cita:
Iniciado por Ronruby Ver Mensaje
Mi opinión es, que aun funcione hacer esto:
String x = "hola";
String y = "hola";
if(x == y) //true
Es que no se le debe decir a los principiantes.
Totalmente de acuerdo. A mi me trajo dolores de cabeza en su día.

Etiquetas: objetos, 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 22:10.