Long vs Integer,long vs int,使用什么以及何时使用?

I k*_*e V 131 java types numbers

有时我看到API使用longLongintInteger,我无法确定如何做出决定?

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

Bor*_*lid 184

LongObject形式long,Integer是对象的形式int.

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

您应该使用longint,除非您需要使用从中继承的方法Object,例如hashcode.Java.util.collections方法通常使用盒装(Object包装)版本,因为它们需要适用于任何版本Object,而原始类型,如intlong,不是Object.

另一个区别是,longint通过按值,而LongInteger通过按基准值,像所有的非原始Java类型.因此,如果可以修改a LongInteger(它不是,它们在不使用JNI代码的情况下是不可变的),那么另一个原因就是使用一个而不是另一个.

最后的区别是a Long或者Integer可能是null.

  • @Borealid 你错了,值被改变是因为创建了对数组的引用的新副本,这就是为什么调用函数的人会看到变化,这仍然是按值传递。我不敢相信你说 Java 中有按引用传递。您永远不会传递对函数的原始引用。 (5认同)
  • 嗯?好的,让我们探讨一下Java从不通过引用的想法。如果我调用给它一个int [2]的函数,然后在函数内部更改该数组的第一个元素中保存的值,该函数的调用者是否会看到该更改?是?那是因为传递给函数的不是数组中的值,而是对这些值的引用。“按值传递”表示实际数据本身无间接复制。谁教你Java是按价值传递的,那对你是有害的。 (4认同)
  • @DiegoRamos 是对的。Java总是按值传递,混淆是因为非原始值是内存引用,静态交换在Java中不起作用,更多细节在这里:https://www.journaldev.com/3884/java-is-按值传递而不是按引用传递 (4认同)
  • 实际上,java只是“按值传递”:对对象的*引用*将作为函数参数**按值**传递(因此引用被复制到被调用者的堆栈帧中)。引用所引用的实际数据永远不会被隐式复制;只是对它的引用而已。 (4认同)
  • @Borealid,这是错误的,Java总是通过值传递,没有什么比Java中的引用传递更多. (3认同)
  • 在理论上,Java的行为与实际行为完全不同,并且将对象或数组传递给函数会导致完全独立的副本(其中函数内部的修改根本不会反映给调用者),那么您将如何处理?描述语言?请记住,我们所谈论的完全不是Java实际做什么。 (3认同)
  • 假设我有一个函数“foo(x)”。我通过调用 `foo(my_arr)` 来调用它,该函数包含行 `x[1]=5; x=[];`。如果语言使用“按值传递”语义,则将复制数组的_value_(而不仅仅是引用),并且调用者将不会看到“my_arr”发生任何更改。如果它使用“通过引用传递”语义,那么在调用之后,`my_arr`将为空。如果语言使用“按引用值传递”语义,调用者将看到第二个元素设置为“5”的“my_arr”。我们不要想出使这两个场景被称为同一事物的措辞。 (2认同)

Mic*_*rdt 27

对于原始类型,您可以做一些事情:

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

除非你需要其中任何一个,否则你应该更喜欢原始类型,因为它们需要更少的内存.


Joa*_*uer 21

  • 默认情况下int,在持有数字时使用.
  • 如果范围int太小,请使用along
  • 如果范围long太小,请使用BigInteger
  • 如果您需要将您的数字作为对象处理(例如,当将它们放入a Collection,处理null,...时)使用Integer/ Long而不是


Jes*_*per 13

An int是32位整数; a long是64位整数.使用哪一个取决于您期望使用的数字的大小.

int并且long是原始类型,Integer而且Long是对象.原始类型更有效,但有时您需要使用对象; 例如,Java的集合类只能使用对象,所以如果你需要一个整数列表,你必须使它成为一个List<Integer>,例如(不能使用intList直接).


Mar*_*rty 10

Integer是有符号的 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 位变量占用两倍的内存。