2012-07-15 44 views
27

Sự khác nhau giữa chúng là gì?.intValue() trong Java là gì?

l là danh sách mảng của loại Integer.

phiên bản 1:

int[] a = new int[l.size()]; 
for (int i = 0; i < l.size(); i++) { 
    a[i] = l.get(i); 
} 
return a; 

phiên bản 2:

int[] a = new int[l.size()]; 
for (int i = 0; i < l.size(); i++) { 
    a[i] = l.get(i).intValue(); 
} 
return a; 

Trả lời

41

l.get(i); sẽ trở lại Integer và sau đó gọi intValue(); vào nó sẽ trả lại số nguyên as type int.

Chuyển đổi int thành Integer được gọi là boxing.
Chuyển đổi số Integer thành int được gọi là unboxing
Và cứ như vậy để chuyển đổi giữa các loại nguyên thủy khác và các lớp Wrapper tương ứng của chúng.

Vì java 5, nó sẽ tự động thực hiện các chuyển đổi cần thiết cho bạn (autoboxing), vì vậy có không có sự khác biệt trong ví dụ của bạn nếu bạn đang làm việc với Java 5 hoặc mới hơn. Điều duy nhất bạn phải chăm sóc là nếu số Integer là không, và bạn trực tiếp gán nó cho int thì nó sẽ ném NullPointerException.

Trước java 5, chính lập trình viên phải làm boxing/unboxing.

+1

Trước Java 5, các lập trình viên cũng sẽ cần phải cast để Integer trước khi gọi intValue. – Thilo

1

get(i) sẽ trả lại Integer đối tượng và sẽ nhận được giá trị của nó khi bạn gọi intValue(). Trong trường hợp đầu tiên, tự động auto-unboxing xảy ra.

5

Đối tượng được trả về bởi l.get (i) là phiên bản của lớp Integer.

intValue() là một phương pháp thể hiện của các Integer lớp trả về một nguyên thủy int.

Xem Java tài liệu tham khảo doc ... http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#intValue()

+0

plus: trong phiên bản 1 JVM áp dụng autoboxing để chuyển đổi cá thể 'Integer' thành kiểu nguyên thủy – hage

+0

tiềm năng nguy hiểm nếu tôi không gọi .intValue() trong trường hợp của tôi. – Timeless

+0

Như đã đề cập bởi hage, Autoboxing nên làm việc cần thiết để bạn không phải lo lắng. Đọc bài viết này về nó, http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html –

0

Nó chỉ là một phương pháp thuận tiện để nhận giá trị nguyên thủy từ đối tượng của Number: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Number.html

xem xét mã:

Integer integerValue = Integer.valueOf(123); 
float floatValue = integerValue.floatValue(); 

Dòng cuối cùng là một phương pháp thuận tiện để thực hiện:

float floatValue = (float)(int)integerValue; 

Vì bất kỳ loại số nào trong Java có thể được đúc một cách rõ ràng với bất kỳ loại số nguyên thủy nào khác, lớp Number thực hiện tất cả các chuyển đổi này.Như thường lệ, một số người trong số họ không có ý nghĩa nhiều:

Integer integerValue = Integer.valueOf(123); 
int intValue = integerValue.intValue(); 
int intValue2 = (int)integerValue; 
int intValue3 = integerValue; 
+2

Bạn không nên sử dụng 'mới Integer (123);' Integer.valueOf (123) được khuyến khích. –

+1

Bất kỳ lý do khách quan nào hoặc chỉ "họ nói như vậy"? – agibalov

+2

Bộ nhớ cache sử dụng Java cho các số nguyên, sử dụng Integer mới, bạn luôn tạo đối tượng mới. Sử dụng valueOf bạn có thể sử dụng giá trị từ bộ nhớ cache. Điều này có mặt tốt và xấu nhưng nói chung nó không phải là cần thiết để có hai đối tượng đại diện cho số một. –

0

Chúng giống hệt nhau. Như các áp phích khác đã đề cập, bạn có thể đặt đối tượng Integer hoặc int nguyên thủy vào mảng. Trong trường hợp đầu tiên, trình biên dịch sẽ tự động chuyển đổi đối tượng Integer thành một nguyên thủy. Đây được gọi là auto-boxing.

+0

vì vậy, java sẽ chuyển đổi Integer thành int tự động bằng cách gọi .intValue() trong trường hợp này? từ một tham chiếu đến loại giá trị? – Timeless

+0

Vâng, đúng vậy. – Jorn

8

Khi bạn nhận thấy, intValue không được sử dụng nhiều khi bạn đã biết bạn có Integer. Tuy nhiên, phương thức này không được khai báo trong Integer, nhưng trong lớp học chung là Number. Trong một tình huống mà tất cả những gì bạn biết là bạn có một số Number, bạn sẽ nhận ra tiện ích của phương thức đó.

3

Hỗ trợ Java hai loại cấu trúc đầu tiên là nguyên thủy, thứ hai là Đối tượng.

Phương thức bạn đang yêu cầu, được sử dụng để truy lục giá trị từ Object đến nguyên thủy.

Tất cả các loại java đại diện cho số mở rộng lớp Number. Các phương thức này không được chấp nhận nếu bạn sử dụng cùng kiểu nguyên thủy và kiểu đối tượng vì [autoboxing] được thực hiện trong Java 1.5.

int - nguyên thủy

Integer - đối tượng

Trước Java 1.5 chúng tôi là lực lượng để viết

int i = integer.intValue();

kể từ Java 1.5 chúng ta có thể viết

int i = integer;

Những phương pháp này cũng được sử dụng khi chúng ta cần phải thay đổi loại của chúng tôi từ Integer để lâu

long l = integer.longValue();