相关疑难解决方法(0)

Java中奇怪的整数拳击

我刚刚看到类似这样的代码:

public class Scratch
{
    public static void main(String[] args)
    {
        Integer a = 1000, b = 1000;
        System.out.println(a == b);

        Integer c = 100, d = 100;
        System.out.println(c == d);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,这段代码将打印出来:

false
true
Run Code Online (Sandbox Code Playgroud)

我理解为什么第一个是false:因为这两个对象是单独的对象,所以==比较引用.但我无法弄清楚,为什么第二个声明会回来true?当Integer的值在一定范围内时,是否会出现一些奇怪的自动装箱规则?这里发生了什么?

java autoboxing

108
推荐指数
5
解决办法
2万
查看次数

为什么不在Java中缓存整数?

我知道这个主题有类似的帖子,但它们并没有完全解决我的问题.当你这样做时:

Integer a = 10;
Integer b = 10;
System.out.println("a == b: " + (a == b));
Run Code Online (Sandbox Code Playgroud)

这将(显然)打印true大部分时间,因为[-128,127]范围内的整数以某种方式被缓存.但:

Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println("a == b: " + (a == b));
Run Code Online (Sandbox Code Playgroud)

会回来false.我理解我要求整数的新实例,但由于盒装原语在Java中是不可变的,并且机器已经在那里做"正确的事情"(如第一种情况所示),为什么会发生这种情况?

如果具有10的Integer的所有实例在内存中都是相同的对象,那会不会更有意义?换句话说,为什么我们没有"Integer interning",这类似于"String interning"?

更好的是,如果表示同一事物的盒装基元的实例(无论值(和类型)是否是同一个对象),它会更有意义吗?或者至少正确回答==

java autoboxing equality

25
推荐指数
3
解决办法
6167
查看次数

标签 统计

autoboxing ×2

java ×2

equality ×1