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

ahora no entiendo == equals

Estas en el tema de ahora no entiendo == equals en el foro de Java en Foros del Web. hola bueno.... estaba viendo lo de comparar, valores de tipo primitivo con objetos... que objetos siempre deben compararse con equals() INTEGER , STRING, son objetos, ...
  #1 (permalink)  
Antiguo 27/03/2014, 13:07
 
Fecha de Ingreso: febrero-2013
Ubicación: en mi casa
Mensajes: 541
Antigüedad: 11 años, 2 meses
Puntos: 3
ahora no entiendo == equals

hola bueno....

estaba viendo lo de comparar, valores de tipo primitivo con objetos...

que objetos siempre deben compararse con equals()

INTEGER , STRING, son objetos, no ?....

y por lo tanto deberian compararse con equals();
en el caso de que los compare con el "=="

compararia la direccion de memoria a donde apunta, en java creo que no se puede manejar la direccion de memoria como puntero. osea comparo. a un lugar de memoria donde hace referencia...

pero en este ejemplo me confunde todo...

ya que le asigna el misma valor a 2 objetos distintos.. y al compararlos con "=="
da que son iguales...


Código PHP:
public class Equivalencia4 {
   public static 
void main(String[] args) {
     
Integer n1 47;
     
Integer n2 47;
     
Integer n3 = new Integer(47);
  
     
System.out.println("n1==n2: "+(n1 == n2));
     
System.out.println("n1!=n2: "+(n1 != n2));
     
System.out.println("n1.equals(n2): "+n1.equals(n2));
     
System.out.println("n1==n3: "+(n1 == n3));
     
System.out.println("n1.equals(n3): "+n1.equals(n3));
 
     
String s1 "Hola";
     
String s2 "Hola";
 
     
System.out.println("s1==s2: "+(s1 == s2));
     
System.out.println("s1!=s2: "+(s1 != s2));
     
System.out.println("s1.equals(s2): "+s1.equals(s2));
   }

despues explica con algo como esto...
Cita:
Cuando creamos n1 y le damos el valor 47, este valor se guarda en memoria (en la pila). Al crear una nueva variable con valor 47, en lugar de almacenar este valor en memoria, como ya existe, n2 apuntará al valor 47 que está en la pila. Entonces tenemos n1 y n2 apuntando a 47. Lo mismo ocurriría con s1 y s2. Por este motivo, en este ejemplo, las comparaciones tienen el mismo comportamiento para == (referencias) y equals() (valores). Sin embargo, si damos un nuevo valor a n1, n2, s1 o s2, las variables ya no apuntarán al mismo valor y serán de este modo diferentes, tanto para == como para equals(). Si nos fijamos en la variable n3, se crea con new Integer(47), si la comparamos con n1 o n2 el resultado es el siguiente: con == el resultado sería false, ya que al crear un nuevo objeto con new, se le asigna un nuevo espacio de memoria (en el cúmulo), por tanto no apuntaría al valor 47 de la pila, sin embargo, con equals() el comportamiento es el esperado ya que se comparan los valores y estos son iguales. Para recordar dónde se almacena cada tipo de variable, puedes repasar el Tema 2, el apartado Los lugares de almacenamiento.

es raro----
  #2 (permalink)  
Antiguo 27/03/2014, 14:55
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: ahora no entiendo == equals

Hola:

El concepto general es correcto, == compara que dos objetos sean el mismo (misma zona de memoria) y equals(), que cada objeto puede definir a su gusto para saber si dos objetos distintos representan lo mismo o no.

El problema que planteas se debe al compilador. El compilador de java es listo y optimiza el código al compilarlo. Si tienes dos objetos Integer de valor 47 declarados de una forma tan inmediata (Integer a = 47;) el compilador creará un únicoi objeto y lo reutilizará para los.

En este enlace http://blog.chuidiang.com/2010/06/30...sidad-en-java/ tienes una curiosidad justo con los Integer que puede dar resultados sorprendentes.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 28/03/2014, 07:21
 
Fecha de Ingreso: febrero-2013
Ubicación: en mi casa
Mensajes: 541
Antigüedad: 11 años, 2 meses
Puntos: 3
Respuesta: ahora no entiendo == equals

si pero esto, puede resultar confuso, es como de "1 en un millon", no deberia usarse, o por lo menos ahora creo saber lo que sucede...
me decis.. "misma zona de memoria"
que esto ocurre cuando "se declaran inmediatamente"...

es raro la verdad...:
hasta antes de saber esto...
venia bien claro con que los primitivos se comparaban con "=="
y los objetos. propiedades de objetos (instancias de una clase propia)
deben compararse con equals...

pero bueno, voy a leer bien, aunque no deberia, ser algo de tanta importancia...


otra cosa....


-----------------------------------------

esto me imprime "iguales"
no era que no se podia comparar, objetos con datos de tipo primitivo...

Código PHP:
public class uo {
   public static 
void main(String[] args) {
     
Integer n1 47;
     
int n2=47;
     
     
     if(
n1==n2){
         
System.out.println("iguales");
     }else{
         
System.out.println("nooo");
     } 
al menos JAVA, deberia tirar un error, ya que es tan ESTRICTO...

Última edición por aldo_rengo; 28/03/2014 a las 08:08
  #4 (permalink)  
Antiguo 28/03/2014, 09:15
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: ahora no entiendo == equals

Hola:

con "inmediatamente" quiero decir una forma en que el compilador sea capaz de saber automaticamente el resultado, para poder optimizar, no me refiero a que vayan seguidas. El concepto es el que tenias, equals() para saber si son objetos iguales, == para saber si ocupan la misma memoria. La optimización del compilador puede hacer que == de true cuando aparentemente no debería darlo, pero sí es true porque el compilador se ha encargado de que esos objetos usen la misma memoria.

En cuanto a la segunda pregunta, el compilador de java sabe convertir automáticamente entre int e Integer (y entre float y Float, double y Double, etc). Si comparas con == un int con un Integer, el compilador convertira uno de los tipos al otro automáticamente para hacer la comparación y por el mismo motivo de antes, te dará true.

Estoy de acuerdo contigo en que un momento dado puede resultar confuso. Esta conversión automática se ha hecho para facilitar la vida al programador de forma que no tenga que crear explicitamente un Integer y pueda simplemente poner un valor o un int. Sin estas conversión automática, líneas como esta que pusiste en tu primer ejemplo

Integer n1 = 47;

simplemente no debería compilar y la única opción válida sería

Integer n1 = new Integer(47);

que es más engorrosa.


Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 28/03/2014, 11:25
 
Fecha de Ingreso: febrero-2013
Ubicación: en mi casa
Mensajes: 541
Antigüedad: 11 años, 2 meses
Puntos: 3
Respuesta: ahora no entiendo == equals

Cita:
Iniciado por chuidiang Ver Mensaje
En cuanto a la segunda pregunta, el compilador de java sabe convertir automáticamente entre int e Integer (y entre float y Float, double y Double, etc). Si comparas con == un int con un Integer, el compilador convertira uno de los tipos al otro automáticamente para hacer la comparación y por el mismo motivo de antes, te dará true.
No deberia, aunque bueno podria decirse que es inteligente el compilador.
pero me hace acordar a PHP, que "vale todo" entre tipos de datos...

si, uso eclipse como IDE., y detecta al toque los errores...
  #6 (permalink)  
Antiguo 28/03/2014, 22:50
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 4 meses
Puntos: 57
Respuesta: ahora no entiendo == equals

Al comparar 2 variables de tipo Integer no importa si ocupan el mismo espacio de memoria. Existen un tipo de clases que lo que hacen es enmascarar un dato de tipo primitivo, se llaman Wrapper classes. Lo que hace el compilador con estas clases es convertir una variable Integer en int o viceversa. Por ejemplo puedes comparar una variable int con una variable Integer y el resultado es el esperado al utilizar == (se compara el valor numerico, no su posicion en memoria)
Este proceso se llama autoboxing y unboxing http://docs.oracle.com/javase/tutori...utoboxing.html

Un compilador no podria optimizar un codigo en donde el valor de la variable se pida al usuario (es imposible que el compilador sepa que valor escribira el usuario). Con este codigo se obtiene el mismo resultado que tu obtienes en tu codigo, pero aqui uno de los valores se pide al usuario

Código Java:
Ver original
  1. import java.util.Scanner;
  2.  
  3. public class Prueba {
  4.     public static void main(String []args) {
  5.         int entero1 = 50;
  6.         Integer entero2 = 50;
  7.         System.out.println("entero1 == entero2: " + (entero1==entero2));  //se comparan variables de diferente tipo
  8.        
  9.         Scanner in = new Scanner(System.in);
  10.         int entero3 = in.nextInt();
  11.         System.out.println("entero2 == entero3: " + (entero2==entero3));
  12.     }
  13. }
  #7 (permalink)  
Antiguo 31/03/2014, 09:16
 
Fecha de Ingreso: febrero-2013
Ubicación: en mi casa
Mensajes: 541
Antigüedad: 11 años, 2 meses
Puntos: 3
Respuesta: ahora no entiendo == equals

Cita:
Iniciado por posman Ver Mensaje
Al comparar 2 variables de tipo Integer no importa si ocupan el mismo espacio de memoria. Existen un tipo de clases que lo que hacen es enmascarar un dato de tipo primitivo, se llaman Wrapper classes. Lo que hace el compilador con estas clases es convertir una variable Integer en int o viceversa. Por ejemplo puedes comparar una variable int con una variable Integer y el resultado es el esperado al utilizar == (se compara el valor numerico, no su posicion en memoria)
Este proceso se llama autoboxing y unboxing http://docs.oracle.com/javase/tutori...utoboxing.html
mmm... bueno, ahora no se en que momento,
comparando 2 int o integer, da false, por ocupar 2 espacios de memoria diferente.
ya me mareo. un poco.---
aparte creo que en java no se puede saber, la direccion de memoria, ya que no trabaja con punteros este lenguaje...
  #8 (permalink)  
Antiguo 31/03/2014, 09:29
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: ahora no entiendo == equals

Es fácil, cuando quieras comparar recuerda esto:

Objetos => Usa equals()
tipos primitivos => Usa ==

Si intentas usar equals con un tipo primitivo, un ide como eclipse o netbeans te debería advertir que no es posible.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #9 (permalink)  
Antiguo 31/03/2014, 11:42
 
Fecha de Ingreso: febrero-2013
Ubicación: en mi casa
Mensajes: 541
Antigüedad: 11 años, 2 meses
Puntos: 3
Respuesta: ahora no entiendo == equals

bueno pero mira...
TENGO BIEN CLARO que si son objetos debo usar, EQUALS()
y si son primitivos uso. ==.

pero este ejemplo esta complicado...

Código Java:
Ver original
  1. public class uo {
  2.    public static void main(String[] args) {
  3.        
  4.      
  5.        String cadena1 = new String("Hola");
  6.        String cadena2 = new String("Hola");
  7.        if (cadena1 == cadena2)
  8.        {
  9.         System.out.println("iguales");
  10.        }else{
  11.            System.out.println("distintos");
  12.        }
  13.        
  14.        System.out.println("----------------------------");
  15.        
  16.        preguntas2 hh=new preguntas2();
  17.        hh.set_frase("Hoy es jueves y llueve");
  18.        
  19.        
  20.        preguntas2 hh3=new preguntas2();
  21.        hh3.set_frase("Hoy es jueves y llueve");
  22.        
  23.        if(hh3.get_frase()==hh.get_frase()){
  24.            System.out.println("son iguales");
  25.            
  26.        }else{
  27.            
  28.            System.out.println("no se puede comparar...");
  29.        }  
  30.        
  31. }
  32. }

esta es la clase que genera una instancia....

NO TIENE STATIC LA PROPIEDAD FRASE

Código Java:
Ver original
  1. public class preguntas2 {
  2.  
  3.     public  String frase;
  4.    
  5.     public preguntas2(){}
  6.    
  7.    
  8.     public void set_frase(String contenido){
  9.         frase=contenido;
  10.     }
  11.    
  12.     public String get_frase(){
  13.         return frase;
  14.     }
  15.    
  16. }

Última edición por aldo_rengo; 31/03/2014 a las 13:14

Etiquetas: string, valor, variable
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 13:31.