要创建一个新的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)
此方法,因为通过缓存经常请求的值,此方法可能会产生明显更好的空间和时间性能。此方法将总是在范围内的缓存值-128
到127
,包容性,并可以外接高速缓存的这个范围以外的值。
编辑1:感谢@VGR提到
Integer p = 1;
等同于
Integer p = Integer.valueOf(1);
但是,这仅适用于和int
之间的-128
-值127
。该行为在JLS§5.1.7中定义:
[…]如果该值
p
被装箱是评价类型的常量表达式(§15.28)的结果boolean
,char
,short
,int
,或long
,其结果是true
,false
在的范围内的字符'\u0000'
,以'\u007f'
包容,或在范围内的整数-128
以127
包容性的,然后让a
和b
是任意两个装箱转换的结果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