2010-06-21 28 views
16

Đầu ra của chương trình hiện tại là "Lạ". Nhưng cả hai biến đều có cùng tham chiếu. Tại sao so sánh thứ hai và thứ ba lại không đúng?So sánh giữa các biến trỏ đến cùng một đối tượng Integer

Integer a; 
Integer b; 
a = new Integer(2); 
b = a; 
if(b == a) { 
    System.out.println("Strange"); 
} 
a++; 
if(b == a) { 
    System.out.println("Stranger"); 
} 
a--; 
if(b == a) { 
    System.out.println("Strangest"); 
} 

Output: Strange

+0

Mở hộp có thể là câu trả lời. Tuy nhiên, tôi không có ý tưởng thực sự. – jjnguy

+9

+1 để minh họa việc sử dụng hộp tự động không thể tha thứ. –

Trả lời

19

Đó là artifact của autoboxing và một thực tế là Integer là không thay đổi trong Java.

a++a-- được dịch thành khoảng này.

int intA = a.getInt(); 
intA++; 
a = Integer.valueOf(intA); // this is a reference different from b 
+14

Lưu ý rằng nếu bạn thay thế 'a = new Integer (2)' bằng 'a = Integer.valueOf (2)', "Strangest" cũng sẽ được in vì nó sẽ sử dụng bộ nhớ cache nguyên để nhận cá thể. –

+0

Bạn có ý nghĩa gì bởi bộ đệm ẩn số nguyên trong nhận xét của mình. bạn có thể xây dựng ? – restrictedinfinity

+4

@restrictedinfinity. Ít nhất trong Java của Sun, Byte, Short và Integer có một bộ nhớ đệm với 256 giá trị khác nhau, từ -128 đến 127, được phân phối bởi phương thức 'Type.valueOf()'. Vì vậy, trong trường hợp của chúng ta sau 'a -' giá trị int là '2' và nó sẽ giống như chúng ta đã bắt đầu, vì vậy' Integer.valueOf (2) 'sẽ trả về cùng một đối tượng' Integer'. Lưu ý rằng loại 'Long' không có bộ đệm, do đó' Long.valueOf' luôn trả về một đối tượng mới. –

6
  • Strage - đó là hiển nhiên, hai biến trỏ đến cùng một đối tượng

  • không Stranger vì autoboxing. Integer là không thay đổi, do đó, mỗi thao tác trên nó tạo ra một cá thể mới.

  • không Strangest, vì điểm trước đó và vì bạn đã sử dụng new Integer(..) để bỏ qua bộ nhớ cache được sử dụng cho phạm vi byte. Nếu ban đầu bạn sử dụng Integer.valueOf(2) thì các số Integer được lưu trong bộ nhớ cache sẽ được sử dụng và Strangest cũng sẽ được in.

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