자바 집합의 List equals 방법
17710 단어 자바
1. List (ArrayList) 는 equals 방법 을 호출 하여 저 장 된 요소 가 같 고 직접 인용 하 는 것 이 아니 라 저 장 된 요소 가 같다 고 판단 합 니 다.List (Array List) 가 equals 방법 을 다시 썼 다 는 것 을 설명 합 니 다.
List<T> l1 = new ArrayList<>();
l1.add(T1);
List<T> l2 = new ArrayList<>();
l2.add(T1);
l1.equals(l2); //true
2. List > res 에서 같은 List < String > 을 다시 제거 할 수 있 습 니 다.res. contains (List) 방법 을 직접 사용 하면 됩 니 다.
2. 소스 코드 분석:
Array List 소스 코드 분석 에서:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList 가 List 인 터 페 이 스 를 실현 한 것 을 발 견 했 습 니 다. 이치 상 ArrayList 는 모든 List 의 인터페이스 방법 을 실현 해 야 합 니 다.그러나 equals 방법 은 extends 의 Object 류 에서 [1] 을 얻 을 수 있다.그래서 저 는 Array List 의 equals 방법 이 Object 류 의 equals 방법 이 라 고 오해 합 니 다.Array List 에서 요 소 를 비교 참조 해 야 합 니 다.
복합 집합 res 에 List 를 추가 할 때 새로운 List 를 추가 할 때 res 의 모든 List 를 옮 겨 다 니 고 모든 List 요 소 를 옮 겨 다 녀 야 한다 고 생각 합 니 다.계산법 의 복잡 도가 매우 높 아 졌 다.나중에 직접 contains 를 발견 하면 되 나 요?
List<List<String>> res = new ArrayList<>();
List<String> l1 = new ArrayList<>();
List<String> l2 = new ArrayList<>();
l1.add("123");
l2.add("123");
res.add(l1);
System.out.println(res.contains(l2));// true
(1) 우선 contains 방법 은 index Of 방법 을 호출 하여 존재 성 을 확인 하 는 것 이다.
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
(2) index Of 방법 은 List 의 모든 요 소 를 Object o 와 비교 하 는 것 이다.
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
(3) 결국 List 의 요 소 를 Object o 와 equals 로 비교 해 야 한다.(res 에 있 는 List 를 옮 겨 다 니 며 주어진 targetList 와 equals 를 비교 하 는 것 입 니 다)
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
여기 서 호출 된 equals 방법 은 Object 클래스 의 것 이 아 닙 니 다.Array List 는 AbstractList < E > 를 계승 하 였 으 며, equals 방법 은 이 추상 류 에서 나 와 야 합 니 다.이 클래스 가 equals 방법 을 재 작성 한 것 은 교체 기 를 사용 하여 두 개의 List 를 옮 겨 다 니 는 것 입 니 다. 모든 요소 가 같 습 니까?그럼 Array List 에서 equals 를 호출 하 는 방법 은 요 소 를 비교 하 는 것 입 니 다.
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator<?> e2 = ((List<?>) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
그래서 문장 첫머리 의 1, 2 시 결론 을 내 렸 다.이상 ~
보충
[1] 여기 서 왜 명시 적 extends Object 가 없 는 이유 분석: 이 계승 관 계 는 컴 파일 단계 에서 완 성 된 것 이기 때문에 우 리 는 겉으로 볼 수 없다.컴 파일 단계 에서 부모 클래스 가 없 는 클래스 를 만나면 컴 파일 러 는 기본 부모 클래스 (일반적으로 Object) 를 지정 합 니 다. 이 클래스 에 부모 클래스 가 있 으 면 jvm 은 일반적인 방법 으로 모든 클래스 를 처리 합 니 다.
//原始的类,没有显式的继承Object
public class Test{
//注意这里没有写构造方法
public static void main(String args[]){
}
}
코드 를 class 로 컴 파일 한 후 txt 파일 로 역 컴 파일 합 니 다.
//编译后,如果没有父类会给你加一个默认的object父类
public class Test extends java.lang.Object{
public Test();//编译阶段,如果没有构造方法会给你加一个空的构造方法
public static void main(java.lang.String[]){};
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.