4 java se(4)----集合(深入源码分析)

来源:互联网 发布:小米隐藏网络怎么中继 编辑:程序博客网 时间:2024/06/05 10:18

一 什么是容器?作用?

容器就是集合类,集合类是可扩充的数组,用来存放对象。

二 两张结构图




三 细节

1 六个接口: (顶级接口java.lang.Iterator)Iterator------Collection----Set(HashSet(LinkedHashSet))  + List(LinkedList+ArrayList)    

                       (顶级接口java.util.Map)Map---HashMap+TreeMap      

                       (顶级接口java.lang.Comparable)Comparable

2 源码研究:

(1)ArrayList存储对象用的是数组:transient Object[ ] elementData 。为什么用transient,怎么序列化呢?ArrayList有writeObject()和readObject()方法。        LinkedList存储对象用的是链表:transient Node<E> first   transient  Node<E>last .并且Node是LinkedList的内部类。 

这也是ArrayList和LinkedList在增删改查方面效率不一样的原因。

(2)Vector也是用数组存储对象,只不过Vector所有的方法都加了锁(synchronized)。Vctor可以看做是ArrayList的线程安全版。用得比较少。Stack是关于堆栈方面的,用得也比较少。

(3)HashSet继承AbstractSet(只有一个构造方法和三个方法equals()、hashCode()、removeAll())。为了确保Set集合里面的元素不重复所以重写了equals()和hashCode()方法。搞清楚3个问题:

Set用什么保存对象:private transient HashMap<E,Object> map;调用add(E)方法的时候:HashMap中只有键是有用的,值永远都是一个空的Object对象。HashSet调用add()方法时会调用HashMap的input()方法。

public boolean add(E e) {        return map.put(e, PRESENT)==null;    }
private static final Object PRESENT = new Object();

为什么Set不可以有重复元素:因为用的是HashMap来存储对象,HashMap的键对象(也就是E)是不能重复的。

为什么Set无序:这个就是HashMap的原因了。

(4)HashMap:

HashMap的put()源码:

    public V put(K key, V value) {        if (table == EMPTY_TABLE) {            inflateTable(threshold);        }        if (key == null)            return putForNullKey(value);        int hash = hash(key);        int i = indexFor(hash, table.length);        for (Entry<K,V> e = table[i]; e != null; e = e.next) {            Object k;            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {                V oldValue = e.value;                e.value = value;                e.recordAccess(this);                return oldValue;            }        }        modCount++;        addEntry(hash, key, value, i);        return null;    }

(1)先看table时候为空,为空的话就使它不为空

(2)处理空的key

(3)按照键key得到hash值

(4)按照hash值得到table的索引

(5)如果table的这个位置上有了一个值e。 e.hash == hash并且并且值相等,则覆盖。

0 0
原创粉丝点击