2010-05-22 5 views
3

두 목록을 비교하고 싶습니다. List을 사용하여 인터페이스하기 때문에 우리는 Object 클래스에서 equals을 상속받지 않습니다. 어떻게해야합니까?두 목록 비교

+2

List의 모든 구현은 직접적으로 또는 간접적으로 Object에서 상속합니다. OO에 대한 오해가있는 것 같습니다. – whiskeysierra

답변

14

List 인터페이스에 equals 메서드가 포함되지 않은 경우에도 list-classes는 equals 메서드를 여전히 구현할 수 있습니다. API docs on AbstractList에서

(예를 ArrayList, LinkedList에 대한 상속, Vector) :

public boolean equals(Object o)

는리스트와 동일한 지 어떤지 지정된 객체를 비교합니다. 지정된 오브젝트가리스트이며, 양쪽리스트가 같은 사이즈로, 2 개의리스트 내의 대응하는 모든 요소의 페어가 동일한 경우에만, true를 돌려줍니다.

예를 들면 toString, hashCode 등으로 동일하게 적용한다. @Pascal이 코멘트에 언급 된 바와 같이


는, List 인터페이스는 문서에 다음 equals 방법을 언급하고 상태 :

리스트 인터페이스는 Collection 인터페이스에 명시되지 않은 이상, 추가 규정을 배치 , iterator, add, remove, equals 및 hashCode 메소드의 규약에 대해 설명합니다.

+0

나는 내가 분명하지 않고 당신이 옳았다는 것을 깨닫는다. –

2

equals을 계속 사용할 수 있습니다. 모든 개체가 그것을 구현하고 목록은 여전히 ​​개체이며 필요에 따라 equals을 재정의합니다.

0

"평범한 동등한"과 "깊은 동등한 것"을 고려해야한다는 것은 일반적인 이야기입니다.

java.lang.Object에서 나오는 기본 동작은 "얕은 같음"입니다.

List list1 = new ArrayList(); 
List list2 = list1; 

list1.equals(list2); // returns true; 

당신이 "깊은 같음"을 원하는 경우 등의 ArrayList 같은 AbstractList를를 확장 아무것도 인스턴스화 : 그것은 목록 1과리스트 2는 동일한 참조가 있는지 확인합니다.

List<String> list1 = new ArrayList<>(); 
List<String> list2 = new ArrayList<>(); 

list1.add("hello"); 
list2.add("hello"); 
System.out.println(list1.equals(list2)); // will print true 

list1.add("foo"); 
list2.add("bar"); 
System.out.println(list1.equals(list2)); // will print false 
+3

[Lists.equals() JavaDoc] (http://docs.oracle.com/javase/6/docs/api/java/util/List.html#equals (java.lang.Object))에 따르면 구현 List 인터페이스의 equality 요소는 요소별로 동일성을 검사해야합니다. Object.equals()가 "shallow equals"를 실행해도, List.equals() (및 준거 구현)는 "deep equals"를 실시해, 독자적인 메소드를 작성할 필요는 없습니다. – markusk

+0

List에 대해서는 동의하지만 요소가 equals를 재정의하지 않으면 "deep equals"를 얻지 못합니다. 매우 명확하게 말한 것은 아니지만 그것이 진실이라고 믿습니다. – duffymo

+0

Object.equals()는 deep equals의 자리 표시 자입니다. 얕은 같음에 사용하기위한 것이 아닙니다. 표준 계약은 모든 객체 (List뿐만 아니라)가 equals()를 구현하여 깊은 평등을 수행 할 것을 요구합니다.그게 equals() 메소드의 용도입니다. '=='은 얕은 비교를위한 것입니다. – SigmaX