2013-02-01 59 views
8

thể trùng lặp:
Integer == int allowed in javaso sánh giá trị dài trong java

sự khác biệt giữa hai câu sau đây

Long l1 = 2L; 
if(l1 == 2) 
    System.out.println("EQUAL");       
if(l1.longValue() == 2) 
    System.out.println("EQUAL"); 

Cả hai đều đang đưa ra kết quả tương tự là gì "EQUAL ".Nhưng nghi ngờ của tôi là Long là đối tượng. Làm thế nào là nó bằng nhau?

+3

Điều này là do [tự động hủy hộp] (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html). – assylias

+0

Đó là vì tính năng đấm bốc tự động và tính năng unboxing của Java –

+0

có thể giải thích rõ ràng – PSR

Trả lời

10

Như đã chỉ ra trong các ý kiến, khi thực hiện

if(l1 == 2) 

Longl1 được tự động không có hộp bọc để loại nguyên thủy của nó, long. Vì vậy, so sánh là giữa longint.

Trong trường hợp thứ hai, l1.longValue() sẽ trả về giá trị long, như một nguyên thủy, của Long đại diện bởi các đối tượng Long, vì vậy việc so sánh sẽ một lần nữa giữa longint. Trả lời your comment, hãy xem What is the main difference between primitive type and wrapper class?

Liên kết được đưa ra trong các nhận xét về autoboxing bao gồm chủ đề này khá tốt.

+0

ok .Làm thế nào tôi hiểu.thank u – PSR

-1

Hành vi này được giải thích bằng cách mở rộng và đấm bốc.

Trong ví dụ đầu tiên,

if(l1 == 2) 

những gì xảy ra là như sau:

1: Thông báo biên dịch mà bạn đang so sánh một wrapper (Long) với một giá trị nguyên thủy (int), vì vậy nó hộp nguyên thủy, kết quả là:

if (l1 == new Integer(2))

từ 2 là một int (nó thiếu 'L' ở cuối).

2: Trình biên dịch hiện nay thông báo rằng chúng ta đang so sánh một Long với Integer, vì vậy nó mở rộng các Integer đến một Long, kết quả là:

if (l1 == new Long(new Integer(2))

3: Bây giờ chúng ta đang so sánh hai Longs.

Các trường hợp khác là đơn giản hơn, ở đây kết quả chỉ đơn giản là:

if (2L == 2)

so sánh các giá trị nguyên thủy, được phép mặc dù họ là những loại khác nhau.

+0

Không chắc chắn về lời giải thích của bạn về ví dụ đầu tiên. Tôi nghĩ rằng nó _unboxing_ của 'l1' đang xảy ra ở đây, không _boxing_ của' 2' vào 'Integer'. Nếu đó là cách đó, điều duy nhất có thể giải thích toán tử '==' trả về 'true' sẽ là bộ nhớ đệm, đó sẽ không phải là một lời giải thích hợp lệ nếu nó đang làm' new Integer (2) '. Ngoài ra, làm 'new Long (123456) == 123456' trả về' true', và nó có vẻ là một giá trị nằm ngoài phạm vi bộ nhớ đệm. –

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