【问题标题】:Why not use long for all integer values为什么不对所有整数值使用 long
【发布时间】:2015-09-16 12:06:48
【问题描述】:

在我的 Java 课程中,我们刚刚了解了以下每种原始数据类型:

  • byte
  • short
  • int
  • long

由于long 数据类型包含最多的位,所以专门使用long 数据类型以避免限制不是很有意义吗?

问题

  • 只使用long 数据类型有什么特别的缺点吗?
  • 例如,使用int 数据类型而不是long 数据类型是否有意义?

【问题讨论】:

  • 速度、效率和 RAM/磁盘空间过去非常宝贵,因此我们过去常常担心这些事情。这些天在服务器和桌面上,我觉得没什么意义。它在移动应用中可能仍然很重要。
  • 这很酷,要知道在过去,这些数据类型更“重要”。并不是说现在数据类型并不重要,但是我可以理解为什么它在过去更成为一个问题。
  • @PaulTomblin 对于某些类型的应用程序使用大于必要的原始数据结构仍然很容易耗尽内存(诚然,我主要在解决示例问题时遇到过这个问题,但我可以看到其他人可能对此有更多的实际经验)。此外,仅仅因为单个应用程序不会用完所有/大部分内存并不意味着运行许多应用程序的计算机不会 - 我,一方面,欣赏小的内存占用。如果您谈论的是大数据,longint 之间的差异可能具有不平凡的货币价值。

标签: java integer long-integer


【解决方案1】:

例如,使用int 数据类型而不是long 数据类型是否有意义?

绝对是的。


内存/磁盘使用情况

仅使用一两个变量您不会看到性能差异,但当应用程序增长时,它会提高您的应用程序速度。

检查this question for further info

还可以查看Oracle primitive type documentation,您可以看到一些建议和内存使用情况:

type    memory usage    recommended for
------- --------------- ---------------------------------------------------
byte    8-bit signed    The byte data type can be useful for saving memory in large arrays, where the memory savings actually matters.
short   16-bit signed   same as byte
int     32-bit signed   
long    64-bit          Use this data type when you need a range of values wider than those provided by int
float                   Use a float (instead of double) if you need to save memory in large arrays of floating point numbers. This data type should never be used for precise values, such as currency.

byte:

字节数据类型是8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。 字节数据类型可用于在大型数组中节省内存,其中内存节省实际上很重要。

short:

短数据类型是16 位有符号二进制补码整数。它的最小值为 -32,768,最大值为 32,767(含)。与字节一样,适用相同的准则:您可以在大型数组中使用 short 来节省内存,在内存节省实际上很重要的情况下

int:

默认情况下,int数据类型是32位带符号二进制补码整数,最小值为-2³¹,最大值为2³¹-1。在 Java SE 8 及更高版本中,您可以使用 int 数据类型来表示 无符号 32 位整数,其最小值为 0,最大值为 2³²-1。

long:

长数据类型是64 位二进制补码整数。有符号长整数的最小值为 -2⁶³,最大值为 2⁶³-1。在 Java SE 8 及更高版本中,您可以使用 long 数据类型来表示 无符号 64 位 long,其最小值为 0,最大值为 2⁶⁴-1。 当您需要比 int 提供的值范围更广的值时使用此数据类型

float

float 数据类型是单精度 32 位 IEEE 754 浮点。它的值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。与 byte 和 short 的建议一样,如果您需要在大型浮点数数组中节省内存,请使用浮点数(而不是双精度数)。此数据类型绝不应用于精确值,例如货币。


代码可读性

另外,它会澄清你的想法和你的代码,比方说,你有一个代表对象 ID 的变量,这个对象 ID 永远不会使用小数,所以,如果你在代码中看到:

int id;

您现在可以确定此 ID 的外观,否则

double id;

不会。

另外,如果你看到:

int quantity;
double price;

您会知道quantity 不允许使用小数(仅限完整的对象),但价格可以...这使您的工作(其他程序员会阅读您的代码)更容易。

【讨论】:

  • 啊,所以唯一的好处就是提高效率/速度?
  • 为什么速度/效率不足以带来好处?在其他以对象为中心的语言中,原始类型的存在已经是一种纯粹的速度/效率衡量标准。
  • 不要忘记内存占用。尤其是在使用矩阵等大数据结构时。
  • 是的 .. 回到过去,当内存稀缺时,您总是会评估要使用的数据类型。对于内存有限的嵌入式编程,它仍然非常重要......
  • @RobertTossly 你的想法是由大处理器/内存运行的小应用程序......这不是现实生活......如果你开始编程,你会得到越来越大的过时应用程序机器,你会记住这个问题
【解决方案2】:

除了范围(可以存储在任何特定数据类型中的最小值和最大值)之外,还有另一个方面,那就是变量的size

您还必须注意以下几点:

byte = 1 byte
short = 2 bytes
int = 4 bytes
long = 8 bytes

所以使用long 变量意味着您正在为它分配8 bytes 的内存。

类似的,

long var = 1000L

没有显示内存的有效使用。如果这些天你有 GB 的 RAM 怎么办并不意味着我们应该浪费它。

我想说的简单一点是,更有效地使用内存,应用程序将更快。

【讨论】:

  • @JordiCastilla 我不明白你的意思。能详细点吗?
  • 哦,不,我的错……字节使用 7 位存储数字,使用 1 位存储有符号……只是从 128 到 -127……你是对的!!!
  • 但是处理器不是必须将每个字节存储在单独的 64 位内存区域中吗?我认为这就是英特尔 CPU 的工作方式。否则,如果您希望它们紧凑,则必须进行按位或运算?
【解决方案3】:

内存需求和速度方面的性能会使long 变得昂贵。

但是int 的另一个优点是:一个太容易与int 子表达式混合,并且在组合操作错误时可能会丢失长信息。 50 的左移位实际上是 18,依此类推。仅使用带有L 后缀的数字将是一种衡量标准。此外,long 可以作为int 乘法和其他此类操作的溢出捕获,在这种情况下,您可以长时间检测溢出。

请注意,对于int,byte 和 short 的“所有”操作正在传播到 int

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多