2013-08-26 74 views
22
class datatype1 
{ 

    public static void main(String args[]) 
    { 
    int i1 = 1; 
    Integer i2 = 1; 
    Integer i3 = new Integer(1); 

    System.out.println("i1 == i2"+(i1==i2)); 
    System.out.println("i1 == i3"+(i1==i3)); 
    System.out.println("i2 == i3"+(i2==i3)); 
} 

} 

Outputint vs Integer so sánh Java

i1 == i2true 
i1 == i3true 
i2 == i3false 

Ai đó có thể giải thích lý do tại sao tôi nhận được sai lầm khi so sánh i2 và i3?

+1

Bạn đang so sánh con trỏ, chứ không phải giá trị ... –

+8

Tham chiếu, chứ không phải con trỏ. – chrylis

+4

Làm thế nào đến các câu hỏi như vậy được upvoted ?? –

Trả lời

48
i1 == i2 

kết quả trong un-boxing và so sánh int thông thường được thực hiện. (xem first point in JLS 5.6.2)

i2 == i3 

kết quả trong reference comparsion. Hãy nhớ rằng, i2i3 là hai đối tượng khác nhau. (xem JLS 15.21.3)

+4

Đừng quên đề cập đến 'Integer.valueOf (1)' sẽ dẫn đến 'true', bởi vì Java sẽ sử dụng bộ nhớ cache số nguyên – durron597

+0

@ durron597 thats dude chính xác .. –

10
Integer i2 = 1; 

Kết quả này là autoboxing. Bạn đang chuyển đổi int (kiểu nguyên thủy) thành trình bao bọc tương ứng của nó.

Integer i3 = new Integer(1); 

Ở đây không cần phải tự động tạo khi bạn đang trực tiếp tạo đối tượng Số nguyên.

Bây giờ trong

i1 == i2 
i1 == i3 

i2 và i3 sẽ được tự động không có hộp bọc và thường xuyên int so sánh diễn ra đó là lý do tại sao bạn sẽ có được sự thật.

Bây giờ xem xét

i2 == i3 

đây cả i2 và i3 là những đối tượng Integer rằng bạn đang so sánh. Vì cả hai đều là đối tượng khác nhau (vì bạn đã sử dụng toán tử mới), nó rõ ràng sẽ là false. Lưu ý == toán tử kiểm tra nếu hai tham chiếu trỏ đến cùng một đối tượng hay không. Phương thức Infact .equals() nếu không ghi đè thì cũng vậy.

Nó là giống như nói

Integer i2 = new Integer(1); 
    Integer i3 = new Integer(1); 
    System.out.println("i2 == i3 "+(i2==i3)); 

mà một lần nữa sẽ cho bạn sai.

+0

lỗi dán sao chép dòng mã thứ hai của bạn giống như –

+3

đầu tiên Xin lỗi vì điều đó nhưng thay vì bỏ phiếu xuống, bất kỳ ai cũng có thể đã chỉnh sửa nó. –

+0

Tôi không phải là kẻ phản đối, tôi vừa nói ngay từ cái nhìn đầu tiên là sai. Và điều này quá nhỏ đối với tôi để chỉnh sửa! –