2015-04-26 12 views
5
public class AutoBoxingAndUnBoxing 
{ 
    public static void main(String[] args) 
    { 
     Integer x = 127; 
     Integer y = 127; 
     System.out.println(x == y);//true 

     Integer a = 128; 
     Integer b = 128; 
     System.out.println(a == b);//false 
     System.out.println(a); // prints 128 
    } 
} 

Tại sao x==y là đúng và a==b là sai? Nếu nó dựa trên giá trị (Integer -128 To 127) thì 'a' sẽ in -128 phải không?so sánh tham khảo sử dụng == nhà điều hành

+2

Phạm vi của 'Số nguyên' là -2^31 đến 2^31 - 1. Nó không phải là -128 đến 127; đó là phạm vi của một 'byte'. –

Trả lời

2

Khi so sánh Integer đối tượng, toán tử == chỉ hoạt động đối với các số trong khoảng từ [-128,127]. Nhìn vào JLS:

Nếu p giá trị được đóng hộp là đúng, sai, một byte, hoặc một char trong loạt \ u0000 để \ u007f, hoặc một int hoặc số ngắn giữa -128 và 127 (bao gồm), sau đó cho r1 và r2 là kết quả của hai chuyển động bất kỳ là của p. Nó luôn luôn là trường hợp r1 == r2.

Vì giá trị bạn so sánh không nằm trong phạm vi được đề cập, kết quả sẽ được đánh giá là false trừ khi bạn sử dụng Integer#equals.

+0

ok nhưng giá trị sau 127 là bao nhiêu thì phạm vi từ -128 đến 127? – kittu

+0

@kittu ý của bạn là "giá trị" là gì? Các giá trị này được lưu trong bộ nhớ cache do các vấn đề hiệu suất, các giá trị nằm ngoài phạm vi đó phải được so sánh bằng 'bằng'. – Maroun

+0

Tôi có nghĩa là làm thế nào 'a == b' là sai trong trường hợp của tôi? Điều gì đang xảy ra bên trong để làm cho nó sai? :/ – kittu

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