[java] ArrayList의 contains () 메소드는 객체를 어떻게 평가합니까?

하나의 객체를 만들어 내에 추가한다고 가정 해보십시오 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;
    }
}