本文只是简单介绍几个类的区别以及相关的一些常用方法,详细的源码解析有空会陆续发出
List
int size(); //返回list集合大小
boolean isEmpty(); //判断集合是否为空
boolean contains(Object o); //判断集合是否包含某个值
Iterator<E> iterator(); //返回集合的迭代器
Object[] toArray(); //将集合转为数组
<T> T[] toArray(T[] a); //将链表转为数组
boolean add(E e); //向集合中添加元素
boolean remove(Object o);//删除集合中某个元素
boolean containsAll(Collection<?> c); //是否包含某个集合中所有值
boolean addAll(Collection<? extends E> c);//将一个集合中所有值加入到集合中
boolean addAll(int index, Collection<? extends E> c); //和上面一样,只不过加在指定位置
boolean removeAll(Collection<?> c); //批量删除元素
boolean retainAll(Collection<?> c); //集合交集
//排序
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
void clear(); //删除所有元素
boolean equals(Object o); //判断是否相等
int hashCode(); //返回集合的HashCode
E get(int index); //获取相应位置的元素
E set(int index, E element); //修改指定位置的元素
void add(int index, E element); //指定位置添加元素
E remove(int index);//删除指定位置的元素
int indexOf(Object o); //返回指定元素的位置
int lastIndexOf(Object o); //返回最后一个元素
ListIterator<E> listIterator(); //返回list迭代器
ListIterator<E> listIterator(int index); //相比于上面这个多了个指定位置
List<E> subList(int fromIndex, int toIndex); //截取集合
实现了List接口的有ArrayList、LinkedList、Vector
ArrayList基于数组实现,初始大小为10,每次扩容为1.5被。读数组比LinkedList快,因为是数组结构,只需要找到相应下标就行;写速度比LinkedList慢,因为ArrayList写数据需要移动下标以及下标之后的所有数据,而LinkedList只需要维护前驱以及后驱就可以了。
LinkedList基于链表实现,不会触发扩容。
Vector基于数组,每次扩容为2被。方法都被synchronized修饰,是线程安全的集合。
Set
由于都实现了Collection接口,因此所包含的方法几乎一样。Set中不可以出现重复数据。
HashSet按照Hash算法存储值,读取速度很快,并且无序,可以为null值
LinkedHashSet是有序的,由于是链表结构,因此读取熟读比HashSet较差
TreeSet是有序的,不能写入null值
Map
HashMap使用数组加链表(红黑树)实现,线程不安全,可以将key以及value设为空值,扩容为每次扩容2倍,默认初始大小为16,必须为2的次幂(源码解析已经发出)
HashTable使用数组加链表实现,线程安全,不可以将key以及value设为空值,扩容为每次扩容2被加1,默认初始大小为11,未指定必须为2的次幂。由于synchronized,性能相较于HashMap比较差
ConcurrentHashMap线程安全,1.8之前利用分段锁实现线程安全,默认分段大小为16,可以简单理解为16个HashTable,所以性能相较于HashTable好一点。1.8之后数据结构类似HashMap并且使用CAS以及synchronized进行保证线程安全并采用Volatile修饰value以及next
TreeMap会对Key进行排序
LinkedHashMap是有序的,先入先出,采用双向链表以及Hash表实现
int size(); //获取大小
boolean isEmpty(); //判断是否为空
boolean containsKey(Object key); //判断是否存在某个键
boolean containsValue(Object value); //判断是否存在某个值
V get(Object key); //根据键获取值
V put(K key, V value); //插入值
V remove(Object key); //删除
putAll(Map<? extends K, ? extends V> m); //批量插入
clear(); //清除值
Set<K> keySet(); //获取KeySet
Collection<V> values(); //获取值集合
Set<Map.Entry<K, V>> entrySet(); //获取entrySet
boolean equals(Object o); //判断是否相等
int hashCode(); //返回map的Hash
Queue
同样实现了Collection接口,但是有些不同的方法
boolean add(E e); //添加元素 超出上限抛出异常
boolean offer(E e); //同样添加元素 超出上限返回false
E remove(); //移除元素 为空抛出异常
E poll(); //移除元素 为空返回null
E element(); //获取元素,为空抛出异常
E peek(); //获取元素,为空返回null
小编微信公众号: