java collection之Set

原创
2019/02/19 13:56
阅读数 7

1、HashSet 非线程安全

HashSet的实现是基于Map的存储方式(Map的实现是基于数组+链表的数据结构),如下是HashSet的add的过程源码:

a、调用add方法时,实际上是调用map的put方法

b、在map.put过程中,源码如下:

首先使用key去计算hash值,根据hash值在数组地址块中检查该位置是否已经存放了数据。如果没有数据,则直接调用addEntry(hash, key, value, i);将数据添加进去。

如果数组的该位置已经有数据了,则对比该位置上所有的map链表数据,如果存在key完全一样,则用新值替换原来的旧值

否则就是在原来的map最后加上链接到最新的数据

最后得到的数据结构如下:

 

2、TreeSet 有序,非线程安全

TreeSet的存储过程是使用树结构,根据key值的比较来确定在树的左右,源码如下:

public V put(K key, V value) {
        Entry<K,V> t = root;
        if (t == null) {
        // TBD:
        // 5045147: (coll) Adding null to an empty TreeSet should
        // throw NullPointerException
        //
        // compare(key, key); // type check
            root = new Entry<K,V>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        else {
            if (key == null)
                throw new NullPointerException();
            Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        Entry<K,V> e = new Entry<K,V>(key, value, parent);
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }

 

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部