为什么==如果在java中对值非引用进行整数检查,则与新运算符的情况不同

为什么==如果在java中对值非引用进行整数检查,则与新运算符的情况不同,java,Java,正如我们所知,如果对象指向同一引用,则==返回true,否则返回false 所以,如果我采取了 Integer a = new Integer("1"); // Creating Integer Object a Integer b = new Integer("1"); // Creating Integer Object b 然后执行a==b,然后返回true 但它们都有不同的参考文献 因为它被覆盖了: JVM缓存-127到127之间的整数值。 这就是为什么==适用于此范围

正如我们所知,如果对象指向同一引用,则==返回true,否则返回false

所以,如果我采取了

    Integer a = new Integer("1"); // Creating Integer Object a
    Integer b = new Integer("1"); // Creating Integer Object b
然后执行a==b,然后返回true 但它们都有不同的参考文献

因为它被覆盖了:


JVM缓存-127到127之间的整数值。
这就是为什么==适用于此范围之间的整数值

但是:


正如上面的答案所说,它在许多情况下都可能有效,但是您不应该将两个整数与==进行比较,因为在某些情况下它可能会出现问题

有关更多信息,请查看此答案:


如果您在
Integer
类中检查equals方法实现,则它是:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}
从这里可以看到它使用“==”运算符

现在,这背后的原因是什么。最终,您必须比较Integer包装类的值,这将由于Java中的自动装箱和取消装箱而自动发生


另外,从方法定义中,您可以看到它正在使用
((整数)obj)检索传递的
对象
值。intValue()

,@asAmit Bhati在我们写作时的回答中说,让我对此进行更详细的说明

    Integer i1=new Integer("11");
    Integer i2=new Integer("11");
    System.out.println(i1==i2); //false
jvm创建两个独立的对象,并将它们与“==”进行比较,结果为false。但当我们编写以下代码时:

    Integer i3=11;
    Integer i4=11;
    System.out.println(i3==i4); //true
这将转化为:

    Integer i3=Integer.valueOf(11);
    Integer i4=Integer.valueOf(11);
valueOf方法的实现如下(在java 1.8中):

public静态整数值of(int var0){

return var0>=-128&&var0可能的重复项您确定它返回
true
?当使用
new
关键字时,必须创建并返回一个新对象。缓存在这种情况下不工作。这是否意味着JVM缓存作为字符串常量池工作?不完全是字符串池,因为没有新的整数添加到此缓存,Integer类使用Flyweight模式,即Integer.valueOf(..),它将从这个缓存返回整数值。我不是问equals方法,我是问==运算符,这是否意味着当我们调用==它时,它内部调用equals方法..但我们不是说equals方法!你是对的。这里有一个关于相同的解释--它说-equality运算符可以用来比较两个运算符可转换为数值类型(§5.1.8)的ERAND,或两个布尔或布尔类型的操作数,或两个引用类型或null类型的操作数。所有其他情况都会导致编译时错误。
    Integer i3=11;
    Integer i4=11;
    System.out.println(i3==i4); //true
    Integer i3=Integer.valueOf(11);
    Integer i4=Integer.valueOf(11);
    public static Integer valueOf(int var0) {
    return var0 >= -128 && var0 <= Integer.IntegerCache.high?Integer.IntegerCache.cache[var0 + 128]:new Integer(var0);
}