hashCode和identityHashCodeset和hashset的区别别

3113人阅读
Java(42)
String a = new String(&hhh&);
&& String b = new String(&hhh&);
&& System.out.println(System.identityHashCode(a));
&& System.out.println(System.identityHashCode(b));
&& System.out.println(a.hashCode());
&& System.out.println(b.hashCode());
前两个不同
后两个相同
这是为什么呢,我们知道目前a和b是两个不同的对象,他们在内存中存放的地址是不同的,System.identityHashCode方法是java根据对象在内存中的地址算出来的一个数值,不同的地址算出来的结果是不一样的。因此这里打印出的结果不一样。
doc上如是说:返回给定对象的哈希码,该代码与默认的方法 hashCode() 返回的代码一样,无论给定对象的类是否重写 hashCode()。
但是为什么后两个相同呢?这是因为,String类中已经重新写了hashCode()方法,也就是说,String类中hashcode,已经不是根据对象在内存中的地址计算出来的。(具体怎么算出来的,我还没有研究),就是说即使对象在内存中的地址不一样,String中hashcode也可能一样
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:398986次
积分:2149
积分:2149
排名:第18687名
原创:21篇
转载:28篇
评论:32条
(5)(2)(3)(1)(3)(3)(20)(11)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'hashCode和identityHashCode的区别
I、 hashCode()方法是Object类下面的一个方法,供继承类重写,根据对象内存地址计算哈希& 20540;,
String类重写了hashCode方法,并改为根据字符序列来计算哈希& 20540;
III、identityHashCode()方法是
I、 hashCode()方法是Object类下面的一个方法,供继承类重写,根据对象内存地址计算哈希值,
String类重写了hashCode方法,并改为根据字符序列来计算哈希值
III、identityHashCode()方法是System类中的静态方法,根据对象内存地址来计算哈希值;
方法示例:
public static void main(String[] args)
//下面程序中s1和s2是两个不同对象
String s1 = newString("Hello");
String s2 =newString("Hello");
//String类重写了Object类的hashCode方法——改为根据字符序列计算hashCode值,
//因为s1和s2的字符序列相同,所以它们的hashCode方法返回值相同
System.out.println(s1.hashCode() +"----" + s2.hashCode());
//s1和s2是不同的字符串对象,所以它们的identityHashCode值不同,
//identityHashCode是根据对象的地址计算得到的,所以任何两个不同的对象的
//identityHashCode值总是不相等
System.out.println(System.identityHashCode(s1)+ "----"
+System.identityHashCode(s2));
//s3和s4是相同的字符串对象,所以它们的identityHashCode值相同
String s3 ="";
String s4 ="Java";
System.out.println(System.identityHashCode(s3)+"----"
+System.identityHashCode(s4));}
----3154093拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3ad2d144a37543ef-ua98).
重新安装浏览器,或使用别的浏览器2006年8月 Java大版内专家分月排行榜第三
2006年8月 Java大版内专家分月排行榜第三
2006年8月 Java大版内专家分月排行榜第三
2006年8月 Java大版内专家分月排行榜第三
2006年8月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。10:53 提问
java中 HashCode到底是什么?
hashCode是万物的十六进制地址.(这里引用编程思想一句话 "万物都是对象").
hashCode既然是万物的地址.那么我在新建的一个类里 重写Object的hashCode方法
equals方法,依然返回false.
public int hashCode(){
public boolean equals(Object obj){
public class Test{
public static void main(String[]args){
A a1=new A();
A a2=new A();
output(a1==a2);---&false
output(a1.equals(a2));--&true
求大师解惑
按赞数排序
==比较的是对象的内存地址
System.identityHashCode(Object obj)会返回obj的精确hash值,根据obj的内存地址计算得到。
你的equals方法不是返回的 true吗?
==比较的是内存地址, a1 a2是new出来的两个对象他们的内存地址当然是不同的,所以返回false
不知道楼主有没有了解过数据结构中的哈希表,Object类中hashCode方法的实现就是哈希函数,而你的覆写return 1也是哈希函数。
hashCode的返回值所映射到的地址如果已经有了值(即hashCode方法返回值相同,Object类中hashCode方法的返回值也有可能有相同的),就会通过‘开发地址法’或‘链地址法’
去找下一个没有存放值的地址空间。java中==比较的是地址是否相同,而不同对象的地址肯定是不同的(尽管hashCode相同)。
首先 == 比较的是内存地址,我在上面已经写的非常清楚,既然hashCode是内存地址!
我都重写了hashCode返回值了.为什么还是报错
==比较的是等式两边的地址,
1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
2、如果两个对象相同,就是适用于equals(Java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。
hashcode是java对对象的一个标识,,便于实现,,Hashtable,HashMap等,,
不是唯一标识,,知识一种标识(可以存在hash冲突)
其他相关推荐

我要回帖

更多关于 hash和map的区别 的文章

 

随机推荐