Long
là một đối tượng, không phải là nguyên thủy. Bằng cách sử dụng ==
, bạn đang so sánh các giá trị tham chiếu .
Bạn cần phải làm:
if(str.equals(str2))
Như bạn làm so thứ hai của bạn.
Chỉnh sửa: Tôi hiểu ... bạn đang nghĩ rằng các đối tượng khác hoạt động như String
literals. Họ không *. Và thậm chí sau đó, bạn cũng không bao giờ muốn sử dụng ==
với số String
literals.
(* loại AUTOBOX làm thực hiện Flyweight pattern, nhưng chỉ cho các giá trị -128 -> 127. Nếu bạn đã thực hiện của bạn Long
bằng 50
bạn thực sự sẽ có hai tham chiếu đến đối tượng hạng ruồi cùng Và một lần nữa, bao giờ sử dụng. == để so sánh chúng)
chỉnh sửa để thêm:. Điều này được nêu cụ thể trong ngôn ngữ Java Specification, Section 5.1.7:
Nếu p giá trị được đóng hộp là đúng, sai, một byte, hoặc một char trong phạm vi \ u0000 đến \ u007f, hoặc một số int hoặc ngắn giữa -128 và 127 (bao gồm), sau đó cho r1 và r2 là kết quả của bất kỳ chuyển đổi đấm bốc nào của p. Nó luôn luôn là trường hợp r1 == r2.
Lưu ý rằng long
là không đặc biệt đề cập nhưng Oracle và OpenJDK triển khai hiện tại làm như vậy (1.6 và 1.7), mà lại là một lý do để bao giờ sử dụng ==
Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);
Đầu ra:
đúng
false
Nguồn
2012-01-23 07:32:27
Hi Brian! Cảm ơn câu trả lời, nhưng bạn có thể cho tôi biết nơi tôi có thể tìm thấy lời giải thích này về phạm vi này (-128 -> 127)? –
@RenatoLochetti Phần này được đề cập trong phần [Java Language Spec (JLS) 5.1.7 - đoạn cuối cùng] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls -5.1.7). Đó là triển khai [Mẫu cân thừa] (http://en.wikipedia.org/wiki/Flyweight_pattern) –
@RenatoLochetti Câu hỏi đã chỉnh sửa để mở rộng về chủ đề. –