集合主要分为两大系列:Collection和Map
Collection:
Collection的子接口有Set 、List、Queue
Collection是层次结构的根接口,是所有单列集合的父接口,在Collection中定义了单列集合(List和Set)的通用的一些方法:
1、添加元素
(1)add(E obj):添加元素对象到当前集合中
(2)addAll(Collection other):添加other集合中的所有元素对象到当前集合中,即this = this ∪ other
2、删除元素
(1) boolean remove(Object obj) :从当前集合中删除第一个找到的与obj对象equals返回true的元 素。
(2)boolean removeAll(Collection coll):从当前集合中删除所有与coll集合中相同的元素。即 this = this - this ∩ coll
(3)boolean retainAll(Collection coll):从当前集合中删除两个集合中不同的元素,使得当前集合 仅保留与c集合中的元素相同的元素,即当前集合中仅保留两个集合的交集,即this = this ∩ coll; (4)void clear():清空集合
(5)boolean removeIf(Predicate filter) :删除满足给定条件的此集合的所有元素。 removeIf方法是Java8引入的。
3、查询与获取元素
(1)boolean isEmpty():判断当前集合是否为空集合。
(2)boolean contains(Object obj):判断当前集合中是否存在一个与obj对象equals返回true的元 素。
(3)boolean containsAll(Collection c):判断c集合中的元素是否在当前集合中都存在。即c集合是 否是当前集合的“子集”。
(4)int size():获取当前集合中实际存储的元素个数
(5)Object[] toArray():返回包含当前集合中所有元素的数组
(6)T[] toArray(T[] arr):返回包含当前集合中所有元素的数组
4、遍历集合
(1)default void forEach(Consumer action)
(2)foreach循环。
所有实现了java.lang.Iterable接口的集合都支持foreach循环。而Collection接口就继承了Iterable接 口。
Set集合
Set的常用实现类有:HashSet、TreeSet、LinkedHashSet等。他们都是都不能储存重复的元素,那他们如何判断储存的是否重复?以及他们时候用于什么场景
HashSet和LinkedHashSet元素不可重复是依赖于equals和hashCode方法。HashSet底层是哈希表查询和增删的效率高,适合用于需要快速访问且无需顺序的。而LinkedHashSet底层是哈希表+链表,链表可以保障元素的有序,可以按照插入的顺序遍历。
TreeSet元素不可重复是依赖于比较器的compareTo或compare方法,因为他底层基于二叉树(红黑树,查询效率高于链表,增删效率高于数组,元素实现排序。
List集合
List集合关心元素是否有序,而不关心是否重复
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据索 引来操作集合元素的特有方法,如下:
1、添加元素
void add(int index, E ele):把元素添加到指定位置 boolean addAll(int index, Collection eles):把一组元素添加到指定位置
2、删除元素
E remove(int index):删除指定位置的元素
3、修改元素
E set(int index, E ele):替换[index]位置的元素 default void replaceAll(UnaryOperator operator) :按指定操作的要求替换元素
4、获取元素
E get(int index):返回[index]位置的元素
List subList(int fromIndex, int toIndex):返回[fromIndex, toIndex)范围的元素
int indexOf(Object obj):查询obj在列表中的位置,如果有重复,返回第1个
int lastIndexOf(Object obj):查询obj在列表中的位置,如果有重复,返回最后1个
5、其他方法
default void sort(Comparator c):对List集合元素进行排序,如果想要通过元素的自然比较器排序,调用sort方法时传入null即可。
Vector和ArrayList的区别
核心类库中List接口有两个实现类:Vector和ArrayList。它们的底层物理结构都是数组,我们称为动态 数组。
(1)ArrayList是新版的动态数组,线程不安全,效率高,Vector是旧版的动态数组,线程安全,效率 低。
(2)动态数组的扩容机制不同,ArrayList扩容为原来的1.5倍,Vector扩容增加为原来的2倍。
(3)数组的初始化容量,如果在构建ArrayList与Vector的集合对象时,没有显式指定初始化容量,那 么Vector的内部数组的初始容量默认为10,而ArrayList在JDK1.6及之前的版本也是10,JDK1.7之后的 版本ArrayList初始化为长度为0的空数组,之后在添加第一个元素时,再创建长度为10的数组。
之后就是栈和队列了
栈
Stack实现了Vector接口
体现栈结构的操作方法:
peek()方法:查看栈顶元素,不弹出。
pop()方法:弹出栈。
push(E e)方法:压入栈。
队列
Linkedlist实现Queue接口也实现List接口既可以模拟栈也可以模拟队列
入队add();
出队poll();
获取对头peek();
删除remove();
........