【问题标题】:Long vs Integer, long vs int, what to use and when?Long vs Integer,long vs int,什么时候使用?
【发布时间】:2011-08-17 00:00:49
【问题描述】:

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

我应该什么时候选择?

【问题讨论】:

    标签: java types numbers


    【解决方案1】:

    LonglongObject形式,Integerint的对象形式。

    long 使用 64 bitsint 使用 32 位,因此最多只能保存 ±20 亿的数字(-231 到 +231-1)。

    您应该使用longint,除非您需要使用从Object 继承的方法,例如hashcodeJava.util.collections 方法通常使用盒装 (Object-wrapped) 版本,因为它们需要适用于任何 Object,并且像 intlong 这样的原始类型不是 Object

    另一个区别是longint按值传递,而LongInteger按参考值传递 ,就像所有非原始 Java 类型一样。因此,如果可以修改 LongInteger(不是,它们在不使用 JNI 代码的情况下是不可变的),那么还有另一个理由使用其中一个。

    最后一个区别是LongInteger 可以是null

    【讨论】:

    • @Borealid,这是大错特错了,Java总是传值,Java中没有传引用之类的东西。
    • 嗯嗯?好的,让我们探讨一下 Java 从不传递引用的想法。如果我调用一个函数,给它一个 int[2],然后在函数内部更改该数组的第一个元素中保存的值,函数的调用者会看到这种变化吗?是的?那是因为传递给函数的不是数组中的值,而是对这些值的引用。 “按值传递”意味着实际数据本身正在被复制而没有间接性。谁教你 Java 是按值传递的,这对你造成了伤害。
    • @Borealid 你错了,值改变是因为创建了对数组的引用的新副本,这就是为什么调用函数的人都会看到改变,这仍然是按值传递.我不敢相信你说 Java 中有引用传递。您永远不会将原始引用传递给函数。
    • 在理论上,Java 的行为与实际行为完全不同,将对象或数组传递给函数会产生完全独立的副本(其中函数内部的修改不会反映给调用者完全),那么您将如何描述该语言?请记住,我们所说的完全不是 Java 实际所做的。
    • @DiegoRamos 是对的。 Java 总是按值传递,造成混淆是因为非原始时的值是内存引用,静态交换在 java 中不起作用,更多细节在这里:journaldev.com/3884/…
    【解决方案2】:

    有几件事你不能用原始类型做:

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

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

    【讨论】:

      【解决方案3】:
      • 默认使用int,当持有号码时。
      • 如果int 的范围太小,请使用long
      • 如果long的范围太小,使用BigInteger
      • 如果您需要将数字作为对象处理(例如,将它们放入 Collection,处理 null,...)请改用 Integer/Long

      【讨论】:

        【解决方案4】:

        int 是一个 32 位整数; long 是一个 64 位整数。使用哪一个取决于您希望使用的数字有多大。

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

        【讨论】:

          【解决方案5】:

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

          从 Java 5 开始,您可以使用 in-boxing 和 out-boxing 功能使 int 和 Integer 的使用完全一样。这意味着你可以这样做:

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

          in 和 out boxing 允许您在 int 和 Integer 之间切换而无需任何额外的转换(Long,Double,Short 也一样)

          你可以一直使用int,但Integer包含一些辅助方法,可以帮助你对整数进行一些复杂的操作(例如Integer.parseInt(String)

          【讨论】:

            【解决方案6】:

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

            b) 原始类型的内存大小不同(甚至不清楚):

            Java - 一切正常:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

            • 字节、字符 .. 1B .. 8b
            • 短整数 .. 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,因为上面的问题没有说明任何特定的语言。所以我提供了一个比较 - 所以每个人都可以检查差异。 (根据提供的硬数据)
            • 问题说明了Java。
            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2014-01-28
              • 1970-01-01
              • 2016-07-29
              • 1970-01-01
              • 2012-01-17
              • 2017-02-08
              • 1970-01-01
              • 1970-01-01
              • 2018-10-23
              相关资源
              最近更新 更多