java jdk Collection and Map 关系图(实线是继承虚线是实现)
JavaCollectionAndMap.pngCollection
-
Iterable
Iterable定义了foreEach功能,同时具备操作元素Iterator迭代器
//hasNext,next,remove Iterator<T> iterator(); default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
-
Collection
所有集合容器的顶级接口,它规范了集合的操作标准
boolean add(E e); //添加元素 boolean remove(Object o); //删除指定元素 boolean containsAll(Collection<?> c);//返回 true如果这个集合包含指定集合的所有元素。 boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c); void clear(); //删除集合中所有元素 boolean equals(Object o); int size();//集合大小 boolean isEmpty();//集合是否为NULL boolean contains(Object o); ....
-
List
继承了 Collection interface 线性方式存储,集合元素可以重复,List 有三个实现分别为 ArrayList, LikedList,Vector
- ArrayList 可变数组,随机访问速度快,插入删除速度慢这是数组数据结构特性
//实现了List,并且实现了RandomAccess 实现了这个接口标准代表支持可随机访问,比如Vectory也实现了RandomAccess,
//而LikedList却没有实现,这只是一种分类思想,因为处理事情不一样所以依赖的标准也不一样
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
//注意看它定义了一个Object数组 这里和Vector中elementData不一样,多了transient 不支持序列化,
//并在当前类重写了 readObject和writeObject方法,这样在传输中不占用空间,保证了效率
transient Object[] elementData; // non-private to simplify nested class access
//添加元素时实际是将元素值赋值给数组对应的下标 elementData[size++] = e;
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
- LikedList 链表结构,新增删除速度快,访问较慢 这是链表数据结构特性
//首先我们看下LinkedList实现了List,并且实现了Dque双向队列可 以支持LIFO形式也可以支持LIFO形式,详细情况可以单独去看Dque的实现
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
// 添加元素
public boolean add(E e) {
linkLast(e);
return true;
}
//Node 是链表的实现方式,添加元素是向末尾添加
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
- Vectory
//与List 实现的内容一模一样
public class Vector<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
//为什么和ArrayList 一模一样 还做一个Vector呢? 因为行为实现不一样
//它是安全的,因为它里面的public 方法都用了synchronized 互斥锁保证了线程安全,
//但这个锁不是一个优雅的锁实现,而是一个重量级锁,它的性能会比较差
//另外扩容倍数不一样
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
Set
继承了 Collection interface 线性方式存储,集合元素不可重复,Set 有三个实现分别为 HashSet, SortedSet
-
HashSet hash表实际就是通过HashMap来实现的
//通过hashMap来实现, 注意此处的transient 之前ArrayList中也有说明 private transient HashMap<E,Object> map; //就是这么简单的添加,且非线程安全 public boolean add(E e) { return map.put(e, PRESENT)==null; } //存入的对象需要重写 eques 和 hashCode这样可保证值不重复
- SortedSet
网友评论