JCSprout
JCSprout copied to clipboard
对LRUAbstractMap 中put方法的一点小疑问?
public Object put(Object key, Object value) {
int hash = hash(key);
int index = hash % arraySize ;
Node currentNode = (Node) arrays[index] ;
if (currentNode == null){
arrays[index] = new Node(null,null, key, value);
//写入队列
QUEUE.offer((Node) arrays[index]) ;
sizeUp();
}else {
Node cNode = currentNode ;
Node nNode = cNode ;
//存在就覆盖
if (nNode.key == key){
cNode.val = value ;
}
while (nNode.next != null){
//key 存在 就覆盖 简单判断
if (nNode.key == key){
nNode.val = value ;
break ;
}else {
//不存在就新增链表
sizeUp();
Node node = new Node(nNode,null,key,value) ;
//写入队列
QUEUE.offer(currentNode) ;
cNode.next = node ;
}
nNode = nNode.next ;
}
}
return null ;
}
其中while (nNode.next != null)这个条件在key第一次冲突的条件时是不是不满足哇?求解惑,^_^
@Askerlve 你是指第一次冲突的时候 nNode.next 是空的意思嘛?
@crossoverJie 嗯,这样是不是就没办法加入链表了?
@Askerlve 嗯 是有这个问题,如果桶中只有一个数据那就确实 put 不进去了,这种边界值的问题当时没有认真考虑,有兴趣可以提个 PR.
thx.
public Object put(Object key, Object value) {
int hash = hash(key);
int index = hash % arraySize ;
Node currentNode = (Node) arrays[index] ;
if (currentNode == null){
arrays[index] = new Node(null,null, key, value);
//写入队列
QUEUE.offer((Node) arrays[index]) ;
sizeUp();
}else {
Node cNode = currentNode ;
Node nNode = cNode ;
while (nNode.next != null){
nNode = nNode.next ;
if (nNode.key == key){
nNode.val = value ;
return null;
}
}
//存在就覆盖
if (nNode.key == key){
cNode.val = value ;
}else {
//不存在就新增链表
sizeUp();
Node node = new Node(nNode,null,key,value) ;
//写入队列
QUEUE.offer(currentNode) ;
cNode.next = node ;
}
}
return null ;
}
这样应该就可以了吧,这个不止边界值的时候有问题哦~
好的 可以本地自测没问题之后提个 PR ,我本地再测测,review 下。
@crossoverJie 这个bug现在还没有修复吗?
@aworker
暂时没时间处理,感兴趣可以提个 PR 来修复。
关于这个BUG提了个PR