2012-09-22 44 views
28

Tôi có đoạn mã sau:So sánh Integer đối tượng

public class Test { 

    public static void main(String[] args) { 

     Integer alpha = new Integer(1); 
     Integer foo = new Integer(1); 

     if(alpha == foo) { 
      System.out.println("1. true"); 
     } 

     if(alpha.equals(foo)) { 
      System.out.println("2. true"); 
     } 

    } 

} 

Kết quả như sau:

2. true 

Tuy nhiên thay đổi loại của một Integer object để int sẽ sản xuất một sản lượng khác nhau, ví dụ:

public class Test { 

    public static void main(String[] args) { 

     Integer alpha = new Integer(1); 
     int foo = 1; 

     if(alpha == foo) { 
      System.out.println("1. true"); 
     } 

     if(alpha.equals(foo)) { 
      System.out.println("2. true"); 
     } 

    } 

} 

Kết quả mới:

1. true 
2. true 

Làm sao điều này có thể như vậy? Tại sao mã đầu ra ví dụ đầu tiên không phải là 1. true?

+5

Bạn có chắc chắn rằng đầu ra đầu tiên không phải là 2. đúng không? Nếu không, không có gì có ý nghĩa. – ILMTitan

+0

Có, xin lỗi, định dạng đã thay đổi từ 2 thành 1. –

+2

Có thể trùng lặp: [Khi so sánh hai số nguyên trong Java, tính năng tự động hủy hộp thoại xuất hiện?] (Http://stackoverflow.com/q/1514910/1164465) –

Trả lời

31

Đối với các loại tham chiếu, == kiểm tra xem các tham chiếu có bằng nhau hay không, tức là liệu chúng có trỏ đến cùng một đối tượng hay không.

Đối với các loại nguyên thủy, == kiểm tra xem các giá trị có bằng nhau hay không.

java.lang.Integer là loại tham chiếu. int là kiểu nguyên thủy.

Chỉnh sửa: Nếu một toán hạng thuộc loại nguyên thủy và loại khác của loại tham chiếu mở hộp đến loại nguyên thủy phù hợp, == sẽ so sánh giá trị chứ không phải tham chiếu.

+0

Cảm ơn bạn, điều này đã xóa tôi. –

+6

+1 cho câu hỏi và câu trả lời. Chỉ cần để đảm bảo: trong tình huống '(Integer == int)' hoặc '(int == Integer)' nó sẽ luôn luôn được unboxed để '(int == int)' không autoboxed để '(Integer == Integer)'? – Pshemo

+0

@Pshemo: Đúng. – meriton

4

== để kiểm tra đối tượng nếu tham chiếu giống nhau tại sao nó trả về false cho Integers. Tuy nhiên, đối với các kiểu cơ bản (ints, float, ...) nó kiểm tra sự bình đẳng, đó là lý do tại sao bạn nhận được sự thật.

Tôi nên đề cập rằng trong trường hợp đầu tiên, nơi bạn so sánh một số nguyên và int, int được chuyển thành đối tượng Integer (autoboxing), và sau đó so sánh tham chiếu xảy ra. Vì chúng khác nhau, nó trả về false.

7

Đối tượng nguyên là đối tượng. Điều này nghe có vẻ hợp lý, nhưng là câu trả lời cho câu hỏi. Các đối tượng được tạo bằng Java sử dụng từ khóa new và sau đó được lưu trữ trong bộ nhớ. Khi so sánh, bạn so sánh vị trí bộ nhớ của các đối tượng, không phải giá trị/thuộc tính của các đối tượng.

Sử dụng phương pháp .equals(), bạn thực sự so sánh các giá trị/thuộc tính của các đối tượng, không phải vị trí của họ trong bộ nhớ:

new Integer(1) == new Integer(1) lợi nhuận false, trong khi lợi nhuận new Integer(1).equals(new Integer(1))true.


int s là một kiểu nguyên thủy của java. Khi bạn tạo một int, tất cả những gì được tham chiếu là giá trị. Khi bạn so sánh bất kỳ kiểu nguyên thủy nào trong Java, tất cả những gì được so sánh là giá trị, không phải là vị trí bộ nhớ. Đó là lý do tại sao 5 == 5 luôn trả về giá trị đúng.

Khi bạn so sánh đối tượng Integer với loại nguyên thủy, đối tượng được truyền sang loại nguyên thủy, nếu có thể. Với một số Integerint điều này là có thể, vì vậy chúng được so sánh. Đó là lý do tại sao Integer(1).equals(1) trả về true.

+0

+1 để giải thích rõ ràng. – HybrisFreelance

1

Integer == int đây tự động đấm bốc áp dụng (vì vậy Integer chuyển đổi sang int trước khi so sánh) để đúng .. nhưng Integer Integer == đây đối tượng so sánh như vậy là tài liệu tham khảo khác nhau nên sai ..

0

dụ đầu tiên: Sử dụng toán tử == giữa các đối tượng kiểm tra tính bình đẳng tham chiếu và vì bạn đang so sánh hai đối tượng khác nhau nên chúng không bằng nhau.

Ví dụ thứ hai: Khi sử dụng == giữa loại trình bao bọc (Số nguyên, Dài, v.v ...) và loại số (int, long, v.v.) loại trình bao bọc không được hộp và kiểm tra bình đẳng được thực hiện giữa hai loại số nguyên thủy (Tức là giữa intint). Tính năng unboxing là một phần của quảng cáo số nhị phân, đọc thêm tại đây: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2

1

Bạn sẽ sử dụng new Integer(1) để tạo đối tượng mới mỗi lần mặc dù nó có cùng giá trị. '==' kiểm tra xem các đối tượng có giống nhau hay không, không phải giá trị dữ liệu. Trong trường hợp của bạn, bạn có thể đã kiểm tra giá trị như sau:

if(alpha.intValue() == foo.intValue()) { 
// 
} 
Các vấn đề liên quan