2011-12-08 34 views
19

thể trùng lặp:
Integer wrapper objects share the same instances only within the value 127?Tại sao == đúng đối với một số đối tượng Integer?

tôi đã sao chép đoạn mã chương trình sau đây từ Khalid Mughal SCJP, nhưng tôi không thể
hiểu đầu ra.

public class RQ200_60 { 
    public static void main(String[] args) { 
     Integer i = -10; 
     Integer j = -10; 
     System.out.print(i==j);   // output: true -- why true? 
     System.out.print(i.equals(j)); // output: true 
     Integer n = 128; 
     Integer m = 128; 
     System.out.print(n==m);   // output: false 
     System.out.print(n.equals(m)); // output: true 
    } 
}  

Chương trình trên đưa ra kết quả đúng cho câu lệnh in đầu tiên nhưng phải giả mạo vì đó là so sánh tham chiếu với toán tử quan hệ ==. Nhưng bản in thứ ba là sai và tôi không hiểu sự mâu thuẫn này.

Giải thích được đánh giá cao!

+1

http://stackoverflow.com/ câu hỏi/7309640/so sánh hai số nguyên, http://stackoverflow.com/questions/5581913/wrapper-class-and-operator, http://stackoverflow.com/questions/5117132/wrapper-objects-share-the- cùng một địa chỉ-không gian-chỉ-trong-the-giá trị-127, http://stackoverflow.com/questions/5865056/integer-construction-variations –

Trả lời

33

Trong trường hợp đầu tiên, cả hai đối tượng ij đều trỏ đến cùng một đối tượng được lưu trong bộ nhớ cache. Theo mặc định, phạm vi giữa -128 và 127 được lưu trữ dưới dạng đối tượng Integer. Chúng tôi có thể tăng phạm vi bằng cách sử dụng JVM arguments

+5

+1 Thú vị, không biết đó là cấu hình. –

+3

Tôi cũng không biết nó có thể cấu hình được. Các giá trị được tự động hóa từ -128 đến 127 * phải * giống nhau theo [JLS 5.1.7] (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7) – yshavit

8

Đối tượng nguyên bản có thể được lưu vào bộ nhớ cache cho những giá trị đại diện cho giá trị gần bằng 0. (Đặc điểm kỹ thuật để triển khai có thể cho bạn biết một số chi tiết). Điều này có lẽ là để tiết kiệm bộ nhớ (các giá trị gần bằng 0 là phổ biến, và nó sẽ lãng phí rất nhiều bộ nhớ để tạo một đối tượng mới cho mọi biến có cùng giá trị).

== kiểm tra xem hai thứ có cùng một đối tượng hay không; bạn có thể hoặc không thể có cùng một đối tượng Integer cho bất kỳ hai biến nhất định nào có cùng giá trị. Bạn không được phép kiểm tra với == vì bạn là không được coi là quan tâm cho dù đó là cùng một đối tượng; đó là giá trị của một số Integer quan trọng, không phải là danh tính của nó.

11

Câu trả lời về bộ nhớ đệm là chính xác. Tuy nhiên, nếu bạn đi ...

Integer i = new Integer(10); 
Integer j = new Integer(10); 

... thì bạn tránh bộ nhớ đệm và kết quả sẽ là những gì bạn mong đợi.

+0

@pst cảm ơn bạn đã chỉnh sửa. Gõ vào Nook của tôi hơi khó xử. – user949300

1

đây trong trường hợp này Integer iInteger j giữ các giá trị số nguyên mà thuộc phạm vi của số nguyên, phạm vi của một Integer-128 to 128, và Integer nInteger m vượt quá phạm vi của Integer

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