集合概述
javva集合大致可以分为Set、List、Queue、Map,四种体系。其中,Set代表无序、不可重复的集合;List代表有序、重复的集合;Map代表具有映射关系的集合;java5增加的Queue代表一种队列集合实现。所有的集合类都位于java.util包下。

单列集合
java.util.Collection是单列集合的顶层父接口,它有2个常用的子接口:List和Set.
List集合中的元素有序,并且可以重复,元素有索引;Set集合中的元素无序,并且不可以重复(唯一),元素无索引。
-
Collection集合中的常用方法:
- public boolean add(E e):把给定的对象添加到当前集合中
- public void clear():清空集合中所有的元素
- public boolean remove(E e):把给定的对象在当前集合中删除
- public boolean contains(Object obj):判断当前集合中是否包含给定的对象
- public boolean isEmpty():判断当前集合是否为空
- public int size():返回集合中元素的个数
- public Object[] toArray():把集合中的元素,存储到数组中
-
List集合除了有Collection中的常用方法外,还有以下常用方法:
- public void add(int index, E element):将将指定的元素,添加到该集合中的指定位置上
- public E get(int index):返回集合中指定位置的元素
- public E remove(int index):移出列表中指定位置的元素,返回的是被移除的元素
- public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值是更新前的元素。
-
LinkedList类除了拥有List接口中的方法,还有以下方法:
- public void addFirst(E e):将指定元素插入此列表的开头
- public void addLast(E e):将指定元素添加到此列表的结尾
- public E getFirst():返回此列表的第一个元素
- public E getLast():返回此列表的最后一个元素
- public E removeFirst():移除并返回此列表的第一个元素
- public E removeLast():移除并返回此列表的最后一个元素
- public E pop():从此列表所表示的堆栈处弹出一个元素。就是removeFirst()
- public void push(E e):将元素推入此列表所表示的堆栈。就是addFirst()
Set集合,特点:元素无索引,元素不能重复,无序。常用的实现类有HashSet、LinkedHashSet(继承了HashSet)、TreeSet。
-
HashSet
- 特点是:不能保证元素的排列顺序,顺序可能与添加顺序不同;HashSet不是同步的;集合元素值可以为null.
- 存储数据的结构是哈希表结构,在jdk8以前是数组+链表;在jdk8以后:当链表元素个数没有超过8个就是数组+链表,链表元素个数超过8个就是数组+链表+红黑树
-
保证元素唯一的原理:主要依赖元素的hashCode()和equals()方法:
- 当集合存储某个元素,就会调用该元素的hashCode()方法计算该元素的哈希值;
- 判断该哈希值对应的位置上,是否有相同哈希值的元素;
- 如果该位置上没有相同哈希值的元素,那么久直接存储
- 如果该位置上有相同哈希值的元素,那么就产生了哈希冲突
- 如果产生了哈希冲突,就会调用该元素的equals()方法与该位置上所有的元素一一进行比较:如果比较完成后,该位置上任意一个元素与该元素相等,那么就不存储;如果比较完成后,该位置上没有一个元素与该元素相等,那么就存储
LinkedHashSet:继承了HashSet,所以也是根据元素的hashCode值来决定元素的存储位置,但它同事使用链表来维护元素的次序,这样使得元素看起来是以插入顺序保存的。是链表和哈希表组合的一个数据结构,依然不允许集合元素重复。
-
TreeSet:是Set接口的一个实现类,底层依赖于TreeMap,是一种基于红黑树的实现。
- 特点是元素唯一,元素没有索引,集合元素处于排序状态。使用元素的自然顺序对元素进行排序(要求集合元素所属的类必须实现Comparable接口,重写compareTo方法,在其中书写排序规则),或者根据创建TreeSet时提供的Comparator比较器进行排序,具体取决于使用的构造方法。空参构造就是自然排序。有参构造,参数就是比较器,是按比较器排序。
双列集合

Map<K, V> 接口:也称Map集合,是所有双列集合的顶层父接口。K用来限制键的类型,V用来限制值的类型。
-
Map集合特点:
- Map集合存储元素是以键值对的形式存储,也就是说每一个键值对都有键和值
- 通过键取值
- Map集合中的键不能重复,如果键重复了,那么值就会覆盖
- Map集合中的值是可以重复的
Map接口中常用方法:
- public V put(K key, V value):把指定的键与指定的值添加到Map集合中,返回被替换的值,如果没有就返回null
- public V remove(Object key):把指定的键 所对应的键值对元素在Map集合中删除,返回被删除的元素的值
- public V get(Object key):根据指定的键,在Map集合中获取对应的值,没有就返回null
- public boolean containsKey(Object key):判断该集合中是否有此键
- public boolean containsValue(Object value):判断该集合中是否有此值
- public int size():获取集合中键值对的个数
- public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中
- public Collection<V> values():获取Map集合中所有的值,存储到Collection集合中
- public Set<Map.Entry<K, V>> entrySet():获取到Map集合中所有的 键值对对象 的集合(Set集合)。Entry<K, V>表示键值对对象类型。由于Entry<K, V>是Map接口的内部接口,所以在外部使用的时候需要写成Map.Entry<K, V> 。 (外部要方位成员内部类:外部类.内部类)。Entry中的常用方法:1、K getKey():获取键值对对象包装的键;2、V getValue():获取键值对对象包装的值
Map的遍历:方式1、键找值;方式2、键值对方式
方式1:键找值方式
1. 获取map集合中所有的键,keySet()方法
2. 遍历获取到的所有键
3. 根据键找值
方式2:根据键值对对象的方式
1. 获取所有键值对对应的所有键值对对象
2. 循环遍历所有键值对对象
3. 使用键值对对象获取键和值,getKey()和getValue()
HashMap集合,根据hashCode和equals方法保证键唯一,类似于单列集合中的HashSet。
TreeMap集合,键唯一,可以对键值对进行排序。构造方法TreeMap()是按照默认规则对键记性排序,要求键所属的类实现Comparable接口,重写compareTo方法,在该方法中书写默认排序规则。构造方法TreeMap(Comparator<? super K> comparator)是按照指定规则对键进行排序。类似于单列集合中的TreeSet。