a==b是比较对象的什么东西?解决办法

a==b是比较对象的什么东西?
a==b是比较对象的什么东西?解决办法
貌似不是hashCode地址。
------解决思路----------------------
== 比较的是内存地址
hashcode 只是一个参考,hashcode相等的两个对象不一定相同,hashcode不等的两个对象一定不同
再就是 Integer 缓存数据

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

Integer 缓存-128 ~ 127的这些变量,直接valueOf 这个范围的数,会直接返回缓存中的变量
如果超出范围,则new 一个新的对象出来
------解决思路----------------------
引用:
Quote: 引用:

比较的是两个对象的地址,如果a,b不是指向的同一个对象,即使对象的内容一模一样,a==b都是false。要想比较内容就只能自己覆盖equals方法
那为什么
c ==d 是false,而c.hashCode()==d.hashCode()是true
难道他们的地址不是指hashCode吗?

hashCode不是内存地址,它是特定的算法根据地址或者值计算出来的。不同对象‘==’肯定是false,但hashCode()有可能相等,因为hashCode()是可以被重写的。
Integer类重写了hashCode(),应该是根据值算出来的
------解决思路----------------------
Integer a=new Integer(10);
Integer b=new Integer(10);
a==b:比较的地址,它们都是在栈内存里面指向堆中的一个10,在栈里面分配的地址是不一样的
a.hashCode()==b.hashCode()相当于比较的是两个的值,相当于下面:
int a=10;int b=10;a==b返回true
new出来的东西使用==比较的是地址,不能等同
Integer a=10;Integer b=10;
a==b此时程序可以进行拆箱,比较的也是值的比较,Integer在-128到127之间比较==,通过源代码会发现它里面做了valueOf处理,就是将其转换为基本类型进行的值的比较,而不在那个范围之间,则使用new创建对象,则比较的是地址
------解决思路----------------------
常量池,又见常量池

因为 Integer 是常量对象,它象 String 一样,一旦对象创建,里面的内容就不能被更改。因此,这类对象只要值相同,就是可以共享使用的,这样可以节省内存。
因此,在编译期间就可以确定内容的这种对象,JVM会把它们创建出来,并放到常量池中,当别的地方用到时,就使用同一个对象。
所以 a, b 指向的是同一个对象
而 c, d 因为强制进行新建对象的操作,因此不是同一个对象