JCSprout icon indicating copy to clipboard operation
JCSprout copied to clipboard

对LRUAbstractMap 中put方法的一点小疑问?

Open Askerlve opened this issue 7 years ago • 8 comments

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 avatar Apr 25 '18 01:04 Askerlve

@Askerlve 你是指第一次冲突的时候 nNode.next 是空的意思嘛?

crossoverJie avatar Apr 25 '18 07:04 crossoverJie

@crossoverJie 嗯,这样是不是就没办法加入链表了?

Askerlve avatar Apr 26 '18 00:04 Askerlve

@Askerlve 嗯 是有这个问题,如果桶中只有一个数据那就确实 put 不进去了,这种边界值的问题当时没有认真考虑,有兴趣可以提个 PR.

thx.

crossoverJie avatar Apr 26 '18 02:04 crossoverJie

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 ;
    }

这样应该就可以了吧,这个不止边界值的时候有问题哦~

Askerlve avatar Apr 26 '18 04:04 Askerlve

好的 可以本地自测没问题之后提个 PR ,我本地再测测,review 下。

crossoverJie avatar Apr 26 '18 07:04 crossoverJie

@crossoverJie 这个bug现在还没有修复吗?

aworker avatar Jan 03 '19 07:01 aworker

@aworker 暂时没时间处理,感兴趣可以提个 PR 来修复。

crossoverJie avatar Jan 03 '19 08:01 crossoverJie

关于这个BUG提了个PR

shanyao19940801 avatar Mar 07 '19 10:03 shanyao19940801