2009-12-16 4 views
2
Vector <Double> x = new Vector<Double>(); 
Vector <Integer> y = new Vector <Integer>(); 
System.out.print(x.equals(y)); 

에이 인쇄를 적용? equals()가 아닌데 - 기본적으로 두 개의 참조가 같은 객체를 가리키는 지 비교해야합니다.불일치는() 벡터

+0

당신은 그것을 말했다 : "기본적으로"! –

답변

6

equalsAbstractList에 구현됩니다. 목록의 요소를 통과하고 같지 않으면 false를 반환합니다. 목록에 요소가 없기 때문에 true가 반환됩니다.

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

톰은 List 인터페이스의 계약 당신이 동작을 정의하는 것을 볼 수 읽기, 코멘트에서 언급 한 바와 같이.

지정된 개체가 목록이고 두 목록의 크기가 같고 두 목록의 요소가 모두 일치하면 true를 반환합니다.

+1

'Vector'는'List' 계약을 따릅니다. –

+0

오히려 관련 질문에 실제 질문하지만,이 날 생각있어, 그것은 일부 결정된 경우 요소 비교를하기 전에 목록을 정렬하는 것이 더 빠를 것입니까? 당신은 1) 크기/instanceof/등을 확인하십시오. 2) 새로운 정렬 된 목록 3) oldskool 인덱스 반복, 각 쌍을 비교, 불일치 항목이 발견되면 빨리 실패합니다. – Esko

+0

@Esko, 당신이 언급하는 의미는'List'가 아닌'Set'처럼 들립니다. 'List'에서는 질서가 중요합니다. –

1

Vector은 고유 한 equals 방법이 있습니다. 그것의 내용을 비교합니다. 그리고 귀하의 Vector은 모두 비어 있으므로 동일합니다.

참고 : 런타임시 유형 삭제 때문에 Vector의 인스턴스가 두 개만 있습니다.

+0

@tangens - 사실, 타입 삭제와는 관계가 없습니다. Vector.equals (...)/List.equals (...)의 사양과 관련된 모든 것입니다. –

+0

@ stephen-c : 제 답변을 수정했습니다. – tangens

2

아니요, 두 개의 참조가 동일한 객체를 가리키는 경우 equals()는 비교하지 않아야합니다.
참조 된 개체가 과 같음 인 경우는 대부분 동일한 콘텐츠를 갖는 것을 의미합니다.

주어진 객체에 대해 메소드가 구현되지 않은 경우에만 동일한 객체를 비교합니다. 이 경우 Object의 메소드가 == 연산자와 함께 사용됩니다.

==은 동일한 개체 (인스턴스)인지 비교하는 개체입니다.