zoukankan      html  css  js  c++  java
  • 链表底层实现Java的Map(上)

    链表实现Map

    public class LinkListMap<K,V> implements Map<K,V> {
    
        private class Node
        {
            public K key;
    
            public V value;
    
            public Node next;
    
            public Node(K key,V value,Node next)
            {
                this.key = key;
    
                this.value = value;
    
                this.next = next;
            }
    
            public Node()
            {
                this(null,null,null);
            }
    
            public Node(K key)
            {
                this(key,null,null);
            }
    
            @Override
            public String toString()
            {
                return key.toString() + ":" + value.toString();
            }
        }
    
        private Node dummyHead;
    
        private int size;
    
        public LinkListMap()
        {
            dummyHead = new Node();
            size = 0;
        }
    
        private Node getNode(K key)
        {
            Node cur = dummyHead.next;
            while (cur != null)
            {
                if (cur.key.equals(key))
                {
                    return cur;
                }
                cur = cur.next;
            }
            return null;
        }
    
        @Override
        public void add(K key, V value) {
            Node node = getNode(key);
            if (node == null)
            {
                dummyHead.next = new Node(key,value,dummyHead.next);
                size++;
            }else {
                node.value = value;
            }
        }
    
        @Override
        public V remove(K key) {
            Node prv = dummyHead;
            while (prv.next != null)
            {
                if (prv.next.key.equals(key))
                {
                    break;
                }
                prv = prv.next;
            }
    
            if (prv.next != null)
            {
                Node delNode = prv.next;
                prv.next = delNode.next;
                delNode.next = null;
                return  delNode.value;
            }
            return null;
        }
    
        @Override
        public boolean contains(K key) {
            return getNode(key) != null;
        }
    
        @Override
        public V get(K key) {
            Node node = getNode(key);
            return node == null  ? null : node.value;
        }
    
        @Override
        public void set(K key, V newValue) {
            Node node = getNode(key);
            if (node == null)
            {
                throw new IllegalArgumentException("key is no exist.");
            }else {
                node.value = newValue;
            }
        }
    
        @Override
        public int getSize()
        {
            return size;
        }
    
        @Override
        public boolean isEmpty()
        {
            return size == 0;
        }
    
        @Override
        public String toString()
        {
            StringBuffer str = new StringBuffer("");
            Node node = dummyHead.next;
            while (node != null)
            {
                str.append(node + "
    ");
                node = node.next;
            }
            return str.toString();
        }
    
    }
    
  • 相关阅读:
    SQL表结构
    Mssql 行转列
    动态Order by
    Nopi Excel导入
    使用SyncToy 同步两台机器上的文件夹
    ueditor1.4.3 在IE8下的 BUG
    WebService国内省市县接口
    AsyncTask的参数介绍
    Json分割并解析
    JQuery iframe页面操作父页面中的元素与方法
  • 原文地址:https://www.cnblogs.com/dslx/p/10498451.html
Copyright © 2011-2022 走看看