使用==和!=来比较对象,是比较栈上两个对象是不是指向堆上的同一个对象,即引用地址是否相等。
对于基本类型的常量池,JVM会自动维护,自动装箱过程中取常量池中的值。但基本类型数值有其大小范围,如:
超过这个范围,会new()新的对象,生成新的内存地址,使用==比较的内存地址就是不相等的,因为hashcode()的默认行为就是对堆上的对象产生独特值,没有重写hashcode(),两个对象不会相等==(即使两个对象的数据相同)。
而equals()是执行对象值的比较。所以,相同类型的包装类对象之间值的比较,使用equals()方法。对于String 类,已经重写了hashCode()和equals()方法,所以==执行的是对象相等性的比较而不是引用。