2011-12-12 42 views
6

Theo javadoc của Classjava.lang.Class và bình đẳng

Mỗi mảng cũng thuộc về một lớp học mà được phản ánh như một Class đối tượng được chia sẻ bởi tất cả các mảng với các loại nguyên tố cùng và số kích thước.

Nhưng khi tôi chạy dưới

int[] intArray = { 1, 2 }; 
out.println(intArray.getClass().hashCode()); 
int[] int2Array = { 1, 2 }; 
out.println(int2Array.getClass().hashCode()); 

out.println(intArray.equals(int2Array)); 

tôi nhận được đầu ra dưới đây

1641745 
1641745 
false 

Tôi tự hỏi tại sao các bằng đang trở lại sai mặc dù cả hai mảng là của int loại và có cùng kích thước.

Trả lời

8

Điều này là do bạn đang gọi số equals() trên bản thân mảng thay vì đối tượng Class của chúng. Hãy thử:

out.println(intArray.getClass().equals(int2Array.getClass())); //prints true 

Bạn cũng có thể viết:

out.println(int[].class.equals(int[].class)); //prints true thankfully 

Là một sự bình đẳng sang một bên, phù hợp với mã băm không nhất thiết chỉ ra, mặc dù điều đó không quan trọng ở đây.

3

cố gắng để gọi intArray.getClass().equals(int2Array.getClass())

2

Nhìn chung, Java hợp đồng mã băm chỉ đòi hỏi rằng:

  • Bất cứ khi nào nó được gọi trên cùng một đối tượng nhiều hơn một lần trong một cuộc thi của một ứng dụng Java , phương thức hashCode phải luôn trả về cùng một số nguyên, miễn là không có thông tin nào được sử dụng bằng các phép so sánh trên đối tượng được sửa đổi. Số nguyên này không cần phải duy trì sự nhất quán từ một lần thực thi của một ứng dụng đến một thực thi khác của cùng một ứng dụng.
  • Nếu hai đối tượng bằng nhau theo phương thức equals (Object), sau đó gọi phương thức hashCode trên mỗi đối tượng phải tạo ra cùng một kết quả nguyên. Không cần thiết nếu hai đối tượng không bằng nhau theo phương thức equals (java.lang.Object), thì gọi phương thức hashCode trên mỗi đối tượng phải tạo ra các kết quả nguyên phân biệt. Tuy nhiên, lập trình viên cần lưu ý rằng việc tạo ra các kết quả nguyên phân riêng biệt cho các đối tượng không bằng nhau có thể cải thiện hiệu năng của các bảng băm.

(Từ the Java documentation on Object#hashCode)

Ở đây bạn có hai mảng số nguyên không bằng nhau (ví dụ a.equals(b) => false), nhưng họ không (xem điểm thứ ba) cần thiết để trở hashcodes bất bình đẳng.


Ngoài ra, lưu ý rằng mã của bạn sẽ có tác dụng nếu bạn sử dụng Arrays.equals thay vì Object#equals, như sau. Lưu ý rằng Arrays.equals kiểm tra rằng "cả hai mảng chứa cùng một số phần tử và tất cả các cặp phần tử tương ứng trong hai mảng đều bằng nhau."

int[] intArray = { 1, 2 }; 
out.println(intArray.getClass().hashCode()); 
int[] int2Array = { 1, 2 }; 
out.println(int2Array.getClass().hashCode()); 

out.println(Arrays.equals(intArray, int2Array)); 

Xem http://www.ideone.com/HaysD cho một ví dụ làm việc.

1

Bạn đang so sánh hai mảng khác nhau. Bình đẳng Mảng được dựa trên bản sắc, không phải nội dung mảng. Vì họ không phải là cùng một mảng, kết quả là sai.

Nếu bạn muốn kiểm tra các nội dung của hai mảng cho bình đẳng, có những phương pháp helper trong java.util.Arrays.

out.println(Arrays.equals(intArray, int2Array); 
+0

Ngoài ra còn có các phương pháp Arrays.deepEquals nếu bạn cần chúng. –

0

các thực hiện mặc định của equals() được xác định bởi Object.equals(Object):

Các bằng phương pháp cho lớp đối tượng thực hiện các quan hệ tương đương có thể sáng suốt nhất trên các đối tượng; tức là, đối với bất kỳ giá trị tham chiếu không null và y, phương thức này trả về true nếu và chỉ khi x và y tham chiếu đến cùng một đối tượng (x == y có giá trị đúng).

Khi bạn so sánh hai mảng sử dụng equals(), phương pháp mặc định này được gọi.

0

Run này và câu trả lời sẽ được rõ ràng:

int[] array1 = { 1, 2 }; 
int[] array2 = { 1, 2 }; 

System.out.println("array1.hashcode: " + array1.hashCode()); 
System.out.println("array2.hashcode: " + array2.hashCode()); 
System.out.println("array1.class.hashcode: " + array1.getClass().hashCode()); 
System.out.println("array2.class.hashcode: " + array2.getClass().hashCode());