public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> 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;
}
} modCount++;
addEntry(hash, key, value, i);
return null;
}
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
这个判断条件怎么看e.hash == hash 都是多余的
==判断出来的不是地址相同吗?地址相同了 hash还会不同么?
不能改写成
if (((k = e.key) == key || key.equals(k))) 或者直接 if(key.equals(k)) 我觉得也能够判断了
不过JDK里面那么写自然有它的道理,但我体会不出,
谁能详细讲解一下啊!
解决方案 »
- 双色球问题~高手请指教
- [高级]UDP 数据发送失败:java.io.IOException: Invalid argument
- RSA加解密Word文档遇到的问题
- xml解析
- 瑞星软件中怎么连接到网页,显示网页的内容.JFRAME中点JBUTTON怎么连接到网页中,象瑞星软件那样 ,你们都知道点瑞星软件中的SUPPORT就可以
- 一个题目(急)
- JB的打包功能太差了,经常有一些class没打包进去.而我又需要JB生成exe文件.
- 有关参数替换的问题
- 关于JVM线程和进程的问题
- 有没有搞错啊?从昨天起,我的信箱里塞满了CSDN的通知,怎么把它禁止掉啊?
- GUI
- 请问数据库查询结果以表格形式显示在窗体上?
就算hash不同。
里是指前面hash相等后(前面个表达式) equals方法不执行所带来的效率提升
但为什么不能直接用
((k = e.key) == key
来代替e.hash == hash && ((k = e.key) == key
也是效率问题?
((k = e.key) == key
这个表达式
明明比较了地址 还要hash干嘛
因为hash是int比较,所以先用hash判断一次比直接上来就判断会快一些
if((k = e.key) == key || key.equals(k)) {
...
}
}
这样可以提高比较的速度,只要hash不等,则根本不需要进入比较方法((k = e.key) == key 这个是为了当使用同一个key对象时,直接比较而无需进入equals方法
总体的说,这段代码都是为了提高效率做的。功能上与key.equals(e.key)没有区别,只是效率提高了
例如put("1", ...); 之后调用get("2")因为"1"与"2"的hash不同,所以根本不会进入后面的比较逻辑
所以用hash在前面短路一下可以避免这些操作
所以前两个都是为了进行, equals 的 快速判断。e.key=key,肯定 key.queuals(k)。(这个不用讲了吧)e.hash != hash(这个可以理解为 e.key.hashCode() != key.hashCode(),所以 !key.queuals(k))