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
'programing' 카테고리의 다른 글
이것과의 차이점.$parent.$170이랑 이거요.$140 (0) | 2022.08.11 |
---|---|
vueJ에서 v-select v2.5.1에서 선택한 옵션의 ID를 바인딩하는 방법 (0) | 2022.08.11 |
Linux에서 공유 라이브러리를 주소 공간에 로드하는 방법 (0) | 2022.08.11 |
공허한 게 무슨 소용이야? (0) | 2022.07.16 |
v-for 루프의 n번째 항목마다 항목 삽입 (0) | 2022.07.16 |