.equals () 및 == 연산자로 두 개체 비교
String
필드 가 하나 인 클래스를 구성했습니다 . 그런 다음 두 개의 개체를 만들고 ==
연산자를 사용하여 비교해야합니다 .equals()
. 내가 한 일은 다음과 같다.
public class MyClass {
String a;
public MyClass(String ab) {
a = ab;
}
public boolean equals(Object object2) {
if(a == object2) {
return true;
}
else return false;
}
public boolean equals2(Object object2) {
if(a.equals(object2)) {
return true;
}
else return false;
}
public static void main(String[] args) {
MyClass object1 = new MyClass("test");
MyClass object2 = new MyClass("test");
object1.equals(object2);
System.out.println(object1.equals(object2));
object1.equals2(object2);
System.out.println(object1.equals2(object2));
}
}
두 번 거짓이 표시됩니다. 두 개체에 동일한 필드 ( "test")가 왜 그렇습니까?
==
객체 참조를 비교하여 두 피연산자가 동일한 객체를 가리키는 지 확인합니다 ( 동등한 object-가 아닌 동일한 object-).
동일한 문자가 포함되어 있는지 확인하기 위해 사용하여 비교해야합니다 equals
.
의 경우 귀하 MyClass
문자열이 일치 여부 하면의 두 인스턴스가 실제로 동일한 것으로 간주되면 다음과 같습니다.
public boolean equals(Object object2) {
return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}
...하지만 일반적으로 클래스를 정의하는 경우 단일 필드 ( a
이 경우) 의 동등성보다 동등성에 더 많은 것이 있습니다.
참고 : 재정의 경우 equals
거의 항상 재정이 필요합니다 . JavaDoc 에서 다음과 같이 사실 .hashCode
equals
일반적
hashCode
으로이 메서드가 재정의 될 때마다 메서드 를 재정의하는 것이 필요하다는 점에 유의하십시오. 메소드에 대한 일반 계약을hashCode
유지합니다.
당신은 같음 재정의해야합니다
public boolean equals (Object obj)
{
if (this==obj) return true;
if (this == null) return false;
if (this.getClass() != obj.getClass()) return false;
// Class name is Employ & have lastname
Employe emp = (Employee) obj ;
return this.lastname.equals(emp.getlastname());
}
을 equals2
호출하는 것처럼 보이 equals
처럼 동일한 결과를 제공합니다.
쓰기 쓰기 함수는 () 잘못되었습니다. "a"는 문자열 클래스 의 인스턴스 이고 "object2"는 MyClass 클래스 의 인스턴스입니다 . 클래스가 다르라고 대답은 "거짓"입니다.
귀하의 equals2()
방법은 항상 equals()
!!
내 의견과 함께 귀하의 코드 :
public boolean equals2(Object object2) { // equals2 method
if(a.equals(object2)) { // if equals() method returns true
return true; // return true
}
else return false; // if equals() method returns false, also return false
}
두를 비교하는 가장 좋은 방법은 객체를 json 클래스로 변환하고 비교하는 것입니다. 이는 복잡한 중첩 배열, 필드 및 / 또는 배열을 포함하는 객체를 처리 할 때 가장 쉬운 솔루션입니다.
끊다 :
import com.google.gson.Gson;
Object a = // ...;
Object b = //...;
String objectString1 = new Gson().toJson(a);
String objectString2 = new Gson().toJson(b);
if(objectString1.equals(objectString2)){
//do this
}
계산서 a == object2
와 a.equals(object2)
항상 돌아갑니다 모두 false
있기 때문에 a
는 string
동안은 object2
의 인스턴스이다MyClass
구현은 다음과 같아야합니다.
public boolean equals2(Object object2) {
if(a.equals(object2.a)) {
return true;
}
else return false;
}
이 구현에서는 두 가지 방법이 모두 작동합니다.
기본 toString () 함수를 사용자 정의 할 수있는 경우 다른 방법은 필요에 따라 모든 속성을 반환하는 toString () 메소드를 재정의하는 것입니다. 그런 다음 두 객체의 toString () 출력을 비교합니다. 클래스에 클래스 이름을 포함하는 IntelliJ IDEA IDE를 사용하여 toString () 메서드를 생성했습니다.
public class Greeting {
private String greeting;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
return this.toString().equals(obj.toString());
}
@Override
public String toString() {
return "Greeting{" +
"greeting='" + greeting + '\'' +
'}';
}
}
"=="연산자는 두 참조가 메모리에서 객체를 반환합니다. 반면에 () 메서드는 객체의 내용에 따라 true를 반환합니다.
예 :
String personalLoan = new String("cheap personal loans");
String homeLoan = new String("cheap personal loans");
//since two strings are different object result should be false
boolean result = personalLoan == homeLoan;
System.out.println("Comparing two strings with == operator: " + result);
//since strings contains same content , equals() should return true
result = personalLoan.equals(homeLoan);
System.out.println("Comparing two Strings with same content using equals method: " + result);
homeLoan = personalLoan;
//since both homeLoan and personalLoan reference variable are pointing to same object
//"==" should return true
result = (personalLoan == homeLoan);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);
출력 : == 연산자를 사용하여 두 공유 비교 : false는 메소드를 사용하여 동일한 내용을 두개의 공유 비교 : true == 연산자를 사용하여 동일한 공유를 두 참조 비교 : true
http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-java.html?m=1 링크에서 자세한 정보를 얻을 수도 있습니다.
클래스는 동일한 기능을 달성하기 위해 Comparable 인터페이스를 구현할 수 있습니다. 클래스는 인터페이스에 선언 된 compareTo () 메서드를 구현해야합니다.
public class MyClass implements Comparable<MyClass>{
String a;
public MyClass(String ab){
a = ab;
}
// returns an int not a boolean
public int compareTo(MyClass someMyClass){
/* The String class implements a compareTo method, returning a 0
if the two strings are identical, instead of a boolean.
Since 'a' is a string, it has the compareTo method which we call
in MyClass's compareTo method.
*/
return this.a.compareTo(someMyClass.a);
}
public static void main(String[] args){
MyClass object1 = new MyClass("test");
MyClass object2 = new MyClass("test");
if(object1.compareTo(object2) == 0){
System.out.println("true");
}
else{
System.out.println("false");
}
}
}
object.equals의 반환 유형은 이미 부울입니다. 분기가있는 메서드로 래핑 할 필요가 없습니다. 따라서 두 개체를 비교하려면 간단히 비교하십시오.
boolean b = objectA.equals(objectB);
b는 이미 참 또는 거짓입니다.
==를 사용하면 실제 객체가 아닌 객체의 참조가 비교됩니다. Java 객체를 비교하려면 equals 메소드를 재정의해야합니다.
일부 추가 정보 C ++에는 연산자 오버로드가 있으며 Java는 연산자 오버로드를 제공하지 않습니다. 또한 Java의 다른 가능성은 compareTo 메소드를 정의하는 Compare Interface 구현 입니다.
비교기 인터페이스 는 두 개체를 비교하는데도 사용됩니다.
여기서 출력은 첫 번째 sopln 문에서 false, false입니다. Myclass 유형의 문자열 유형 변수를 다른 MyClass 유형과 비교하려고하는데 둘 다 Object 유형이고 "=="oprerator를 사용했기 때문에 허용됩니다. 메모리 내부의 실제 contnet이 아닌 실제 메모리를 보유하는 참조 변수 값을 확인합니다. 두 번째 sopln에서도 a.equals (object2)를 다시 호출하는 것과 동일합니다. 여기서 a는 object1 내부의 변수입니다. 이것에 대한 당신의 발견을 알려주십시오.
아래 코드에서 재정의 된 메서드 .equals ()를 호출합니다.
public boolean equals2 (Object object2) {if (a.equals (object2)) {// 여기서 재정의 된 메서드를 호출하고 있으므로 false가 2 번 발생합니다. true를 반환하십시오. } 그렇지 않으면 false를 반환합니다. }
/** Comparing two or more variables. Here the two items are compared and it will return a boolean true or false.
*
* @return equals
*/
public boolean equals(Object item)
{
String emp1 = this.toString();
String emp2 = item.toString();
return emp1.equals(emp2);
}
@Override
//In case you have more than one variable.
public String toString()
{
return a + b;
}
// a and b represent the variables to display.
참고 URL : https://stackoverflow.com/questions/13387742/compare-two-objects-with-equals-and-operator
'ProgramingTip' 카테고리의 다른 글
System.Array.CopyTo ()와 System.Array.Clone ()의 차이점 (0) | 2020.10.24 |
---|---|
자바의 링 버퍼 (0) | 2020.10.23 |
입력 요소에서 angularjs 필터 사용 (0) | 2020.10.23 |
KnockoutJs v2.3.0 : 오류 동일한 요소에 바인딩을 여러 번 적용 할 수 없습니다. (0) | 2020.10.23 |
C ++ deque 대 큐 대 스택 (0) | 2020.10.23 |