logo

Java에서 두 개체를 비교하는 방법

자바 객체 class는 모든 Java 클래스의 슈퍼 클래스입니다. 모든 Java 클래스는 기본적으로 Object 클래스를 구현합니다. Java Object 클래스는 두 가지 중요한 메소드를 제공합니다. 두 가지를 비교하다 자바의 객체 , 즉. 같음() 그리고 해시 코드() 방법. 이 섹션에서는 다음 방법을 알아봅니다. 같음() 그리고 해시 코드() 방법이 작동합니다. 이와 함께 우리는 또한 배울 것입니다 Java에서 두 객체를 비교하는 방법 적절한 예를 들어요.

Java는 객체를 비교하기 위해 Object 클래스의 두 가지 메소드를 제공합니다.

  • Java equals() 메소드
  • 자바 hashCode() 메서드

Java equals() 메소드

그만큼 같음() Object 클래스의 메소드는 두 객체의 동등성을 비교합니다. 동일한 메모리 주소를 공유하는 경우 두 개체는 동일합니다.

통사론:

 public boolean equals(Object obj) 

이 메서드는 참조 개체를 매개변수로 구문 분석합니다. 객체가 동일하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

객체가 다른 객체와 동일할 수도 있으며, 그런 다음 equals() 메서드는 다음을 따릅니다. 등가 관계 개체를 비교합니다.

    재귀적:만약에 엑스 null이 아닌 참조이며 다음을 호출합니다. x.같음(x) true를 반환해야 합니다.대칭:null이 아닌 두 참조가 다음과 같은 경우 엑스 그리고 y, x.equals(y) 돌아올 것이다 진실 만약에 그리고 만약에 y.같음(x) 반품 진실 .전이적:null이 아닌 세 개의 참조가 다음과 같은 경우 엑스, 와이 , 그리고 z, x.equals(z) 또한 돌아올 것이다 진실 만약에 x.equals(y ) 그리고 y.equals(z) 둘 다 반환 진실 .일관된:null이 아닌 두 참조가 다음과 같은 경우 엑스 그리고 그리고 , 다중 호출 x.같음(y) 지속적으로 true 또는 false를 반환합니다. 비교에 사용된 어떠한 정보도 제공하지 않습니다.
  • null이 아닌 참조의 경우 x, x.equals(널) 거짓을 반환합니다.

간단히 말해서, null이 아닌 참조에 대해서는 다음과 같이 말합니다. 엑스 그리고 그리고 , 두 참조가 모두 동일한 객체를 참조하는 경우에만 true를 반환합니다.

기억하다: equals() 메서드를 재정의할 때는 hashCode() 메서드도 재정의해야 합니다. 재정의는 동일한 객체가 동일한 해시 코드를 가져야 한다는 hashCode() 메서드의 규칙을 따릅니다.

자바에서 csv 파일 읽기

equals() 메소드의 예

다음 예에서는 다음을 만들었습니다. 건설자 ~의 더블 그리고 클래스를 생성하고 해당 값을 각각 객체에 저장된 인수로 전달합니다.

그 후 첫 번째 println 문에서 equals() 메서드를 호출하고 객체 y를 객체 x와 y를 비교하는 매개 변수로 구문 분석했습니다. 그것은 반환 거짓 x는 double 값을 보유하고 y는 같지 않은 long 값을 보유하기 때문입니다.

마찬가지로 두 번째 println 문에서는 equals() 메서드를 호출하고 Double 클래스의 생성자에서와 동일한 값을 구문 분석했습니다. 그것은 반환 진실 왜냐하면 double 클래스의 객체, 즉 x는 우리가 equals() 메소드에 전달한 것과 동일한 값을 보유하기 때문입니다.

ObjectComparisonExample.java

 public class ObjectComparisonExample { public static void main(String[] args) { //creating constructor of the Double class Double x = new Double(123.45555); //creating constructor of the Long class Long y = new Long(9887544); //invoking the equals() method System.out.println('Objects are not equal, hence it returns ' + x.equals(y)); System.out.println('Objects are equal, hence it returns ' + x.equals(123.45555)); } } 

산출:

 Objects are not equal, hence it returns false Objects are equal, hence it returns true 

== 연산자와 equals() 메서드의 차이점

~ 안에 자바 , == 연산자는 두 참조가 동일한지 여부를 비교합니다. 반면 같음() 메서드는 두 개체를 비교합니다.

객체는 동일한 동일한 상태를 가질 때(보통 변수를 비교하는 경우) 객체는 동일한 클래스 정체성을 공유할 때.

예를 들어, 다음 표현식은 obj1==obj2 평등이 아닌 정체성을 테스트합니다. 표현을 하면서 obj1.equals(obj2) 평등을 비교합니다.

자바 hashCode() 메서드

Java에서 해시 코드는 32비트 부호 있는 정수 값입니다. 에서 제공하는 고유 ID입니다. JVM Java 객체에. 각 Java 개체는 해시 코드와 연결됩니다. 해시 코드는 HashTable, HashSet 등과 같은 해시 기반 데이터 구조로 관리됩니다.

기억하다: equals() 메서드를 재정의할 때 hashCode() 메서드도 재정의해야 합니다.

통사론:

c 부울
 public int hashCode() 

각 인스턴스에 대해 고유한 개체의 무작위로 생성된 해시 코드 값을 반환합니다. 임의로 생성된 값은 프로그램을 여러 번 실행하는 동안 변경될 수 있습니다.

hashCode의 일반 계약은 다음과 같습니다.

  • 애플리케이션 실행 중에 hashCode() 메서드가 두 번 이상 호출되면 동일한 해시 코드(정수 값)를 일관되게 반환합니다. 개체를 수정하면 안 됩니다.
  • equals() 메서드에 따라 두 개체가 동일한 경우 이 두 개체에 대해 hashCode() 메서드를 호출하면 동일한 정수 값이 생성되어야 합니다.
  • 두 객체가 equals() 메서드에 따라 동일하지 않은 경우 이 두 객체에 대해 hashCode() 메서드를 호출하면 고유한 정수 값이 생성될 수 있습니다. 이는 두 개체에 대해 동일한 해시 코드를 생성할 수 있음을 의미합니다.

hashCode() 메소드의 예

다음 예에서는 두 개의 클래스를 만들었습니다. Employee.java 그리고 HashCodeExample.java .

Employee 클래스에서는 int 유형의 regno와 String 유형의 name이라는 두 개의 필드를 정의했습니다. 그런 다음 Employee 클래스의 생성자를 만들고 이 두 필드를 매개변수로 전달했습니다.

객체 비교를 수행하기 위해 이름이 별도의 클래스를 만들었습니다. 해시코드예 . 이 클래스에서는 Employee 클래스의 두 인스턴스를 만들었습니다. emp1 그리고 emp2 . 그런 다음 객체를 사용하여 hashCode() 메서드를 호출했습니다. 해시 코드 값을 변수에 저장했습니다. 그리고 , 각각.

Employee.java

 public class Employee { private int regno; private String name; //constructor of Employee class public Employee(int regno, String name) { this.name = name; this.regno = regno; } public int getRegno() { return regno; } public void setRegno(int Regno) { this.regno = regno; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

HashCodeExample.java

 public class HashcodeExample { public static void main(String[] args) { //creating two instances of the Employee class Employee emp1 = new Employee(918, 'Maria'); Employee emp2 = new Employee(918, 'Maria'); //invoking hashCode() method int a=emp1.hashCode(); int b=emp2.hashCode(); System.out.println('hashcode of emp1 = ' + a); System.out.println('hashcode of emp2 = ' + b); System.out.println('Comparing objects emp1 and emp2 = ' + emp1.equals(emp2)); } } 

산출:

자바 코드 예제
 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

equals() 메서드 재정의

자체 구현을 제공하려는 경우 다음과 같은 방법으로 equals() 메서드를 재정의할 수 있습니다.

 //overriding equals() method @Override public boolean equals(Object obj) { if (obj == null) return false; if (obj == this) return true; return this.getRegno() == ((Employee) obj). getRegno(); } 

위의 코드 조각은 두 직원이 동일한 메모리 주소에 저장되거나 동일한 regno를 갖는 경우 동일하다는 것을 보여줍니다. 위의 코드 조각으로 프로그램(HashCodeExample.java)을 실행하면 다음과 같은 출력을 얻습니다.

산출:

 hashcode of emp1 = 2032578917 hashcode of emp2 = 1531485190 Comparing objects emp1 and emp2 = true