programing

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

kingscode 2022. 8. 11. 18:30
반응형

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목록 인터페이스(목록 인터페이스)

자바독을 참조하면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 클래스)에서 구현된 동등한 메서드를 사용하여 동등한 비교를 수행합니다.

으로는 이 경우에도 해야 합니다.hashCode()덮어쓸 때마다equals()퍼포먼스 향상을 위해서라도. HashCode()때 을 어떤 로 분류할지를 해서 ' '어느로 분류할 수 .따라서 어떤 두 오브젝트든equal() true가 됩니다.hashCode value()기본 동작을 기억할 수 없습니다.hashCode()(0이 반환되면 코드는 동작하지만 천천히 동작하지만 주소가 반환되면 코드는 실패합니다).코드를 무효로 하는 것을 잊어버려서 코드가 실패했을 때가 여러 번 기억납니다.hashCode()

오브젝트에 대해 동등한 방법을 사용합니다.되어 있는 비교 한 .contains()★★★★★★ 。

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;
    }
}

다른 포스터는 contains()가 어떻게 기능하는지에 대한 질문을 다루고 있습니다.

마찬가지로 중요한 것은 equals()를 적절히 구현하는 방법입니다.그리고 이에 대한 답은 이 특정 계층에서 무엇이 객체 평등을 구성하느냐에 달려 있습니다.제공된 예제에서 x=5를 갖는 두 개의 다른 개체가 있는 경우 두 개체가 같습니까?그것은 정말 당신이 무엇을 하려고 하는가에 달려있다.

개체 평등에만 관심이 있는 경우 .disp()(개체가 제공하는 것)의 기본 구현은 ID(예: 이 == 기타)만 사용합니다.원하는 경우 클래스에 equals()를 구현하지 마십시오(오브젝트에서 상속받도록 함).작성한 코드는 아이덴티티를 찾는 경우 다소 정확하지만 실제 클래스 b/c에는 나타나지 않습니다.기본 Object.equals() 구현을 사용하는 경우보다 이점이 없습니다.

이제 막 시작하셨다면 조슈아 블로흐의 효과적인 자바 책을 적극 추천합니다.이 문서는 훌륭한 읽을거리입니다.또, 아이덴티티 베이스의 비교 이상의 것을 실행하려고 할 때에, equals()를 올바르게 실장하는 방법에 대해서도 설명합니다.

JavaDoc 바로가기:

부울 contains(오브젝트 o)

이 목록에 지정된 요소가 포함되어 있으면 true를 반환합니다.보다 형식적으로, 는 이 목록에 하나 이상의 요소 e가 포함되어 있는 경우에만 true를 반환합니다(o==syslog? e==syslog: o.syslog(e)).

record오버라이드equals

당신이 말했다:

정확히 동일한 생성자 입력을 가진 다른 개체

…그리고…

생성자가 입력에 대해 재미있는 작업을 수행하지 않으며 두 개체에 저장된 변수가 동일하다고 가정합니다.

다른 답변에서 설명한 바와 같이 를 작동시키려면 방법을 덮어써야 합니다.

Java 16+에서는 레코드 기능이 자동으로 이 메서드를 덮어씁니다.

레코드는 데이터를 투명하고 불변하게 전달하는 것이 주된 목적인 클래스를 간단하게 작성하는 방법입니다.기본적으로는 단순히 구성원 필드를 선언합니다.컴파일러는 암묵적으로 생성자, getters,equals&hashCode,그리고.toString.

의 논리equals디폴트로는 같은 클래스의 다른 오브젝트 내의 각 멤버필드와 오브젝트의 모든 멤버필드를 비교합니다.마찬가지로 디폴트 실장은hashCode그리고.toString메서드에서는 각 멤버필드도 고려됩니다.

record Thing( int amount ) {} ;

이것으로, 통상의 보일러 플레이트 코드를 사용하지 않고, 완전하게 기능하는 읽기 전용 클래스에 필요한 코드는 이것뿐입니다.

사용 예

Thing x = new Thing( 100 ) ; 
Thing y = new Thing( 100 ) ; 
boolean parity = x.equals( y ) ;

달릴 때.

패리티 = True

당신의 질문으로 돌아가세요.

Thing x = new Thing( 100 );
List < Thing > things =
        List.of(
                new Thing( 100 ) ,
                new Thing( 200 ) ,
                new Thing( 300 )
        );

boolean foundX = things.contains( x );

달릴 때.

foundX = true


보너스 기능:레코드는 메서드 내에서 로컬로 선언할 수 있습니다.또는 일반 클래스와 마찬가지로 레코드를 중첩 클래스로 선언하거나 별도의 클래스로 선언할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2642589/how-does-a-arraylists-contains-method-evaluate-objects

반응형