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 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?
  • ¥15 cups交叉编译后移植到tina sdk的t113,只需要实现usb驱动打印机,打印pdf文件
  • ¥30 关于#wireshark#的问题:需要网络应用流量数据集需要做长度序列的实验,需要与应用产生的会话的数据包的长度,如视频类或者聊天类软件
  • ¥15 根据上述描述表示泥浆密度沿着管路的长度方向在不断变化,如何来表示泥浆密度随管路的变化(标签-matlab|关键词-流计算)
  • ¥21 matlab可以把图像数据转换为小波分析吗
  • ¥60 基于香农编码的图像压缩算法实现