하나의 객체를 만들어 내에 추가한다고 가정 해보십시오 ArrayList
. 그런 다음 정확히 동일한 생성자 입력으로 다른 객체를 만들면 contains()
메소드가 두 객체가 동일한 것으로 평가합니까? 생성자가 입력에 대해 재미있는 작업을 수행하지 않고 두 객체에 저장된 변수가 동일하다고 가정하십시오.
ArrayList<Thing> basket = new ArrayList<Thing>();
Thing thing = new Thing(100);
basket.add(thing);
Thing another = new Thing(100);
basket.contains(another); // true or false?
class Thing {
public int value;
public Thing (int x) {
value = x;
}
equals (Thing x) {
if (x.value == value) return true;
return false;
}
}
이것이 반환 class
되도록 구현되어야 합니까?contains()
true
답변
배열 implements
리스트 인터페이스를 나열합니다.
메소드 에서 Javadoc을List
보면 contains
메소드를 사용하여 equals()
두 오브젝트가 동일한 지 평가 하는 것을 볼 수 있습니다 .
답변
올바른 구현은
public class Thing
{
public int value;
public Thing (int x)
{
this.value = x;
}
@Override
public boolean equals(Object object)
{
boolean sameSame = false;
if (object != null && object instanceof Thing)
{
sameSame = this.value == ((Thing) object).value;
}
return sameSame;
}
}
답변
ArrayList는 클래스 (귀하의 Thing 클래스)에서 구현 된 equals 메소드를 사용하여 equals 비교를 수행합니다.
답변
일반적으로 성능 향상을 위해서라도 재정의 hashCode()
할 때마다 재정의해야합니다 equals()
. HashCode()
비교할 때 객체가 정렬 될 ‘버킷’을 결정하므로 equal()
true로 평가 되는 두 객체 는 모두 같은 값을 반환해야합니다 hashCode
value()
. 기본 동작을 기억할 수 없습니다 hashCode()
(0을 반환하면 코드가 작동하지만 느리게 작동하지만 주소를 반환하면 코드가 실패합니다). 재정의를 잊어 버렸기 때문에 코드가 실패했을 때를 기억합니다 hashCode()
. 🙂
답변
객체에서 equals 메소드를 사용합니다. 따라서 Thing이 equals를 재정의하고 객체에 저장된 변수를 사용하여 비교하지 않으면 contains()
메소드에서 true를 반환하지 않습니다 .
답변
class Thing {
public int value;
public Thing (int x) {
value = x;
}
equals (Thing x) {
if (x.value == value) return true;
return false;
}
}
다음과 같이 작성해야합니다.
class Thing {
public int value;
public Thing (int x) {
value = x;
}
public boolean equals (Object o) {
Thing x = (Thing) o;
if (x.value == value) return true;
return false;
}
}
이제는 작동합니다.)
답변
value
기본 유형이 아닌 경우 다음 구현이 잘못되었습니다 .
public class Thing
{
public Object value;
public Thing (Object x)
{
this.value = x;
}
@Override
public boolean equals(Object object)
{
boolean sameSame = false;
if (object != null && object instanceof Thing)
{
sameSame = this.value == ((Thing) object).value;
}
return sameSame;
}
}
이 경우 다음을 제안합니다.
public class Thing {
public Object value;
public Thing (Object x) {
value = x;
}
@Override
public boolean equals(Object object) {
if (object != null && object instanceof Thing) {
Thing thing = (Thing) object;
if (value == null) {
return (thing.value == null);
}
else {
return value.equals(thing.value);
}
}
return false;
}
}