Long vs Integer,long vs int,什么时候使用什么?


135

有时我看到API正在使用longLongintInteger,但我不知道如何做出决定?

我什么时候应该选择什么?

Answers:


191

Long是的Object形式longInteger是的对象形式int

long采用64位。在int使用32位,所以只能容纳人数达到±2十亿(-2 31到2 31 -1)。

您应该使用longint,除非需要使用继承自的方法Object,例如hashcodeJava.util.collections方法通常使用带框(Object-wrapped)版本,因为它们需要适用于任何版本Object,并且基本类型(例如intlong)不是Object

另一个区别是longint都是传递值,而LongInteger引用传递值,就像所有非原始Java类型一样。因此,如果可以修改LongInteger(不是,不使用JNI代码,它们是不可变的),则还有另一个理由使用一个或另一个。

最后的区别是a LongInteger可以是null


5
@Borealid,这是非常错误的,Java总是按值传递,Java中没有诸如引用传递之类的东西。
迭戈·拉莫斯

9
嗯?好的,让我们探讨一下Java从不通过引用的想法。如果我调用一个给它一个int [2]的函数,然后在该函数内部更改该数组的第一个元素中保存的值,该函数的调用者是否会看到该更改?是?那是因为传递给函数的不是数组中的值,而是对这些值的引用。“按值传递”表示实际数据本身无间接复制。谁教你Java是按价值传递的,那对你是有害的。
Borealid

3
@Borealid您是错误的,因为创建了对数组引用的新副本,所以更改了值,这就是为什么调用函数的人将看到更改,这仍然是按值传递的。我不敢相信您说Java中有引用传递。您永远不会将原始引用传递给该函数。
迭戈·拉莫斯

6
在理论上,Java的行为与实际行为完全不同,并且将对象或数组传递给函数会导致完全独立的副本(其中函数内的修改根本不会反映给调用者),那么您将如何处理?描述语言?请记住,我们所谈论的完全不是Java实际做什么。
Borealid

2
@DiegoRamos是正确的。Java始终按值传递,因为非原语是内存引用时的值,静态交换在Java中不起作用,所以会产生混乱,请参见此处的更多详细信息:journaldev.com/3884/…–
Panthro,

28

使用基本类型无法完成以下几件事:

  • 有一个null
  • 与他们同步
  • 将它们用作泛型类的类型参数,并与此相关:
  • 将它们传递给与Objects 兼容的API

除非您需要其中任何一种,否则应首选基本类型,因为它们需要较少的内存。


24
  • 默认情况下int,按住数字时使用。
  • 如果范围int太小,请使用long
  • 如果范围long太小,请使用BigInteger
  • 如果您需要将数字作为对象进行处理(例如,将数字放入Collection,处理null...),请使用Integer/ Long代替

13

An int是32位整数;a long是64位整数。使用哪个数字取决于您希望使用多少数字。

intlong是原始类型,而IntegerLong是对象。基元类型更有效,但有时您需要使用对象。例如,Java的集合类只能与对象一起使用,因此,如果您需要一个整数列表,则必须将其设为a List<Integer>(不能直接int在其中使用List)。


6

整数是有符号的32位整数类型

  • 表示为 Int
  • 大小= 32 bits (4byte)
  • 可以容纳范围的整数 -2,147,483,648 to 2,147,483,647
  • 默认值为0


Long是带符号的64位整数类型

  • 表示为 Long
  • 大小= 64 bits (8byte)
  • 可以容纳范围的整数 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • 默认值为0L


如果您使用的变量在32位范围内,请使用Int,否则请使用long。通常将long用于科学计算,诸如此类的东西需要很高的准确性。(例如pi的值)。

YouTube就是其中一个选择一个例子的例子。他们首先将视频观看次数计数器定义为int当流行视频收到的观看次数超过2,147,483,647时溢出。由于Int计数器不能存储超出其范围的任何值,因此YouTube将计数器更改为64位变量,现在最多可以计数9,223,372,036,854,775,807次观看。了解您的数据并选择适合64位变量的类型将比32位变量占用两倍的内存。


1

当涉及到一个非常长的数字(可能超过32位)来表示时,您可以使用很长的时间来确保您不会出现奇怪的行为。

在Java 5中,您可以使用装箱和装箱功能来完全相同地使用int和Integer。这意味着您可以:

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

在进出拳击让您无需任何额外的转换int和整数之间切换(同为LongDoubleShort太)

您可以使用 int它,但Integer其中包含一些帮助程序方法,这些方法可以帮助您对整数进行一些复杂的操作(例如Integer.parseInt(String)


0

a)对象类“ Long”与原始类型“ long”。(至少在Java中)

b)基本类型有不同的(甚至不清楚的)内存大小:

Java-全部清除:https//docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • 字节,char .. 1B .. 8b
  • short int .. 2B .. 16b
  • int .. .. .. .4B .. 32b
  • long int .. 8B .. 64b

C ..只是一团糟:https : //en.wikipedia.org/wiki/C_data_types

  • 短.. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • 长.. .. 32b
  • 长久.. 64b ..一团糟!:-/

这不能回答有关Long和long等之间的区别的问题
。– GreenAsJade

不,它没有明确回答,没有明确说出原始类型与数据类型对象之间的区别,实际上是@GreenAsJade,因为上面的问题没有说明任何特定的语言。因此,我提供了一个比较-每个人都可以检查差异。(根据提供的硬数据)
Franta

问题是Java。
GreenAsJade
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.