2012-10-13 33 views
9

Bất kỳ cơ thể nào có thể giải thích cho tôi điều gì đang xảy ra trong đầu ra. Nếu == được sử dụng để so sánh hai ref. biến nó chỉ đơn giản là kiểm tra tham chiếu của nó nếu chúng giống nhau thì nó nhập vào nếu nội dung, thì tại sao địa ngục aa == bb bằng nhau nếu phương thức tĩnh valueOf() và ee == ff không bằng (nếu được) nếu tạo đối tượng của nó bằng cách sử dụng từ khóa mới?operator == hành vi differet trên đối tượng lớp bao bọc

static void main(String args[]) 
{ 
    Integer aa = Integer.valueOf("12"); 
    Integer bb = Integer.valueOf("12"); 
    if(aa==bb)System.out.println("aa==bb"); 
    if(aa!=bb)System.out.println("aa!=bb"); 
    Integer ee = new Integer("12"); 
    Integer ff = new Integer("12"); 


    if(ee==ff)System.out.println("ee==ff"); 
    if(ee!=ff)System.out.println("ee!=ff"); 
} 

Output:

aa == bb

ee = ff

+0

Một bài viết thú vị mô tả sự cố của bạn: http://tech.puredanger.com/2007/02/01/valueof/ –

Trả lời

11

Các == kiểm tra so sánh bình đẳng đối tượng!

Integer.valueOf duy trì bộ nhớ cache của đối tượng nguyên bản với giá trị -128 đến 127 valueOf(String) trả về đối tượng được lưu trong bộ nhớ cache, do đó kết quả so sánh == là đúng.

Integer a1 = new Integer("12"); 
Integer b1 = new Integer("12"); 
//a1 == b1 returns false because they point to two different Integer objects 

Integer aa = Integer.valueOf("12"); 
Integer bb = Integer.valueOf("12"); 
//aa == bb returns true because they point to same cached object 

Đối với comparance các giá trị vật thể luôn luôn sử dụng phương pháp .equals, cho nguyên thủy như int, long vv bạn có thể sử dụng so sánh ==.

+0

câu trả lời hoàn hảo. không biết về điều cache. kiểm tra với 127 và 128 để có kết quả khác nhau. –

+2

Trong câu trả lời của bạn "// a == b là true" không sai bởi vì trừ khi chúng ta tạo String bằng phương thức String() mới, Strings có cùng giá trị trỏ tới cùng một đối tượng String. Bạn có thể vui lòng chạy và kiểm tra một lần. –

+0

@Ivar, sau đó tốt hơn cho ví dụ cho Integer, tại sao bạn đưa ra một câu trả lời sai cho mọi người ?. Vì câu trả lời này có số người cao nhất upvote sẽ nghĩ rằng nó là đúng, nhưng trong thực tế, câu lệnh (// a == b là sai) là sai. Bạn có muốn tôi dán ảnh chụp màn hình không ?. Xem tôi sẽ không đề xuất chỉnh sửa nhưng thay đổi câu trả lời tốt hơn. Và tôi không biết làm thế nào mọi người chỉ đơn giản là upvote câu trả lời mà không đọc câu trả lời hoàn chỉnh và không kiểm tra xem nó là chính xác hay không. Và nếu tôi thay đổi mã thì tôi phải thay đổi toàn bộ câu trả lời. Điều đó giống như xóa mã hoàn chỉnh. –

3

Integer.valueOf duy trì bộ nhớ cache của các số nguyên từ -128 để 127

Đây là mã nguồn của valueOf bạn có thể thấy rõ rằng nó sẽ trả về cùng một đối tượng nếu giá trị Integer là giữa -128 để 127

public static Integer valueOf(int i) { 
    if(i >= -128 && i <= IntegerCache.high) 
     return IntegerCache.cache[i + 128]; 
    else 
     return new Integer(i); 
} 

nên == của bạn trả về giá trị đúng. Nếu giá trị nhiều hơn thế thì nó sẽ luôn trả về cho bạn sai.

Integer aa = Integer.valueOf("1200"); 
    Integer bb = Integer.valueOf("1200"); 
    aa == bb --> false 

Bạn nên thường xuyên kiểm tra bình đẳng sử dụng equals phương pháp

ee.equals(ff); 

Nếu bạn thêm một nếu có dưới

if (ee.equals(ff)) 
     System.out.println("ee equals ff"); 

Output sẽ

ee equals ff 
1

Đối với ee và ff hai đối tượng của Integer được tạo trên heap do đó cả hai đều tham chiếu các đối tượng khác nhau để chúng không bằng nhau khi sử dụng toán tử ==.

1

new Integer("12") tạo đối tượng Số nguyên mới có giá trị 12. Bất kể bạn làm như thế nào khi bạn tạo đối tượng hoàn toàn mới mỗi lần. Đó là lý do tại sao == không hoạt động trong trường hợp thứ hai.

JVM duy trì bộ đệm của đối tượng Số nguyên cho các giá trị được cho là được sử dụng thường xuyên hơn (-128 - 127). Integer.valueOf("12") đằng sau hiện trường cũng giống như vậy (new Integer("12")), nhưng trước khi thực hiện nó sẽ kiểm tra trong bộ đệm đó nếu đối tượng đó đã tồn tại trong bộ nhớ cache, nếu nó làm như vậy thì nó sẽ trả về. nó vào bộ nhớ cache và trả về nó. Đó là lý do tại sao == hoạt động trong trường hợp đầu tiên.

Ngoài ra, đối với các đối tượng, == không bao giờ được sử dụng để kiểm tra bình đẳng, thay vào đó chúng chỉ được sử dụng để kiểm tra danh tính (ví dụ: xem hai biến khác nhau có liên quan đến cùng một đối tượng) không. Để kiểm tra bình đẳng luôn sử dụng phương pháp equals.

+0

Thú vị. Tôi không biết điều gì về bộ nhớ đệm ... cảm ơn :) –

+0

Bạn được chào đón. :) –

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