2010-10-27 47 views
6

tôi cố định một vòng lặp vô tận bằng cách thay đổi Integer để int trong những điều sau đây:So sánh Integer đối tượng vs int

public class IntTest { 
    public static void main(String[] args) { 
     Integer x=-1; 
     Integer total=1000; 

     while(x != total){ 
      System.out.println("x =" + x + "total ="+ total); 
      x++; 
     } 
    } 
} 

những lý do chính đáng cho điều này là gì? Tôi figured Integer sẽ so sánh không có vấn đề.

Cảm ơn.

+0

Bạn cũng có thể đã thay đổi "x! = Total" thành "total! = X". – DJClayworth

+0

Thanh toán http://www.javapractices.com/topic/TopicAction.do?Id=197 –

Trả lời

17

Vì khi bạn thực hiện! = So sánh trên đối tượng, nó so sánh các tham chiếu. Và các tham chiếu giữa hai đối tượng trong trường hợp chung là khác nhau.

Khi bạn so sánh int, nó luôn so sánh nguyên thủy, cho phép nói không tham chiếu (không có đối tượng), nhưng giá trị.

Vì vậy, nếu bạn muốn làm việc với Integer, bạn phải sử dụng equals() trên chúng.

Ngoài ra, nếu giá trị của bạn nằm trong khoảng từ 0 đến 255, so sánh giữa Số nguyên hoạt động tốt, do bộ nhớ đệm.

Bạn có thể đọc ở đây: http://download.oracle.com/javase/tutorial/java/data/numberclasses.html

+4

Mặt khác, nếu bạn sử dụng! = Giữa một số nguyên và một int, tự động unboxing sẽ cho bạn kết quả bạn mong đợi. – Powerlord

+0

Làm thế nào để so sánh một nguyên thủy và một đối tượng, như int và Integer? Có thể trong java – Bionix1441

2

Vấn đề là Integer là một lớp và do đó thậm chí so sánh được thực hiện giống như đối với bất kỳ lớp nào khác - sử dụng phương thức .equals(). Nếu bạn so sánh nó bằng cách sử dụng ==, bạn so sánh các tham chiếu luôn khác nhau cho hai trường hợp riêng biệt. Kiểu nguyên thủy int không phải là một lớp mà là một kiểu dựng sẵn Java và so sánh do đó được xử lý đặc biệt bởi trình biên dịch và hoạt động như mong đợi.

1

Integer là một wrapper lớp xung quanh Java kiểu nguyên thủy int. Chúng không giống nhau. bạn nên sử dụng int thay vì Integer trừ khi bạn có một lý do chính đáng (như ArrayList<Integer> list;

5

Integer là một Object, và các đối tượng được so sánh với .equals(..)

Chỉ nguyên thủy được so sánh với ==

Đó là quy tắc, ngoài một số trường hợp đặc biệt, trong đó ==có thể được sử dụng để so sánh các đối tượng.Nhưng ngay cả khi không được khuyến khích, hãy tham khảo

2

Bạn có thể sử dụng Int eger.intValue() để lấy giá trị int để so sánh, nếu bạn thực sự cần sử dụng Integer.