2013-12-17 15 views
7

Tôi cần phải kiểm tra xem một danh sách trả lại đã được tạo một lần hay là bản sao của một đối tượng. Có thể tìm ra địa chỉ của nó không?Làm cách nào để có địa chỉ của Danh sách?

// thread 1 
List<Object> list = supplier.get(); 
System.out.print("list: " + list + "@" + getAddress(list)); 

// thread 2 
List<Object> list = supplier.get(); 
System.out.print("list: " + list + "@" + getAddress(list)); 

Làm thế nào có thể getAddress(list) như thế nào? Vấn đề là hashCode() thường trả về một địa chỉ bị ghi đè trong AbstractList, do đó, nó sẽ trả lại mã băm hợp lệ thay vì địa chỉ.

+0

Tôi sẽ hỏi "Địa chỉ gì?", Nhưng sau đó tôi đã giải thích nó. Câu hỏi thú vị mặc dù. – GGrec

Trả lời

6

Có thể tìm ra địa chỉ của nó không?

số Bạn có thể, tuy nhiên, kiểm tra bình đẳng tham khảo - đó là tất cả các bạn quan tâm:

if (list1 == list2) 
{ 
    // They're the same 
} 

Nếu bạn thực sự muốn làm điều này từ khai thác gỗ, bạn có thể sử dụng System.identityHashCode thay vào đó, nhưng phải lưu ý rằng đây là không phải có nghĩa là được coi là địa chỉ. Nó vẫn là một mã băm, và không được đảm bảo là duy nhất. Có thể là liên quan đến đối với một số địa chỉ nội bộ, nhưng cũng không được đảm bảo.

8

Tôi đoán bạn muốn

System.identityHashCode(list); 

javadoc nói

Trả về mã băm tương tự cho các đối tượng nhất định như sẽ được trả lại bởi hashCode phương pháp mặc định(), hay không được lớp của đối tượng ghi đè hashCode().

+0

Thật tuyệt vời! Cảm ơn bạn, đó là những gì tôi cần. Tôi sẽ chấp nhận câu trả lời của Jon, vì nó chính xác hơn. –

2

Địa chỉ của đối tượng không được sửa trong Java, nó có thể di chuyển, vì vậy bạn không thể lấy nó.

Tại sao bạn không chỉ cần kiểm tra if(list1 == list2)?

+0

Downvoter xin vui lòng cho tôi biết những gì tôi đã nói sai. – Maroun

+1

Bây giờ tôi đã có ý nghĩa - JVM có thể di chuyển đối tượng để địa chỉ vật lý của nó sẽ thay đổi. +1 –

Các vấn đề liên quan