for (int i = oldCapacity ; i-- > 0 ;) {
for (Entry old = oldMap[i] ; old != null ; ) {
Entry e = old;
old = old.next;
int index = (e.hash & 0x7FFFFFFF) % newCapacity;
e.next = newMap[index];
newMap[index] = e;
}
}
这段看不懂,求大神解释下
old.hash和old.next.hash一样吗
不一样的话每条链表的的一个节点就会占用newMap[]的一个容量是吗,不是一整条链存占数组的一个容量吗?
for (Entry old = oldMap[i] ; old != null ; ) {
Entry e = old;
old = old.next;
int index = (e.hash & 0x7FFFFFFF) % newCapacity;
e.next = newMap[index];
newMap[index] = e;
}
}
这段看不懂,求大神解释下
old.hash和old.next.hash一样吗
不一样的话每条链表的的一个节点就会占用newMap[]的一个容量是吗,不是一整条链存占数组的一个容量吗?
解决方案 »
- 求一个使用POI读取execl2010的完整例子。。
- 彩信猫二次开发设想
- 用java怎么查询文本文件的数据?
- 如何用java定义动态二维数组
- 编记事本时遇到的问题!
- Applet 无法显示的问题
- Unicode问题????(来者有分!!!!)
- 怎么识别中文页面???急!!!!!!!
- 在一个比较大OA系统数据库设计时,有些表的主键设置成自增还是人工取最大值好呢,欢迎讨论
- 急!请帮忙解决:1.如何解决通过jdbc访问Sybase,插入中文信息Sybase乱码?2.如何在tomcat中设置session的timeout?感谢!
- idea maven引入jar包失败,求大神执导
- 求思路 详解for 循环
我觉得你先弄清一个链式节点的结构是啥,再反过来看程序。我不知道为什么每次循环e.hash都是一样的,能分析一下吗
Entry e=old;//当前的给e
old=old.next;//old指向下个链接
这里不是每次重新都赋予过了么!
没错,把oldMap旧数据的内容传入新数据newMap中
如果获取的oldMap[i]是一条有三个节点的链表,那这个循环是不是就循环三次,每次获取oldMap[i]的一个节点放到newMap[index].next直到最后null就退出这层循环?
如果每次的index不一样那不就是相当于把oldMap[i]的三个节点分别存到三个不一样的newMap[index]吗?这样rehash后原先的链表结构不就变了?
你先要明白你看的代码是啥,这个应该hashtable的扩容中代码,都说了hashtable是散列结构,你先搞明白什么是散列结构。扩容后存放位置会根据int index = (hash & 0x7FFFFFFF) % Capacity;改变。
我知道扩容后位置会改变!但那只是链表的在数组里的位置变了,链表里的节点不会被拆到别的地方吧?
那样不就会Key不就会重复了?
我不明白你key不会重复的意思,hashcode本身就不存在重复性,key本身就是唯一,hashtable本身就不存在重复的key。都说了hashtable本身的存放是一个数组,而每个数组节点就是一条链表,本身存放就是散乱的,有的数组节点可能存放了好几个键和值,有的数组节点可能一对键和值都没有。放入新数组的下标是也是根据hashcode取模决定,这时候取模的值是新数组的长度,这条链的两个节点拆出来,可能会有2个新数据下标情况,也可能2个都在一个新下标中情况,也可能新数组下标和原来的下标一样的情况。
我不明白你key不会重复的意思,hashcode本身就不存在重复性,key本身就是唯一,hashtable本身就不存在重复的key。都说了hashtable本身的存放是一个数组,而每个数组节点就是一条链表,本身存放就是散乱的,有的数组节点可能存放了好几个键和值,有的数组节点可能一对键和值都没有。放入新数组的下标是也是根据hashcode取模决定,这时候取模的值是新数组的长度,这条链的两个节点拆出来,可能会有2个新数据下标情况,也可能2个都在一个新下标中情况,也可能新数组下标和原来的下标一样的情况。
你确定hashCode不存在重复?
哈值
int hash;
K key;
V value;
// 指向的下一个Entry,即链表的下一个节点
Entry<K,V> next;
}
2个hashcode一样,代表这2对key和value完全相同,hashtable存在 这样的2对键值么?
// Hashtable中不能插入value为null的元素!!!
if (value == null) {
throw new NullPointerException();
} // 若“Hashtable中已存在键为key的键值对”,
// 则用“新的value”替换“旧的value”
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K, V> e = tab[index]; e != null; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}
}
2个hashcode一样,代表这2对key和value完全相同,hashtable存在 这样的2对键值么?
链表是用来解决hashcode重复的,两个hashcode一样的会形成链表,然后首节点还是方在相对应的数组下标下面
Hash决定下标,如果该下标上没值,直接存进去,若有值存入还值所在的链表,你说有没有关系?
Hash决定下标,如果该下标上没值,直接存进去,若有值存入还值所在的链表,你说有没有关系?我想知道我的理解哪里错了
我不明白你key不会重复的意思,hashcode本身就不存在重复性,key本身就是唯一,hashtable本身就不存在重复的key。都说了hashtable本身的存放是一个数组,而每个数组节点就是一条链表,本身存放就是散乱的,有的数组节点可能存放了好几个键和值,有的数组节点可能一对键和值都没有。放入新数组的下标是也是根据hashcode取模决定,这时候取模的值是新数组的长度,这条链的两个节点拆出来,可能会有2个新数据下标情况,也可能2个都在一个新下标中情况,也可能新数组下标和原来的下标一样的情况。老哥!你看清楚我说的是"不就会重复?"而不是"不会重复"!! 一个数组下标里的Key都必须是一样的
不同数组下标里的key都必须是不一样的
hashtable的规定就是这样
然而你却说扩容后原来在一个数组下标里的两个节点可能会拆开存放在两个数组下标里!
这怎么可能!这样就相当于存在不同数组下标里的key是一样的了!你认真看看!
Hash决定下标,如果该下标上没值,直接存进去,若有值存入还值所在的链表,你说有没有关系?我只是就这段程序而言,你非要扯到全部的源代码,那我就没话好说了,源代码还有比较是否key相等呢。
兄弟我跟你这个无知的人怎么说了,你看过懂取下标的语句了么?谁跟你说下标值一样 key必定一样,取模这个感念懂不懂,我觉得你先学好基础吧,基础都没扎实看源代码,漏洞百出。