设为首页 加入收藏

TOP

Java中equals和==的区别(二)
2015-02-25 16:14:47 来源: 作者: 【 】 浏览:74
Tags:Java equals 区别
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方法,使内存中的内容也相等。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java中的Set与List 的关系与区别 下一篇Java适配器模式(Adapter模式)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: