2013-10-21 25 views
8

Tôi có một vấn đề rất lạ khi tôi đang cố gắng để so sánh 2 biến Long, họ luôn luôn hiển thị sai và tôi có thể chắc chắn họ có cùng giá trị số bằng cách gỡ lỗi trong Eclipse:Không phải là 2 biến dài bằng toán tử == để so sánh trong Java?

if (user.getId() == admin.getId()) { 
    return true; // Always enter here 
} else { 
    return false; 
} 

Cả hai trên 2 giá trị trả về là loại đối tượng Dài, làm tôi bối rối. Và để xác minh rằng tôi đã viết một phương pháp chính như sau:

Long id1 = 123L; 
Long id2 = 123L; 

System.out.println(id1 == id2); 

Nó in đúng.

Vì vậy, ai đó có thể cho tôi ý tưởng ?. Tôi đã làm việc trong Phát triển Java trong 3 năm nhưng không thể giải thích trường hợp này.

+4

Tùy thuộc vào kích thước của Long. Các số nguyên và số nguyên nhỏ hơn được liên kết và là các đối tượng giống hệt nhau, nhưng các đối tượng dài hơn thì không, và đối với chúng, bạn sẽ cần phải sử dụng '.equals (...)' hoặc unbox chúng. –

Trả lời

17

== so sánh các tham chiếu, bằng giá trị so sánh. Đây là Long là Object nên chúng so sánh các tham chiếu.

NHƯNG Long id1 = 123L; sẽ tự động được tự động chuyển thành đối tượng Dài bằng cách sử dụng Long.valueOf(String) nội bộ, quá trình sẽ sử dụng LongCache, và 123 nằm giữa LongCache [-128,127] để thực sự là cùng một đối tượng.

+0

trong trường hợp của tôi, giá trị ID trả lại là 16 không vượt quá phạm vi của nó. –

+0

yeah , nhưng những Longs có thể không được tạo bởi Long.valueOf(), meigh là new Long (12), vì vậy, chúng là các đối tượng khác nhau. – BlackJoker

+0

Việc triển khai thời gian chạy được đảm bảo để lưu vào bộ nhớ cache 'Integer' values ​​-128..127. Các giá trị nằm ngoài phạm vi đó hoặc bất kỳ loại số nào khác (ví dụ 'Long'), có thể được lưu trong bộ nhớ cache nếu thời gian chạy xảy ra để thông báo rằng làm như vậy sẽ thuận lợi trong trường hợp cụ thể, nhưng thông số không nói gì về trường hợp thuận lợi trong thời gian chạy. hoặc sẽ không nhận ra. – supercat

6

== so sánh giá trị tham khảo, và nhỏ hơn long values are cached

public static Long valueOf(long l) { 
    final int offset = 128; 
    if (l >= -128 && l <= 127) { // will cache 
     return LongCache.cache[(int)l + offset]; 
    } 
    return new Long(l); 
} 

để nó hoạt động cho các giá trị dài nhỏ hơn

Ngoài Xem

+0

Nhưng user.getId() chỉ trả về 16 trong trường hợp của tôi, tôi nghĩ nó đủ nhỏ. Làm thế nào để giải thích nó? –

+0

sau đó nó không được lưu trữ trong 'LongCache', http://ideone.com/bq3zpZ –

0

Bị kẹt trong một vấn đề trong 4 giờ vì sử dụng == ... So sánh được chấp thuận trên Long < 128 nhưng ko có giá trị lớn hơn.

Nói chung, không nên sử dụng == để so sánh Objects, sử dụng .equals() càng nhiều càng tốt! Giữ ==, >, <, <= etc. cho nguyên thủy.

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