Map(一)

1.Map的实现类的结构

1.1 实现类

  Map:key-values

  |----HashMap:线程不安全,效率高  底层 数组+链表+红黑树

    |----LinkedHashMap: 在HashMap基础上加了一对前后指针,对于遍历操作效率高于HashMap

  |----TreeMap :保证按照添加的key-values 排序,考虑的是key的自然排序或定制排序

  |----HashTable:古老的实现类,线程安全,效率低,不能存储null的key-value

    |----Properties:常用来处理配置文件

2. Map结构理解

2.1 结构理解

  key:无序的,不可重复,使用Set,Key所在的类需要重写equals(),hashCode()

  value:无序的,可重复,使用Collection

  Entry:一个key-value 构成entry,无序,不可重复

2.2 HashMap存储结构

Node(int hash, K key, V value, Node<K,V> next) {
    this.hash = hash;
    this.key = key;
    this.value = value;
    this.next = next;
}

2.3 HashMap概念理解

DEFAULT_LOAD_FACTOR :加载因子0~1 小:不容易形成链表,但是数组存储空间利用率不够 大:利用率高,但是容易形成链表
threshold:临界点,到达临界点就扩容 之所以不是在数组的长度到达最大时扩容,是因为数组不一定存放满。 加载因子*数组长度
TREEIFY_THRESHOLD:当数组中某一个元素以链表存在的数据个数>8 && 数组的长度小于 64 则转换成红黑树

2.4 LinkedHashMap

  存储结构:

static class Entry<K,V> extends HashMap.Node<K,V> {
    Entry<K,V> before, after;
    Entry(int hash, K key, V value, Node<K,V> next) {
        super(hash, key, value, next);
    }
}

  重写:

Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
    LinkedHashMap.Entry<K,V> p =
        new LinkedHashMap.Entry<K,V>(hash, key, value, e);
    linkNodeLast(p);
    return p;
}

  前后链接:

private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
    LinkedHashMap.Entry<K,V> last = tail;
    tail = p;
    if (last == null)
        head = p;
    else {
        p.before = last;
        last.after = p;
    }
}

 

  

  

posted @ 2022-04-11 16:55  写代码的小哥哥  阅读(58)  评论(0)    收藏  举报