四、哈希表+映射+集合

Posted on 2020-11-16 12:26  MissRong  阅读(68)  评论(0)    收藏  举报

四、哈希表+映射+集合

1.注意:LinkedHashMap和HashMap有以下不同
      1)HashMap实现了Map接口,是无序的,不保存元素的插入顺序,在内部也不保证按照元素的大小顺序排列。

           HashMap存值的时候会根据key的hashCode()来计算存储的位置(位置是散列的,所以说其无序)。

           其实HashMap还是有序的,只是它是按照key的hashCode()求出的散列码排的序。
      2)LinkedHashMap是HashMap的子类,其操作和HashMap相同。

           LinkedHashMap不允许重复的元素,但是保留插入元素的顺序。

          当对LinkedHashMap进行迭代时,他按照元素添加的顺序返回。

2.Hash相关操作的时间复杂度

  

 

Hash Table基于严格平衡的红黑树 

 

对于Hash,当算出的散列码值相同时,就会被排到一个链表中,最糟糕的情况就是所有元素都在一个链表中,时间复杂度也就由O(1)变成O(n)了。

解释如下图:

3.Java中的一些方法

 

 

 

 1)HashSet部分源码

HashSet底层实现是基于HashMap的,可参考源码如下:

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

2)HashMap部分方法源码

(1)get()

    public V get(Object key) {
        Node<K,V> e;
        return (e = getNode(hash(key), key)) == null ? null : e.value;
    }

(2)put()

    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3