当前位置: 首页 > 面试题库 >

创建一个持有值1的新Integer对象?

明松
2023-03-14
问题内容

要创建一个新的Integer对象,该对象在Java 1中保存值,以下其中一项是正确的,并且以下方法的区别到底是什么,因为所有方法都将打印该值?

方法1:

 Integer p = new Integer(1);

方法2:

Integer p = 1;

方法3:

Integer p = new Integer("1");

使用方法三,我得到以下警告:

Note: HelloWorld.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details

问题答案:

您跳过了预期的解决方案:

Integer p = Integer.valueOf(1);

此模式称为Factory方法模式。有人可能会问这种方法有什么好处。幸运的是,classInteger的实现是开源的,因此让我们看一下:

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

似乎存在某种Integer-value缓存。如果请求一个Integer具有缓存范围内的值的Java,则Java不会创建新对象,而是返回先前创建的对象。这Integer是可行的,因为s是不可变的。甚至可以使用system属性来控制高速缓存上限java.lang.Integer.IntegerCache.high=...

为什么其他两种创建Integer警告的方法也会产生警告?因为它们已被Java 9弃用。

Integer#Integer(int value)

不推荐使用
。很少适合使用此构造函数。valueOf(int)通常,静态工厂是一个更好的选择,因为它可能会产生明显更好的空间和时间性能。[…]

Integer#Integer(String s)

不推荐使用
。很少适合使用此构造函数。使用parseInt(String)一个字符串转换为int原始的,或使用valueOf(String)一个字符串转换为一个Integer对象。[…]

仅出于完整性考虑,以下是用于Integer.valueOf(int i)

返回Integer表示指定int值的实例。如果Integer不需要新实例,则通常应优先于构造方法使用Integer(int)此方法,因为通过缓存经常请求的值,此方法可能会产生明显更好的空间和时间性能。此方法将总是在范围内的缓存值-128127,包容性,并可以外接高速缓存的这个范围以外的值。

编辑1:感谢@VGR提到

Integer p = 1;

等同于

Integer p = Integer.valueOf(1);

但是,这仅适用于和int之间的-128-值127。该行为在JLS§5.1.7中定义:

[…]如果该值p被装箱是评价类型的常量表达式(§15.28)的结果booleancharshortint,或long,其结果是truefalse在的范围内的字符'\u0000',以'\u007f'包容,或在范围内的整数-128127包容性的,然后让ab是任意两个装箱转换的结果p。总是这样的a == b

虽然不在JLS中,但javac我正在使用(9.0.4)的版本确实将装箱压缩到了AdamRosenfieldInteger.valueOf(...);在此答案中所示的位置。



 类似资料:
  • 问题 你想初始化一个对象字面值,但如果这个对象已经存在,你不想重写它。 解决方案 使用存在判断运算符(existential operator)。 window.MY_NAMESPACE ?= {} 讨论 这行代码与下面的 JavaScript 代码等价: window.MY_NAMESPACE = window.MY_NAMESPACE || {}; 这是 JavaScr

  • 如何创建具有整数和字符串输入类型的?如果我创建一个: 这将是一个类型。如果我将其创建为: 这将是类型。我如何创建一个,它可以接受整数和字符串输入类型?谢谢。

  • 本文向大家介绍Powershell小技巧之创建一个新对象,包括了Powershell小技巧之创建一个新对象的使用技巧和注意事项,需要的朋友参考一下 下面是一个简单有效的创建一个自定义对象的方法: 这将产生一个含初始值的对象: 支持Powershell3.0及以后版本

  • 如果你已经使用过Android Studio和Gradle,那么这一章会比较简单。我不会给出很多细节和截图,因为用户界面和细节可能会一直变化。 我们的应用是由一个简单的天气app组成,正如所使用的Google’s Beginners Course in Udacity。我们可能会关注不同的事情,但是app的想法都是一样的,你会发现在一个典型的app里面会包括很多不同的东西。如果你的Android开

  • 学习路径: 写一个脚本 给 shell 执行脚本的权限 将脚本放到 shell 可以找到的地方 写一个脚本 shell 脚本是一个包含 ASCII 文本的文件。使用 文本编辑器 来创建脚本。文本编辑器用于读写 ASCII 文本文件。Linux 系统中有许多文本编辑器,包括支持命令行的,和支持 GUI 环境的。以下列出一些: 名称 描述 实现 vi,vim 编辑器的祖先。比较难用,但是强大、轻量并且

  • 给定一个有效的属性标识符数组和一个值的数组,返回一个将属性关联到值的对象。 由于一个对象可以有未定义的值,但不存在未定义的属性,该属性数组用于使用 Array.reduce() 来决定结果对象的结构。 const zipObject = (props, values) => props.reduce((obj, prop, index) => ((obj[prop] = values[inde