nerush 2011-12-24 13:40
浏览 298
已采纳

hashmap查找与hashcode

Map map=new HashMap();
String s1=new String("AA");
String s3=new String("AA");
String s4="AA";
String s6="AA";
map.put(s1,"Value");

String s2=(String)map.get(s3);
String s5=(String)map.get(s4);
s1==s3 false s4==s6 true //这里的==比较的应该不是hashcode吧
s2,s5都可以得到值Value

这里以下是查找key是否存在Entry[] table中
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
1: hashcode的API上解释是 将该对象的内部地址转换成一个整数来实现的。这里的内部地址是该对象在堆中的地址还是对象的引用存储在栈中的地址计算出来的?
2: java中可以输出一个对象在堆中的地址吗?在同一个JVM进程中是否有可能不同的对象的引用输出相同的hashcode呢?
3:为什么s1,s3,s4的hashcode都是相同的在我机子上是2080。不是说s1,s3的引用是指向堆中的对象的实例吗?s4是方法区中得字符串常量池?这里的hashcode是引用本身存储在栈中的地址呢还是其指向的对象在堆中的地址?
4 :s1==s3 是比较哪个地址呢?
5:hashMap中查找key时 int hash = hash(key.hashCode());
不同的key经过hash()运算是否有可能的到相同的hash呢?
e.hash == hash && ((k = e.key) == key || key.equals(k))这里一定要比较2个hash值相等吗?为什么

  • 写回答

3条回答 默认 最新

  • qiemengdao 2011-12-24 16:06
    关注

    1,当然是对象在堆中的地址,因为引用可有很多,如果是引用的地址的话,那一个对象有多少个引用就有多少个hashcode,显然不对;
    2,对象地址是无法直接获取的,你拿了也没用,但是可以获得任何对象的hashcode,不是对象重载了hashCode()方法以后的,而是原生的:System.identityHashCode(Object x);
    通过System.identityHashCode出来的任何不同的对象的HashCode都是不同的,你通过Object.hashCode()返回的值发现不同的对象这个值相同是因为对象覆写了hashCode()方法。
    3,s1,s2,s3的hashcode相同是因为String类覆写了hashCode()方法,你看看源码就知道String的hahsCode只和String的内容(char[] value)有关,
    另外的解释是:他们相互equals返回true,所以hashCode()也应该相等();
    当然,System.identityHashCode(s1)与System.identityHashCode(s2)就不想等了。
    4,s1==s3比较的是System.identityHashCode(s1)和System.identityHashCode(s3)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化