자바 집합의 List equals 방법

17710 단어 자바
1. 먼저 결론 을 말 합 니 다.
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[]){};

}

좋은 웹페이지 즐겨찾기