2012-02-17 32 views
8

thể trùng lặp:
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?java == cho Integer

tôi đã tìm thấy các hành vi sau đây == cho các đối tượng Integer và tôi không hiểu nó. (Tôi cũng nhận thức được rằng ta nên sử dụng tương đương để so sánh như vậy, nhưng tôi đang học cho OCPJP ...)

On ngắn, == công trình như mong đợi cho 1000, nhưng không phải cho 10

Cựu đoạn mã là:

Integer i1 = 1000; 
Integer i2 = 1000; 
if(i1 != i2) System.out.println("different objects"); 
if(i1.equals(i2)) System.out.println("meaningfully equal"); 

và nó cư xử như người ta mong đợi:

different objects 
meaningfully equal 

sau đó mặc dù:

Integer i3 = 10; 
Integer i4 = 10; 
if(i3 == i4) System.out.println("same object"); 
if(i3.equals(i4)) System.out.println("meaningfully equal"); 

có đầu ra sau đây:

same object 
meaningfully equal 

Ai đó có thể vui lòng giải thích lý do tại sao điều này xảy ra?

+1

BTW Hãy thử với '-XX: + AggressiveOpts' và là người đầu tiên sẽ cư xử như thứ hai, như nó làm tăng kích thước của bộ đệm Integer. ;) –

Trả lời

11

Vì Java 5, bộ đệm ẩn lớp bao bọc đã được giới thiệu. Sau đây là kiểm tra bộ đệm được tạo bởi lớp bên trong, IntegerCache, nằm trong bộ nhớ đệm Integer. Ví dụ, đoạn mã sau sẽ tạo ra một bộ nhớ cache:

Integer myNumber = 10 

hoặc

Integer myNumber = Integer.valueOf(10); 

256 đối tượng Integer được tạo ra trong khoảng từ -128 đến 127 mà đều được lưu trữ trong một mảng Integer. Chức năng bộ nhớ đệm này có thể được nhìn thấy bằng cách xem lớp bên trong, IntegerCache, được tìm thấy trong Integer:

Vì vậy, khi tạo một đối tượng bằng cách sử dụng Integer.valueOf hoặc trực tiếp gán giá trị cho một số nguyên trong phạm vi -128 đến 127 cùng một đối tượng sẽ được trả về. Do đó, hãy xem xét ví dụ sau:

Integer i = 100; 
Integer p = 100; 
if (i == p) 
    System.out.println("i and p are the same."); 
if (i != p) 
    System.out.println("i and p are different."); 
if(i.equals(p)) 
    System.out.println("i and p contain the same value."); 

Đầu ra là:

i and p are the same. 
i and p contain the same value. 

Điều quan trọng cần lưu ý rằng đối tượng i và p chỉ tương đương với đúng bởi vì họ là những đối tượng cùng là, so sánh không phải là dựa trên giá trị, nó dựa trên sự bình đẳng đối tượng. Nếu Integer i và p nằm ngoài phạm vi -128 hoặc 127 thì bộ đệm không được sử dụng, do đó các đối tượng mới sẽ được tạo. Khi so sánh giá trị luôn sử dụng phương thức “.equals”. Nó cũng quan trọng cần lưu ý rằng instantiating một Integer không tạo bộ nhớ đệm này.

Hãy nhớ rằng “==” luôn được sử dụng cho bình đẳng đối tượng, nó đã không được quá tải để so sánh giá trị không có hộp bọc