2012-01-23 11 views
29

Tại sao mã bên dưới trả về false cho long3 == long2 so sánh mặc dù nó là chữ.java So sánh kiểu dữ liệu dài

public class Strings { 

    public static void main(String[] args) { 
     Long long1 = 256L + 256L; 
     Long long2 = 512L; 
     Long long3 = 512L; 
     System.out.println(long3 == long2); 
     System.out.println(long1.equals(long2)); 
    } 
} 

Trả lời

58

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 longkhô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

+0

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)? –

+1

@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) –

+1

@RenatoLochetti Câu hỏi đã chỉnh sửa để mở rộng về chủ đề. –

3

Bạn cũng có thể nhận được giá trị nguyên thủy ra khỏi đối tượng dài sử dụng:

str.longValue() 
3

Nếu bạn muốn làm

 str3==str2 

làm như thế này ..

 str3.longValue()==str2.longValue() 

Điều này phục vụ mục đích của bạn và nhanh hơn nhiều bởi vì bạn đang so sánh hai nguyên thủy ty giá trị pe không phải là đối tượng.

0

Đây là lớp Wrapper nên dòng dưới đây sẽ so sánh tham chiếu chứ không phải nội dung.

long3 == long2

của nó luôn luôn tốt hơn để so sánh với ** .longValue() ** như dưới đây

long3.longValue() == long2.longValue()

Nếu chúng ta sử dụng trong xây dựng phương pháp tương đương() đó cũng sẽ làm tương tự điều với kiểm tra null.

long3.equals(long2)

Dưới đây là việc thực hiện nội bộ của equals() trong java

public boolean equals(Object obj) { 
    if (obj instanceof Long) { 
     return value == ((Long)obj).longValue(); 
    } 
    return false; 
}