Sự khác biệt giữa Integer và int trong Java là gì?


248

Ví dụ tại sao bạn có thể làm:

int n = 9;

Nhưng không:

Integer n = 9;

Và bạn có thể làm:

Integer.parseInt("1");

Nhưng không:

int.parseInt("1");

35
số nguyên là lớp, int là kiểu nguyên thủy
Anycorn

24
Bạn có thể thực hiện Integer n = 9;do tự động hộp thư (trừ khi bạn đang sử dụng phiên bản java rất cũ)
Alderath

Câu trả lời:


320

intlà một loại nguyên thủy. Các biến loại intlưu trữ giá trị nhị phân thực tế cho số nguyên bạn muốn đại diện. int.parseInt("1")không có ý nghĩa vì intkhông một lớp và do đó không có bất kỳ phương pháp.

Integerlà một lớp, không khác với bất kỳ ngôn ngữ Java nào khác. Các biến của kiểu Integerlưu trữ tham chiếu đến Integercác đối tượng, giống như với bất kỳ loại tham chiếu (đối tượng) nào khác. Integer.parseInt("1")là một cuộc gọi đến phương thức tĩnh parseInttừ lớp Integer(lưu ý rằng phương thức này thực sự trả về một intvà không phải là một Integer).

Để cụ thể hơn, Integerlà một lớp với một trường loại duy nhất int. Lớp này được sử dụng khi bạn cần intđược đối xử như bất kỳ đối tượng nào khác, chẳng hạn như trong các kiểu chung hoặc tình huống mà bạn cần vô hiệu.

Lưu ý rằng mọi kiểu nguyên thủy trong Java đều có lớp trình bao bọc tương đương :

  • byteByte
  • shortShort
  • intInteger
  • longLong
  • booleanBoolean
  • charCharacter
  • floatFloat
  • doubleDouble

Các lớp Wrapper kế thừa từ lớp Object và nguyên thủy thì không. Vì vậy, nó có thể được sử dụng trong các bộ sưu tập với tham chiếu Object hoặc với Generics.

Vì java 5, chúng tôi có autoboxing và việc chuyển đổi giữa lớp nguyên thủy và lớp bao bọc được thực hiện tự động. Cẩn thận, tuy nhiên, vì điều này có thể giới thiệu các lỗi tinh vi và các vấn đề hiệu suất; rõ ràng về chuyển đổi không bao giờ làm tổn thương.


6
Trong C#tất cả các loại dữ liệu có "bí danh" và int.Parse()có ý nghĩa (mặc dù thực sự không phải vậy)
Vahid Amiri

22
@ VSG24 ... nhưng đây là một câu hỏi Java và đây là một câu trả lời Java. C#là hoàn toàn không liên quan ở đây.
Darkhogg

3
Ví dụ điển hình có thể là: Lỗi biên dịch: Danh sách <int> Hợp lệ: Danh sách <Integer>
hagai

Kiến thức bổ sung luôn có lợi
sumit sharma

1
Tôi thích học những điều mới, đặc biệt là khi kiến ​​thức có liên quan đến chủ đề hiện tại. Cảm ơn Vahid.
Paul Oliver

30

Integer là một lớp và int là một kiểu nguyên thủy.

Đọc trên tại các liên kết này:


1
Tôi muốn chỉ ra, tôi nghĩ rằng đây là câu trả lời hoàn hảo vì hai lý do: 1- súc tích và chính xác, giữ cho khán giả / người hỏi trong tâm trí 2- Cung cấp hướng để biết thêm chi tiết thay vì đưa tất cả vào văn bản của câu trả lời Không phải tất cả các câu hỏi có thể được trả lời chính xác và chính xác (một số yêu cầu chi tiết và nhiều sắc thái hơn để chính xác và đầy đủ), nhưng tôi nghĩ tất cả các câu trả lời nên cố gắng đơn giản và trực tiếp.
DRich

11
Heh, tôi nghĩ nó thực sự ngược lại. "int là một kiểu nguyên thủy" không cho bạn biết bất cứ điều gì, nếu bạn không biết loại nguyên thủy là gì. (Và nếu bạn làm như vậy, bạn rất có thể biết sự khác biệt giữa int và Integer). Và việc gửi người đọc đến hai liên kết có nhãn "Liên kết 1" và "Liên kết 2" là khá hữu ích, đặc biệt là so với việc chỉ trích dẫn các phần có liên quan.
Steve Bennett

7

Một Integer gần như chỉ là một trình bao bọc cho kiểu int nguyên thủy. Nó cho phép bạn sử dụng tất cả các chức năng của lớp Integer để giúp bạn dễ dàng hơn một chút.

Nếu bạn chưa quen với Java, một thứ bạn nên học để đánh giá cao là tài liệu Java. Ví dụ, bất cứ điều gì bạn muốn biết về Lớp nguyên đều được ghi lại chi tiết.

Đây là tài liệu dành cho lớp Integer:

Lớp Integer bao bọc một giá trị của kiểu nguyên thủy int trong một đối tượng. Một đối tượng kiểu Integer chứa một trường duy nhất có kiểu là int.


7
Điều này phần nào bỏ lỡ điểm. Ví dụ, như Integerlà một lớp, nó có thể được lưu trữ trong các thùng chứa (không giống như các kiểu nguyên thủy).
Oliver Charlesworth

6

Một biến int chứa giá trị nguyên được ký 32 bit. Một số nguyên (có vốn I) giữ một tham chiếu đến một đối tượng của kiểu số nguyên (lớp) hoặc thành null.

Java tự động chuyển giữa hai cái; từ Integer đến int bất cứ khi nào đối tượng Integer xuất hiện dưới dạng đối số cho toán tử int hoặc được gán cho biến int hoặc giá trị int được gán cho biến Integer. Đúc này được gọi là đấm bốc / unboxing.

Nếu một biến số nguyên tham chiếu null được bỏ hộp, rõ ràng hoặc ngầm định, một NullPulumException sẽ bị ném.

(Trong văn bản trên, thuật ngữ "biến" có nghĩa là biến cục bộ, trường hoặc tham số)


5

Integerđề cập đến kiểu trình bao bọc trong Java trong khi đó intlà kiểu nguyên thủy. Tất cả mọi thứ ngoại trừ các kiểu dữ liệu nguyên thủy trong Java đều được triển khai giống như các đối tượng ngụ ý Java là ngôn ngữ lập trình hướng đối tượng thuần túy có trình độ cao. Nếu bạn cần, tất cả các kiểu nguyên thủy cũng có sẵn như các kiểu trình bao bọc trong Java. Bạn có thể có một số lợi ích hiệu suất với các loại nguyên thủy, và do đó các loại trình bao bọc chỉ nên được sử dụng khi cần thiết.

Trong ví dụ của bạn như dưới đây.

Integer n = 9;

hằng số 9được tự động đóng hộp ( auto-boxingunboxingtự động xuất hiện từ đó java 5trở đi) Integervà do đó bạn có thể sử dụng câu lệnh như vậy và cả Integer n = new Integer(9). Điều này thực sự đạt được thông qua tuyên bốInteger.valueOf(9).intValue();


3

int là một kiểu nguyên thủy và không phải là một đối tượng. Điều đó có nghĩa là không có phương pháp liên quan đến nó. Integer là một đối tượng với các phương thức (chẳng hạn như parseInt).

Với java mới hơn có chức năng tự động đấm bốc (và bỏ hộp). Điều đó có nghĩa là trình biên dịch sẽ chèn Integer.valueOf (int) hoặc integ.intValue () khi cần thiết. Điều đó có nghĩa là nó thực sự có thể viết

Integer n = 9;

được hiểu là

Integer n = Integer.valueOf(9);

3

Integer là một lớp bao bọc / Object và int là kiểu nguyên thủy. Sự khác biệt này đóng vai trò rất lớn khi bạn muốn lưu trữ các giá trị int trong một bộ sưu tập, bởi vì chúng chỉ chấp nhận các đối tượng làm giá trị (cho đến jdk1.4). JDK5 trở đi vì autoboxing nó là một câu chuyện hoàn toàn khác.


5
JDK5 + cũng chỉ chấp nhận các đối tượng; chỉ là autoboxing cho phép trình biên dịch tự động gọi Integer.valueOf(i)hoặc Integer.intValue()cho bạn. Collection<int>vẫn sẽ không hoạt động. Vì vậy, nó không phải là một câu chuyện hoàn toàn khác - đó là cùng một câu chuyện, chỉ với một chút tốc ký.
yshavit

đã đồng ý. Xin lỗi, từ ngữ của tôi có thể không phản ánh điều đó.
kosa

3

Trong Java int là kiểu dữ liệu nguyên thủy trong khi Integer là lớp Trình trợ giúp, nó được sử dụng để chuyển đổi cho một loại dữ liệu này sang loại dữ liệu khác.

Ví dụ:

         double doubleValue = 156.5d;
         Double doubleObject  = new Double(doubleValue);
         Byte myByteValue = doubleObject.byteValue ();
         String myStringValue = doubleObject.toString();

Các kiểu dữ liệu nguyên thủy được lưu trữ bộ nhớ khả dụng nhanh nhất trong đó lớp Helper phức tạp và lưu trữ trong bộ nhớ heap.

tài liệu tham khảo từ "David Gassner" Đào tạo thiết yếu Java.


2

intlà một kiểu nguyên thủy đại diện cho một số nguyên. trong khi đó Integerlà một đối tượng mà kết thúc tốt đẹp int. Đối Integertượng cung cấp cho bạn nhiều chức năng hơn, chẳng hạn như chuyển đổi thành hex, chuỗi, v.v.

Bạn cũng có thể sử dụng các khái niệm OOP với Integer. Ví dụ: bạn có thể sử dụng Integer cho generic (ví dụ ).Collection<Integer>


2

Điều này được lấy từ Java: The Complete Reference, Ninth Edition

Java sử dụng các kiểu nguyên thủy (còn gọi là các kiểu đơn giản), như int hoặc double , để giữ các kiểu dữ liệu cơ bản được ngôn ngữ hỗ trợ. Các loại nguyên thủy , thay vì các đối tượng, được sử dụng cho các đại lượng này vì mục đích hiệu suất . Sử dụng các đối tượng cho các giá trị này sẽ thêm một chi phí không thể chấp nhận được vào các phép tính đơn giản nhất. Do đó, các kiểu nguyên thủy không phải là một phần của hệ thống phân cấp đối tượngchúng không kế thừa Object .

Mặc dù lợi ích hiệu suất được cung cấp bởi các loại nguyên thủy, có những lúc bạn sẽ cần một đại diện đối tượng. Ví dụ: bạn không thể truyền loại nguyên thủy bằng cách tham chiếu đến một phương thức . Ngoài ra, nhiều cấu trúc dữ liệu tiêu chuẩn do Java triển khai hoạt động trên các đối tượng, điều đó có nghĩa là bạn không thể sử dụng các cấu trúc dữ liệu (cụ thể đối tượng) này để lưu trữ các kiểu nguyên thủy . Để xử lý các tình huống này (và các tình huống khác), Java cung cấp các trình bao bọc kiểu, là các lớp đóng gói một kiểu nguyên thủy trong một đối tượng.

Các lớp trình bao bọc liên quan trực tiếp đến tính năng tự động hộp của Java . Các hàm bao là Double, Float, Long, Integer, Short, Byte, Character và Boolean . Các lớp này cung cấp một loạt các phương thức cho phép bạn tích hợp đầy đủ các kiểu nguyên thủy vào hệ thống phân cấp đối tượng của Java.


1

Để tối ưu hóa thời gian chạy mã Java, int (các) kiểu nguyên thủy đã được thêm vào float, boolv.v. nhưng chúng đi kèm với các lớp trình bao bọc để nếu cần, bạn có thể chuyển đổi và sử dụng chúng làm đối tượng Java tiêu chuẩn cùng với nhiều tiện ích đi kèm các chức năng (như Integer.parseInt("1")).


1

intlà một kiểu dữ liệu nguyên thủy trong khi Integerlà Kiểu tham chiếu hoặc Kiểu trình bao bọc (Class) trong Java.

sau java 1.5đó giới thiệu khái niệm autoboxingunboxing, bạn có thể khởi tạo cả hai inthoặc Integernhư thế này.

int a= 9
Integer a = 9 // both valid After Java 1.5.

tại sao Integer.parseInt("1");nhưng không int.parseInt("1");??

Integerlà một Class được định nghĩa trong jdkthư viện và parseInt()là một phương thức tĩnh thuộc về IntegerClass

Vì vậy, Integer.parseInt("1");là có thể trong java. nhưng intlà kiểu nguyên thủy (giả sử như một từ khóa) trong java. Vì vậy, bạn không thể gọi parseInt()với int.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.