Long vs Integer, dài vs int, dùng gì và khi nào?


135

Đôi khi tôi thấy API sử dụng longhoặc Longhoặc inthoặc Integer, và tôi không thể tìm ra quyết định được đưa ra cho điều đó như thế nào?

Khi nào tôi nên chọn cái gì?

Câu trả lời:


191

LongObjecthình thức của long, và Integerlà hình thức đối tượng của int.

Việc longsử dụng 64 bit . Việc intsử dụng 32 bit và do đó chỉ có thể giữ các số lên tới ± 2 tỷ (-2 31 đến +2 31 -1).

Bạn nên sử dụng longint, ngoại trừ nơi bạn cần sử dụng các phương thức được kế thừa từ Object, chẳng hạn như hashcode. Java.util.collectionscác phương thức thường sử dụng các Objectphiên bản được đóng hộp (loại bỏ), bởi vì chúng cần hoạt động cho bất kỳ Object, và một kiểu nguyên thủy, như inthoặc long, không phải là một Object.

Một điểm khác biệt nữa là longintgiá trị truyền qua , trong khi đó LongIntegergiá trị tham chiếu qua , giống như tất cả các loại Java không nguyên thủy. Vì vậy, nếu có thể sửa đổi một Longhoặc Integer(không phải, chúng không thể thay đổi mà không sử dụng mã JNI), sẽ có một lý do khác để sử dụng cái này hơn cái kia.

Một sự khác biệt cuối cùng là một Longhoặc Integercó thể null.


5
@Borealid, điều này thật sai lầm, Java luôn được truyền theo giá trị, không có gì như truyền qua tham chiếu trong Java.
Diego Ramos

9
À hả Được rồi, hãy khám phá ý tưởng rằng Java không bao giờ vượt qua một tài liệu tham khảo. Nếu tôi gọi một hàm cung cấp cho nó một int [2], và sau đó bên trong hàm tôi thay đổi giá trị được giữ trong phần tử đầu tiên của mảng đó, liệu trình gọi của hàm có thấy sự thay đổi đó không? Đúng? Vâng, bởi vì những gì được truyền cho hàm không phải là các giá trị trong mảng, mà là một tham chiếu đến các giá trị đó. "Truyền theo giá trị" có nghĩa là dữ liệu thực tế đang được sao chép xung quanh mà không có sự gián tiếp. Bất cứ ai đã dạy bạn rằng Java là giá trị truyền qua đã làm bạn mất tinh thần.
Borealid

3
@Borealid bạn không chính xác, giá trị bị thay đổi vì một bản sao mới của tham chiếu đến mảng đã được tạo, đó là lý do tại sao bất cứ ai đang gọi hàm sẽ thấy thay đổi, điều này vẫn được truyền theo giá trị. Tôi không thể tin rằng bạn nói rằng có thông qua tham chiếu trong Java. Bạn không bao giờ vượt qua các tham chiếu ban đầu cho chức năng.
Diego Ramos

6
Trong một thế giới lý thuyết nơi Java hành xử hoàn toàn khác với cách nó thực sự hoạt động và việc truyền một đối tượng hoặc mảng cho một hàm dẫn đến một bản sao hoàn toàn riêng biệt (trong đó các sửa đổi bên trong hàm không được phản ánh cho người gọi), bạn sẽ thế nào mô tả ngôn ngữ? Hãy nhớ rằng những gì chúng ta đang nói hoàn toàn không phải là những gì Java thực sự làm.
Borealid

2
@DiegoRamos nói đúng. Java luôn được truyền theo giá trị, sự nhầm lẫn được tạo ra bởi vì giá trị khi không nguyên thủy là tham chiếu bộ nhớ, hoán đổi tĩnh không hoạt động trong java, chi tiết hơn ở đây: journaldev.com/3884/ Khăn
Panthro

28

Có một vài điều bạn không thể làm với kiểu nguyên thủy:

  • Có một nullgiá trị
  • đồng bộ hóa trên chúng
  • Sử dụng chúng làm tham số kiểu cho một lớp chung và liên quan đến điều đó:
  • Truyền chúng cho một API hoạt động với Objects

Trừ khi bạn cần bất kỳ thứ gì trong số đó, bạn nên thích các kiểu nguyên thủy, vì chúng cần ít bộ nhớ hơn.


24
  • Theo mặc định sử dụng một int, khi giữ số.
  • Nếu phạm vi intquá nhỏ, sử dụng mộtlong
  • Nếu phạm vi longquá nhỏ, sử dụngBigInteger
  • Nếu bạn cần xử lý các số của mình dưới dạng đối tượng (ví dụ: khi đặt chúng vào Collection, xử lý null, ...) hãy sử dụng Integer/ Longthay thế

13

An intlà số nguyên 32 bit; a longlà số nguyên 64 bit. Cái nào sẽ sử dụng phụ thuộc vào số lượng lớn mà bạn muốn làm việc với.

intlonglà các kiểu nguyên thủy, trong khi IntegerLonglà các đối tượng. Các kiểu nguyên thủy hiệu quả hơn, nhưng đôi khi bạn cần sử dụng các đối tượng; ví dụ, các lớp học tập của Java chỉ có thể làm việc với các đối tượng, vì vậy nếu bạn cần một danh sách các số nguyên bạn có để làm cho nó một List<Integer>, ví dụ (bạn không thể sử dụng inttrong một Listtrực tiếp).


6

Số nguyên là loại số nguyên 32 bit đã ký

  • Được ký hiệu là Int
  • Kích thước = 32 bits (4byte)
  • Có thể giữ số nguyên của phạm vi -2,147,483,648 to 2,147,483,647
  • giá trị mặc định là 0


Long là loại số nguyên 64 bit đã ký

  • Được ký hiệu là Long
  • Kích thước = 64 bits (8byte)
  • Có thể giữ số nguyên của phạm vi -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • giá trị mặc định là 0L


Nếu việc sử dụng biến của bạn rơi vào phạm vi 32 bit, hãy sử dụng Int, sử dụng khác long. Thông thường dài được sử dụng cho các tính toán khoa học và những thứ như thế cần nhiều độ chính xác. (ví dụ: giá trị của pi).

Một ví dụ về việc chọn cái khác là trường hợp của YouTube. Đầu tiên, họ xác định bộ đếm lượt xem video là một intbộ lọc bị tràn khi hơn 2.147.483.647 lượt xem được nhận vào một video phổ biến. Do bộ Intđếm không thể lưu trữ bất kỳ giá trị nào nhiều hơn phạm vi của nó, YouTube đã thay đổi bộ đếm thành biến 64 bit và hiện có thể đếm tới 9.223.372.036.854.775.880 lượt xem. Hiểu dữ liệu của bạn và chọn loại phù hợp với biến 64 bit sẽ chiếm gấp đôi bộ nhớ so với biến 32 bit.


1

Khi nói đến việc sử dụng một số rất dài có thể vượt quá 32 bit để thể hiện, bạn có thể sử dụng lâu để đảm bảo rằng bạn sẽ không có hành vi lạ.

Từ Java 5, bạn có thể sử dụng các tính năng trong quyền anh và quyền anh để làm cho việc sử dụng int và Integer hoàn toàn giống nhau. Nó có nghĩa là bạn có thể làm:

int myInt = new Integer(11);
Integer myInt2 = myInt;

Trong và ngoài đấm bốc cho phép bạn chuyển đổi giữa int và Integer mà không cần bất kỳ chuyển đổi bổ sung (tương tự cho Long, Double, Shortquá)

Bạn có thể sử dụng intmọi lúc, nhưng Integerchứa một số phương thức trợ giúp có thể giúp bạn thực hiện một số thao tác phức tạp với số nguyên (chẳng hạn như Integer.parseInt(String))


0

a) Lớp đối tượng "Dài" so với kiểu nguyên thủy "dài". (Ít nhất là trong Java)

b) Có các kích thước bộ nhớ khác nhau (thậm chí không rõ ràng) của các loại nguyên thủy:

Java - tất cả đều rõ ràng: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • byte, char .. 1B .. 8b
  • ngắn int .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • dài int .. 8B .. 64b

C .. chỉ lộn xộn: https://en.wikipedia.org/wiki/C_data_types

  • ngắn .. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • dài .. .. 32b
  • dài dài .. 64b .. lộn xộn! : - /

Điều này không trả lời câu hỏi, đó là về sự khác biệt giữa Dài và dài, v.v.
GreenAsJade

Không, nó không trả lời rõ ràng, không nói rõ ràng sự khác biệt giữa các kiểu nguyên thủy so với các đối tượng kiểu dữ liệu, thực sự là @GreenAsJade, vì câu hỏi ở trên không nêu bất kỳ ngôn ngữ cụ thể nào. Vì vậy, tôi đã cung cấp một so sánh - để mọi người có thể kiểm tra sự khác biệt. (từ dữ liệu cứng, như được cung cấp)
Franta

Câu hỏi nêu Java.
GreenAsJade
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.