我正在尝试确定以下语句是否保证是真的:
((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)
Run Code Online (Sandbox Code Playgroud)
我一直认为自动装箱相当于调用valueOf()相应的类型.我在这个主题上看到的每一个讨论似乎都支持我的假设.但我在JLS中找到的只有以下内容(§5.1.7):
如果该值
p被装箱是整数文本类型的int之间-128和127包容性(§3.10.1)或布尔值true或false(§3.10.3),或字符之间文字'\u0000'和'\u007f'包容性(§3.10.4),然后让a与b是任何两个拳击转换的结果p.情况总是如此a == b.
这描述的行为与*相似valueOf().但似乎没有任何valueOf()实际调用的保证,这意味着理论上可以有一个实现为自动装箱值保留一个单独的专用缓存.在这种情况下,缓存的自动装箱值与常规缓存的装箱值之间可能不存在标识相同性.
Oracle的自动装箱教程说明了li.add(i)编译到的事实li.add(Integer.valueOf(i)),其中i是一个int.但我不知道该教程是否应被视为权威来源.
*这是一个稍微弱一点的保证valueOf(),因为它只是指字面值.
我们都知道Java有一个缓存Integer(和其他一些类型)的数量在该范围内[-128, 127]被认为是"常用".
缓存的设计如下:
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the …Run Code Online (Sandbox Code Playgroud) 我正在研究一个不断处理千兆字节数据的程序,主要是基元和字符串.我需要避免通过自动装箱将原语转换为对象,因为这会爆炸堆大小和GC时间.
目前,我在VisualVM中进行更改并运行代码,看看我有数百万个额外的整数或短片或对象.然后我将调试器中的代码单步执行到我的库和JDK类中,以找到装箱发生的位置.有工具来帮助解决这个问题吗?
我使用Intellij作为我的IDE.在Intellij中,您可以使用检查在您自己的代码中查找自动装箱,但它似乎不会扩展到库代码.为此,请从菜单中选择:
Analyzye >>按名称运行检查...
然后在提示符下键入"auto".应出现自动装箱检查以供选择.
但是,在这一点上,我已经从我自己的代码中删除了基本上所有的自动装箱.我需要的是能够找出当我将原语传递给库方法时,库代码是否在任何时刻自动装箱基元.
我知道可以使用Long.parseLong(String)方法和Long(String)构造函数将String转换为long .
String str="12356";
Long myvar= Long.parseLong(str);
Long myvar2 = new Long(str);
Run Code Online (Sandbox Code Playgroud)
它们都提供相同的输出.myvar和myvar2的值相同.我想知道哪一个提供更好的性能以及何时使用parseLong以及何时使用新的Long(String s).
Integer当你这样做时,将使用该类中的哪个方法Integer i = 1;
我很确定它不是构造函数,它可能是valueOf()方法.
我必须创建一个自定义迭代器,它通过一个数组无休止地迭代.考虑到我之前从未使用过java中的迭代器,我不知道如何做到这一点.如果有人能帮我解释并向我解释,我会非常感激.
public class Numbers{
private int[] array;
public Numbers(int[] array){
this.array = array
}
public static void main(String[] args) {
Numbers n = new Numbers();
Iterator num = n.sequence();
for(int i = 0; i < 10; i++){
if (num.hasNext()){
System.out.print(num.next() + " ");
System.out.println();
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 要创建一个新的Integer对象,该对象在Java 1中保存该值,以下其中一项是正确的,并且以下方法的区别到底是什么,因为所有方法都将打印该值?
方法1:
Integer p = new Integer(1);
Run Code Online (Sandbox Code Playgroud)
方法2:
Integer p = 1;
Run Code Online (Sandbox Code Playgroud)
方法3:
Integer p = new Integer("1");
Run Code Online (Sandbox Code Playgroud)
使用方法三,我得到以下警告:
Note: HelloWorld.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details
Run Code Online (Sandbox Code Playgroud) 我知道在Java中,有三种不同的方法可以将原始类型转换为相应的包装类.但是,如果性能至关重要,是否有任何首选方式?
Integer i = new Integer(5);
Integer i = 5;
Integer i = Integer.valueOf(5);
Run Code Online (Sandbox Code Playgroud) java ×8
autoboxing ×2
boxing ×1
integer ×1
iterator ×1
long-integer ×1
object ×1
string ×1
wrapper ×1