Como comparar dois objetos no java netbeans

Una de las preguntas más comunes en las entrevistas de trabajo donde nos postulamos como programador Java consiste en responder la diferencia entre comprar con == o equals en Java. Es que efectivamente es diferente en dependencia del tipo de datos que esta sujeto a la comparación. En esta entrada vamos a ver como funciona cada forma de comparar.

Tipos en Java

Los tipos de datos son el recurso de la programación que le dice a la variable o identificador lo que ella puede almacenar, contener. Existen dos categorías de tipos de datos principales: los primitivos y las clases, en alguna que otra bibliografía también incluyen los wrappers o contenedores, pero en esencia son clases de igual manera. Veamos cada uno:

Tipos primitivos: Son los tipos más básicos, se clasifican en númericos (enteros [byte, short, int, long] y de punto flotante [float, double]), de carácter [char] y lógico o booleano [boolean].

Tipos de datos estructurados, clases o contenedores: Son tipos que están compuestos por datos primitivos o por una combinación de ellos mismos propiamente, cuando se crea una instancia de este tipo de datos se conoce como objetos (en el paradigma orientado a objetos).

La principal diferencia desde el punto de vista del manejo interno de la JVM para los datos primitivos y clases, es la forma en como estos se almacenan en la memoria en tiempo de ejecución.

Los tipos primitivos persisten en un dirección de memoria, mientras las clases en lugar de estar en una dirección de memoria, puesto que son compuestos lo que tienen es en la dirección de memoria una referencia al objeto en sí.

Entonces mientras el dato primitivo esta directo en una dirección de memoria cada vez que lo cambiamos estamos accediendo directamente a él, mientras que el objeto lo hacemos a través de una referencia.

Los dos últimos párrafos son fundamentales para entender porque no todos los tipos pueden ser comparados de la misma forma.

Conceptos claves ==, .equals y hashcode

Operador ==: El operador de igualdad (==) en Java es un recurso que provee el lenguaje para comparar tipos; su funcionamiento es limitado a comparar valores dado sus identificadores, si los identificadores en la dirección de memoria tienen el mismo valor, será verdadero, en caso contrario false. Como los datos primitivos se almacenan en la dirección de memoria si ambos son el mismo valor entonces pueden compararse con este operador directamente.

Función .equals (Object o) : Todos los tipos de datos que creamos en Java, de forma intrínseca, aunque no lo pongamos heredan de la clase Object. Esta clase posee entre sus métodos equals(Object o), que posibilita hacer override para comparar el Object o pasado con el actual (this), la forma en que implementemos esta función determinará como se comparar los objetos.

Función .hashCode(): Es parte igual de Object, sirve para comparar objetos de una forma más rápida en estructuras Hash ya que únicamente nos devuelve un número entero. Cuando Java compara dos objetos en estructuras de tipo hash (HashMap etc) primero invoca al método hashcode y luego el equals. Si los métodos hashcode de cada objeto devuelven diferente hash no seguirá comparando y considerará a los objetos distintos. En el caso en el que ambos objetos compartan el mismo hashcode Java invocará al método equals() y revisará a detalle si se cumple la igualdad.

Los métodos .equals y .hashCode siempre deben implementarse de conjunto.

Ejemplo de .equals(Object o) y .hashCode()

El siguiente ejemplo muestra un ejemplo de implementación de los métodos para comparar dos objetos de la clase en cuestión:

public class IngredientInt { private MessagesKey messagesKey; private String name; public IngredientInt() { } public IngredientInt(MessagesKey messagesKey, String name) { this.messagesKey = messagesKey; this.name = name; } public MessagesKey getMessagesKey() { return messagesKey; } public void setMessagesKey(MessagesKey messagesKey) { this.messagesKey = messagesKey; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; IngredientInt that = (IngredientInt) o; return messagesKey == that.messagesKey && name.equals(that.name); } @Override public int hashCode() { return Objects.hash(messagesKey, name); } }

Comparación sobre conjuntos (Set) en Java

Los Java existe el tipo Set que permite la representación de conjuntos, que no permiten tipos duplicados, resulta interesante saber la relación entre los tipos Set y el método .equals(Object o).

Cuando creamos un objeto de tipo Set<T> y comenzamos a añadir elementos, el valor del tipo T indicará la forma en que se compararan los elementos sobre el tipo Set para saber si son iguales y se deben añadir o sino se añaden por ser duplicados.

Cuando en Set<T>, el tipo T es primitivo, internamente se comparará con el operador ==, en cambio cuando el tipo T es una clase o compuesto, entonces se invocará a equals(Object o), esto es muy importante tenerlo en cuenta.

Siempre que vamos a crear un conjunto de un tipo de clase, tenemos que implementar .equals(Object o) para esperar resultados correctos y evitar duplicados.

Espero te haya sido útil este artículo, si fue así puedes invitarme un café.

O resultado da comparacão de objetos é feito através dos métodos hashCode() e equals(), da classe Object. Logo, para fazer a comparação do seu jeito você deve sobreescrever esses os métodos em sua classe Produto.

Criando uma classe Produto ao meu gosto (já que você não disse os nomes dos atributos), ficaria algo assim:

Produto

public class Produto { int idProduto; String nomeProduto; //getters and setters @Override public int hashCode() { //deve ser o mesmo resultado para um mesmo objeto, não pode ser aleatório return this.idProduto; } @Override public boolean equals(Object obj) { //se nao forem objetos da mesma classe sao objetos diferentes if(!(obj instanceof Produto)) return false; //se forem o mesmo objeto, retorna true if(obj == this) return true; // aqui o cast é seguro por causa do teste feito acima Produto produto = (Produto) obj; //aqui você compara a seu gosto, o ideal é comparar atributo por atributo return this.idProduto == produto.getIdProduto() && this.nomeProduto.equals(produto.getNomeProduto()); } }

O método hashCode é usado para agilizar a busca em Collections, e sempre deve retornar um mesmo valor para um mesmo objeto, no caso acima preferi fazer o método retornar o idProduto pois se o idProduto for diferente nem adiante ir para o equals(), pois certamente ele retornará falso.

Quando você começar a trabalhar com objetos em Java, você achar que você pode usar == e != para comparar objetos uns com os outros. Por exemplo, um botão que você vê na tela do computador é um objeto. Você pode perguntar se a coisa que foi apenas mouse clicado um botão especial na sua tela. Você pode fazer isso com o operador de igualdade de Java.

if (e.getSource () == bcopy) {Clipboard.SetText (which.getText ()) -

A grande pegadinha com o esquema de comparação de Java vem quando você comparar dois strings. Quando você compara duas cadeias de uns com os outros, você não quer usar o sinal de igual duplo. Usando o sinal de igual duplo perguntava: “É este cadeia armazenada em exatamente o mesmo lugar na memória como aquela outra corda?” Normalmente, não é isso que você quer perguntar.

Em vez disso, você geralmente deseja perguntar: “Será que esta cadeia tem os mesmos personagens nele como aquela outra corda?” Para pedir a segunda questão (a pergunta mais apropriada) Java de Corda tipo tem um método chamado é igual a. (Como tudo no universo conhecido, este é igual a método é definido na API do Java, abreviação de Application Programming Interface).

o é igual a método compara duas strings para ver se eles têm os mesmos personagens neles. Para um exemplo usando Java de é igual a método, consulte esta lista de códigos. (A figura mostra um funcionamento do programa na listagem.)

Video: Comparando Objetos String java

importação java.lang.System estática. * - import classe java.util.Scanner-pública CheckPassword {void main (args String []) public static {out.print ("Qual é a senha? ") Teclado -Especificações do Scanner = new Scanner (in) -String password = keyboard.next () - out.println ("você digitou gt; gt;" + Senha + "lt; lt;") -out.println () - se (password == "peixe-espada") {Out.println ("A palavra digitada é armazenada") -out.println ("no mesmo lugar como o verdadeiro") -out.println ("senha. Você deve ser um") -out.println ("hacker.") -} else {out.println ("A palavra que você digitou não é") -out.println ("armazenados no mesmo lugar como") -out.println ("a senha real, mas isso é") -out.println ("nada demais.") -} out.println () - if (password.equals ("peixe-espada")) {Out.println ("A palavra digitada tem a") -out.println ("mesmos caracteres que o real") -out.println ("senha. Você pode usar nosso") -out.println ("sistema precioso.") -} else {out.println ("A palavra que você digitou não") -out.println ("têm os mesmos caracteres que") -out.println ("a senha real. Você não pode") -out.println ("use nosso sistema precioso.") -} keyboard.close () -}}

No perfil, a chamada keyboard.next () agarra qualquer palavra que o usuário digita no teclado do computador. O código empurra esta palavra na variável chamada senha. Em seguida, o programa E se declarações utilizar duas técnicas diferentes para comparar senha com "peixe-espada".

Como comparar dois objetos no java netbeans

Os resultados do uso == e usando Java do método é igual.



Os exemplos no livro impresso está baseada em texto, mas você pode encontrar versões mais extravagantes da maioria dos exemplos de Bobos local na rede Internet. Estas versões mais extravagantes têm janelas, botões, campos de texto e outros elementos de um típico Interface gráfica do usuário (GUI).

O mais apropriado das duas técnicas usa Java de é igual a método. o é igual a método parece engraçado porque quando você chamá-lo, você coloca um ponto depois de uma corda e colocar a outra corda entre parênteses. Mas essa é a maneira que você tem que fazer isso.

Ao chamar Java do é igual a método, não importa que a corda fica o ponto e que recebe os parênteses. Por exemplo, no perfil, você poderia ter escrito

E se ("peixe-espada".equals (password))

O método iria funcionar tão bem.

Uma chamada para Java do é igual a método parece desequilibrada, mas não é. Há uma razão por trás da aparente desequilíbrio entre o ponto e os parênteses. A idéia é que você tem dois objetos: o senha e o objeto "peixe-espada" objeto.

Cada um desses dois objetos é do tipo Corda. (Contudo, senha é uma variável do tipo Corda, e "peixe-espada" é um Corda literal.) Quando você escreve password.equals ( “peixe-espada”), você está chamando um é igual a método que pertence ao objeto senha. Quando você chamar esse método, você está alimentando "peixe-espada" para o método como parâmetro do método (trocadilho intencional).

Video: Tutorial 25 Java NetBeans - Ordenar objetos List, ArrayList, LinkedList

Ao comparar cadeias de uns com os outros, use o é igual a Método - e não o sinal de igual duplo.