2012-08-30 38 views
5

thể trùng lặp:
Integer wrapper objects share the same instances only within the value 127?
How != and == operators work on Integers in Java?kết quả bất ngờ khi so sánh ints

tôi đã cố gắng để so sánh hai ints với các trường hợp sau và có kết quả bất ngờ

  1. khi tôi làm follo cánh, @@@ đã được in.

    class C { 
        static Integer a = 127; 
        static Integer b = 127; 
        public static void main(String args[]){ 
        if(a==b){ 
         System.out.println("@@@"); 
        } 
        } 
    } 
    
  2. khi tôi làm như sau, @@@ không được in.

    class C { 
        static Integer a = 145; 
        static Integer b = 145; 
        public static void main(String args[]){ 
        if(a==b){ 
         System.out.println("@@@"); 
        } 
        } 
    } 
    

bất cứ ai có thể cho tôi biết những gì có thể là lý do.

+0

Nếu ai đó có thể định dạng it..I là không thể ... – Rookie

+4

thể trùng lặp của [Integer đối tượng bao bọc chia sẻ các trường hợp tương tự chỉ trong vòng giá trị 127?] (http://stackoverflow.com/questions/5117132/integer-wrapper-objects-share-the-same-instances-only-within-the-value-127) và [Số nguyên mới so với giá trịOf] (http://stackoverflow.com/questions/2974561) và [Hành vi không nhất quán trên java ==] (http://stackoverflow.com/questions/1148805) và [đối tượng bao bọc Integer chia sẻ cùng một trường hợp chỉ trong giá trị 127?] (http://stackoverflow.com/questions/5117132) và ... –

+2

Thêm chi tiết nếu bạn quan tâm http://vanillajava.blogspot.co.uk/2012/01/surprise-results-of-autoboxing.html –

Trả lời

8

Bạn đang so sánh danh tính của đối tượng. Đối với các giá trị nhỏ hơn 128, lớp Integer lưu trữ các đối tượng của nó. Đó là lý do tại sao nó bằng nhau trong ví dụ đầu tiên. Ví dụ khác là với các giá trị cao hơn không được lưu trữ.

Khi @niklon chỉ ra đó cũng là đường viền dưới -128 cho bộ nhớ đệm.

Đường viền trên có thể được điều chỉnh với máy ảo VM -Djava.lang.Integer.IntegerCache.high=4711.

Đọc thêm trong bài đăng blog thú vị Phêrô: http://vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html

+0

Điều đó có xảy ra với mọi lớp trình bao bọc khác không? –

+1

Bằng cách này, giới hạn dưới cho bộ đệm ẩn Integer là -128. – niklon

+1

@niklon, Đây là chi tiết triển khai. [Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29) nói "Phương pháp này sẽ luôn luôn lưu các giá trị trong phạm vi -128 127, bao gồm, ** và có thể lưu các giá trị khác ngoài phạm vi này. ** " –

5

Bạn không so sánh int s, bạn đang so sánh các đối tượng để tham khảo bình đẳng. Sử dụng .equals hoặc sử dụng loại int thay vì Object.

+1

/Sau đó tại sao nó in "@@@" trong trường hợp đầu tiên ..? – Rookie

+2

@Raghav, bởi vì nhiều phiên bản của Java [ghi nhớ nhỏ 'Integer' s] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29) : "Phương thức này sẽ luôn lưu các giá trị trong phạm vi từ -128 đến 127, bao gồm và có thể lưu các giá trị khác ngoài phạm vi này". –

1

Tại đây bạn đang sử dụng Integer đối tượng thay vì int nguyên thủy. Do đó, bạn nên so sánh hai trường hợp với .equals(...) như trái ngược với ==. Nếu bạn đã sử dụng kiểu nguyên thủy thay vào đó, bạn sẽ sử dụng ==. Điều quan trọng cần lưu ý là, khi giao dịch với các đối tượng, == so sánh các tham chiếu của hai đối tượng, chứ không phải giá trị thực

1

Sử dụng if(a.equals(b)) và không sử dụng == để so sánh các đối tượng đó là lớp con của lớp Object.

== điều hành chỉ dành cho các kiểu dữ liệu như int, long, etc.

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