【问题标题】:primitives vs wrapper class initialization原语与包装类初始化
【发布时间】:2013-04-11 01:37:36
【问题描述】:

将 int 声明如下有什么区别。有哪些适合不同类型使用的案例

int i     = 20;
Integer i = 20;
Integer i = new Integer(20);

请注意:我仔细看了下,发现 first 将创建原始 int。Second 将执行自动装箱,Third 将在内存中创建引用。

我正在寻找一个场景,它清楚地解释了我应该在什么时候使用第一种、第二种和第三种整数初始化。互换用法是否会对性能产生任何影响

感谢您的回复。

【问题讨论】:

标签: java


【解决方案1】:

第一种情况的初始化是一个简单的常量赋值。没什么有趣的……除了这是一个被分配的原始值,原始值没有“身份”;即int20 的所有“副本”都是相同的。

第 2 和第 3 种情况更有趣一些。第二种形式是使用“拳击”,实际上相当于这样:

Integer i = Integer.valueOf(20);

valueOf 方法可能创建一个新对象,或者它可能返回对先前存在的对象的引用。 (事实上​​,JLS 保证 valueOf 将缓存 -128..+127 ... 范围内的数字的 Integer 值)

相比之下new Integer(20)总是创建一个新对象。

如果您习惯于使用== 比较Integer 包装器对象(或类似对象),那么这个与新对象(或不是)有关的问题很重要。在一种情况下,如果您比较“20”的两个实例,== 可能是 true。另一种情况,保证为false

教训:使用.equals(...) 比较包装器类型而不是==


关于使用哪个的问题:

  • 如果iint,请使用第一种形式。
  • 如果iInteger,则第二种形式是最好的……除非您需要一个!= 对其他实例的对象。装箱(或显式调用 valueOf)减少了小值的对象分配量,是值得优化的。

【讨论】:

  • 说得好,谢谢您的回复
  • Integer I 在创建方面是否等于 int i?请问Integer I 不是在堆内存中创建的吗?因为我有 Short s=20 并且当我比较 Integer I==Short 时它会给出编译时错误但是当它的 int i== Short s 时它是真的!!!!!! @斯蒂芬C
  • @Gpar - 1) 不清楚你在问什么 2) 不清楚你在问什么。 3) 这不是问题。
  • @Gpar - 提示:如果您想正确回答您的问题,那么:1) 搜索 StackOverflow 以查看他们是否已经被询问和回答,然后 2) 花时间写一个正确的问题。
【解决方案2】:

在没有赋值的情况下,基元将采用默认值。

但是包装类是引用类型,所以如果没有赋值,它们将是null。如果在没有赋值的情况下使用,这可能会导致 NullPointerException 被抛出。

【讨论】:

    【解决方案3】:

    我能想到的一个这样的场景是当您在Hibernate 中映射数据库类型时。如果您使用 Integer,您可以检查 null(假设该列允许 null 值)。如果您使用原语并且数据库中的值为空,我猜它会引发错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多