w Integer(123);?
? ? ? Integer i4 = new Integer(123);? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? System.out.println("i1 == i2 = "+(i1 == i2));?
? ? ? System.out.println("i1.equals(i2) = "+(i1.equals(i2)));?
? ? ? ?
? ? ? System.out.println();?
? ? ? System.out.println("i3 == i4 = "+(i3 == i4));?
? ? ? System.out.println("i3.equals(i4) = "+(i3.equals(i4)));?
? ? ? ?
? ? ? System.out.println();?
? ? ? System.out.println("i2 == i4 = "+(i2 == i4));?
? ? ? System.out.println("i2.equals(i4) = "+(i2.equals(i4)));?
? ? ? ?
? ? ? System.out.println();?
? ? ? System.out.println("i == i2 = "+(i == i2));?
? ? ? System.out.println("i1.equals(i) = "+(i1.equals(i)));?
? ? ? ?
? ? ? System.out.println();?
? ? ? System.out.println("i == i4 = "+(i == i4));?
? ? ? System.out.println("i4.equals(i) = "+(i4.equals(i)));?
? ? ? ------------------------------?
? ? ? i1 == i2 = true?
? ? i1.equals(i2) = true?
? ? i3 == i4 = false?
? ? i3.equals(i4) = true?
? ? i2 == i4 = false?
? ? i2.equals(i4) = true?
? ? i == i2 = true?
? ? i1.equals(i) = true?
? ? i == i4 = true?
? ? i4.equals(i) = true?
三、其他类怎么使用equals和==
API里的类大部分都重写了equals方法,没有重写的一般是自己写的类,
如果是你自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,
因为自定义的类是继承于object,而object中的equals就是用==来实现的,你可以看源码。
四、java里equals和hashCode之间什么关系
只是为了维护 hashCode 方法的常规协定,才要求用equals比较的两个对象的hashCode相同.
equals()和hashCode()都来自java.lang.Object.你当然可以重写.
比如a.equals(b).仅当a的内存地址相等时,才返回true.当然如String等类已经对这个方法进行了重写,比较的就不再是内存地址了.
hashCode()的值也是与内存地址相关的.所以仅当内存地址相等时,hashCode才相等.
同样很多类也重写了这个方法,还是以String为例:
Java代码?
public int hashCode() {?
int h = hash;?
if (h == 0) {?
? ? ? int off = offset;?
? ? ? char val[] = value;?
? ? ? int len = count;?
?
? ? ? for (int i = 0; i < len; i++) {?
? ? ? ? h = 31*h + val[off++];?
? ? ? }?
? ? ? hash = h;?
? }?
? return h;?
}?
就不在与内存地址相关了.这样做是为了保证用equals比较返回为true的两个对象,他们的hashCode是相同的.
所以一般重写equals的时候都会重写hashCode().
当然,这个相当于一个约定,一个协议.你???这么做并不会错.
五、hashCode
在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。
你想通过一个object的key来拿hashmap的value,hashmap的工作方法是,
通过你传入的object的hashcode在内存中找地址,
当找到这个地址后再通过equals方法来比较这个地址中的内容是否和你原来放进去的一样,一样就取出value。
所以这里要匹配2部分,hashcode和equals
但假如说你new一个object作为key去拿value是永远得不到结果的,
因为每次new一个object,这个object的hashcode是永远不同的,所以我们要重写hashcode,
你可以令你的hashcode是object中的一个恒量,这样永远可以通过你的object的hashcode来找到key的地址,
然后你要重写你的equals方法,使内存中的内容也相等。