2011-10-05 4 views
0

MyObject 클래스가 있다고 가정하고, 다른 두 개의 ArrayList에 저장되어 있다고 가정합니다. 2 ArrayList에서 동일한 객체를 가져 오는 경우, 그것들이 동일한지를 검사하기 위해 어떻게 비교할 것인가?자바 객체 비교 및 ​​객체 키로 Hashtable

instance1 == instance2 또는 instance1.equals(instance2)으로 변경 하시겠습니까? 나는 == 연산자가 포인터 위치를 보았을 것이라고 확신하지만, array1과 instance2에서 instance1을 array2로부터 얻는다면 그들은 다른 포인터 위치 나 같은 값을 반환 할까?

Hashtable과 동일한 기능 : 포인터 위치를 키 또는 실제 개체로 저장합니까? 동일한 내용의 객체가 두 개 있지만 실제로 다른 객체 인 경우 여전히 작동합니까?

감사

+0

질문의 마지막 부분이 매우 명확하지 않습니다. 문제를 명확히하기 위해 질문을 편집하십시오. –

+0

예, 편집되었습니다. 희망이 도움이됩니다. – Pwnna

답변

1

내가 배열 2에서 배열 1과 인스턴스 2에서 INSTANCE1 얻을 경우, 그들은 서로 다른 포인터 위치 또는 동일한을 반환? 그들은 같은 객체를 참조하는 경우

예, ==는 true를 돌려줍니다.

ArrayList는 사용자가 지정한 항목을 정확하게 저장합니다. 참조 ("주소")를 주면 해당 주소가 저장됩니다. 해당 특정 요소를 가져 오면 동일한 참조를 다시 가져옵니다.

샘플 조각 : ArrayList에 그러나 복사본을 만들 않는 의미에서

Object o = new Object(); 

List<Object> l1 = new ArrayList<Object>(); 
List<Object> l2 = new ArrayList<Object>(); 

l1.add(o); 
l2.add(o); 

Object o1 = l1.get(0); 
Object o2 = l2.get(0); 

System.out.println(o1 == o2); // prints true 

이 조각이 있듯이, 목록은 영향을받지 않습니다 s을 변경 (기준의!) :

String s = "hello"; 
List<String> l = new ArrayList<String>(); 
l.add(s); 
s = "world"; 
System.out.println(l.get(0)); // prints hello 

기본적으로 ==은 변수의 내용을 비교합니다. 참조 내용이 "주소"이므로 ==을 사용하는 참조를 비교하면 두 참조가 동일한 객체를 참조하는 경우에만 참이됩니다.

o1.equals(o2)o1o2이 참조하는 실제 개체를 비교합니다.


는 키 또는 실제 개체로 포인터 위치를 저장합니까? 동일한 내용의 객체가 두 개 있지만 실제로 다른 객체 인 경우 여전히 작동합니까?

실제 개체를 키로 사용합니다. 두 개의 개별 오브젝트가 equal 인 경우, 두 오브젝트 중 하나를 사용하여 해당 키에 저장된 값을 검색 할 수 있습니다.


나는 아니, == 포인터 내용에 보이는, 또는, == 연산자는이 하찮은 일에 속 태우고있는 포인터 위치

에 보이는 확신 해요,하지만 개체 위치.

+0

나는 이것이 작동하는 것을 볼 수 있지만, l1과 l2는 각각의 객체이기 때문에 서로 다른 메모리 주소를 가지지 않을까? 리스트/프리미티브 배열 '=='은 일반적인 오브젝트 비교와 다른가요? – JustinKSU

+0

아니요, List 또는 배열에는 특별한 것이 없습니다. 리스트와 배열은 모두 객체이며, 그러한 객체에 대한 참조를 포함하는 변수가 있으면'=='는 다른 참조와 마찬가지로 작동합니다. – aioobe

+0

RTFC. 나는 당신이 쓴 것이 아니라고 말한 것 같아요. 상관없이 설명 해 주셔서 감사합니다. – JustinKSU

1

개체참조 사이를 구분해야합니다.

두 개의 서로 다른 목록 (또는 일반적으로 표현식)은 동일한 개체에 대해 참조 일 수 있습니다. 예를 들어

MyObject x = new MyObject(); 
MyObject y = x; 

여기 xy 별도 변수하지만 그들은 모두 동일한 개체 참조 값을 갖는다. "같은 대상을 말하는 것"은 ==과 비교됩니다. 당신이 다음 (당신이 MyObjectequals를 오버라이드 (override) 한 가정) equals를 사용하는 경우

다른 객체는 여전히 동일 할 수있다. 예를 들어

:

Integer x = new Integer(1); 
Integer y = new Integer(1); 
System.out.println(x == y); // False 
System.out.println(x.equals(y)); // True 

여기 xy 및 값은 다른 개체에 대한 참조하지만, 그 목적은 동일한 것으로 간주된다.

그렇다면 MyClass 클래스는 "객체 신원"이상의 객체 평등 개념을 갖고 있습니까? 목록에 저장된 참조를 비교할 때 어떤 부분에 관심이 있습니까?

+1

알지만, ArrayList가 참조를 받거나 새로운 객체를 생성하는지 여부를 알아야합니다. – Pwnna

+1

@ultimatebuster : 글쎄, 당신이 물어 본 것은 아니지만, 자바의 콜렉션은 자동으로 객체를 복제하지 않는다. 당신은 * reference *를'add' 메쏘드 (또는 무엇이든)로 넘겨 주며 그 참조가리스트에 추가됩니다. 복제본을 만들려면 직접 복제해야합니다. –

1

동일한 개체가 두 개의 개별 ArrayList 컨테이너에 저장되어 있고 그것이 동일한 지 확인하려면 == 연산자를 사용하여 개체 ID를 확인하십시오.

참조 정보 만 ArrayList에 저장되므로이 방법이 유용합니다.