集合概述
集合是 java 中提供的一种容器,可以用来存储多个数据
数组的长度是固定的,集合的长度是可变的
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
集合框架
集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection
和双列集合java.util.Map
- Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是
java.util.List
和java.util.Set
。其中,List
的特点是元素有序、元素可重复。Set
的特点是元素无序,而且不可重复。List
接口的主要实现类有java.util.ArrayList
和java.util.LinkedList
,Set 接口的主要实现类有java.util.HashSet
和java.util.TreeSet
。 - Map:
Collection 集合
java.util.Collection
接口
所有单列集合(List、Set)的最顶层的接口,里面定义了所有单列集合共性的方法,任意的单列集合都可以使用 Collection 接口中的方法
public boolean add(E e) //把给定的对象添加到当前集合中 。
public void clear() // 清空集合中所有的元素。
public boolean remove(E e) // 把给定的对象在当前集合中删除。
public boolean contains(E e) // 判断当前集合中是否包含给定的对象。
public boolean isEmpty() // 判断当前集合是否为空。
public int size() // 返回集合中元素的个数。
public Object[] toArray() // 把集合中的元素,存储到数组中。
List 接口
java.util.List
接口继承自 Collection
接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对
象称为 List 集合。在 List 集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过
索引来访问集合中的指定元素。另外,List 集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
- 特点
- 有序的集合,存储元素和取出元素的顺序是一致的
- 有索引,包含了一些带索引的方法
- 集合中可以有重复的元素,通过元素的
equals()
方法,来比较是否为重复的元素
- 常用方法
public void add(int index,E element) //将指定的元素,添加到该集合中的指定位置
public E get(int index) //返回集合中指定位置的元素
public E remove(int index) //移除列表中指定位置的元素,返回被移除的元素
public E set(int index,E element) //用指定元素替换集合中指定位置的元素,返回更新前的元素
public int size() //返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界
ArrayList 集合
java.util.ArrayList
集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为
查询数据、遍历数据,所以 ArrayList 是最常用的集合。
许多程序员开发时非常随意地使用 ArrayList 完成任何需求,并不严谨,这种用法是不提倡的
- 常用方法
public boolean add(E e) //将指定的元素添加到此集合的尾部。
public E remove(int index) //移除此集合中指定位置上的元素。返回被删除的元素。
public E get(int index) //返回此集合中指定位置上的元素。返回获取的元素。
public int size() //返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界
LinkedList 集合
java.util.LinkedList
集合数据存储的结构是链表结构。方便元素添加、删除的集合。
LinkedList 是一个双向链表
- 常用方法
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() //从此列表所表示的堆栈处弹出一个元素。
public void push(E e) //将元素推入此列表所表示的堆栈。
public boolean isEmpty() //如果列表不包含元素,则返回true。
Set 接口
java.util.Set
接口和 java.util.List
接口一样,同样继承自 Collection
接口,它与 Collection
接口中的方
法基本一致,并没有对 Collection
接口进行功能上的扩充,只是比 Collection
接口更加严格了。与 List
接口不
同的是, Set
接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
tips:Set 集合取出元素的方式可以采用:迭代器、增强 for
- 特点
- 不允许存储重复的元素
- 没有索引,没有带索引的方法,不能使用普通的 for 循环遍历
HashSet 集合
java.util.HashSet
是 Set
接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序
不一致)。 java.util.HashSet
底层的实现其实是一个 java.util.HashMap
支持.
- 特点
- 不允许存储重复的元素
- 没有索引,没有带索引的方法
- 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
- 底层是一个哈希表结构(查询速度非常快)
LinkedHashSet 集合
在 HashSet 下面有一个子类 java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。
特点
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
Collections 类
java.utils.Collections
是集合工具类,用来对集合进行操作。
- 常用方法
public static <T> boolean addAll(Collection<T> c, T... elements) //往集合中添加一些元素。
public static void shuffle(List<?> list) //打乱集合顺序。
public static <T> void sort(List<T> list) //将集合中元素按照默认规则排序。
public static <T> void sort(List<T> list,Comparator<? super T> ) //将集合中元素按照指定规则排序。
Comparable 接口
public static <T> void sort(List<T> list)
:将集合中元素按照默认规则排序。
使用前提
被排序的集合里面存储的元素,必须实现
Comparable
接口,重写comparaTo()
定义排序的规则排序规则
this-参数 :升序
两个对象比较的结果有三种:大于,等于,小于。
如果要按照升序排序, 则 o1 小于 o2,返回(负数),相等返回 0,o1 大于 o2 返回(正数)如果要按照降序排序 ,则 o1 小于 o2,返回(正数),相等返回 0,01 大于 02 返回(负数)
Comparator 接口
public static <T> void sort(List<T> list,Comparator<? super T> )
:将集合中元素按照指定规则排序
Comparator
这个接口,位于位于java.util
包下,排序是comparator
能实现的功能之一,该接口代表一个比较器
- 排序规则
public int compare(String o1, String o2) //比较其两个参数的顺序。
// o1 - o2 :升序
Comparable 和 Comparator 两个接口的区别
Comparable
:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()
方法
被称为它的自然比较方法。只能在类中实现compareTo()
一次,不能经常修改类的代码实现自己想要的排序。实现
此接口的对象列表(和数组)可以通过Collections.sort
(和Arrays.sort
)进行自动排序,对象可以用作有序映射中
的键或有序集合中的元素,无需指定比较器。Comparator
强行对某个对象进行整体排序。可以将Comparator
传递给sort
方法(如Collections.sort
或Arrays.sort
),从而允许在排序顺序上实现精确控制。还可以使用Comparator
来控制某些数据结构(如有序set
或
有序映射)的顺序,或者为那些没有自然顺序的对象collection
提供排序。
Map 集合
特点
- Map 集合是一个双列集合,一格元素包含两个值(key,value)
- Map 集合中的元素,key 和 value 的数据类型可以相同,也可以不同
- Map 集合中的元素,key 是不允许重复的,value 是可以重复的
- Map 集合中的元素,key 和 value 是一一对应的
常用方法
public V put(K key, V value) // 把指定的键与指定的值添加到Map集合中。 public V remove(Object key) // 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 public V get(Object key) // 根据指定的键,在Map集合中获取对应的值。 public Set<K> keySet() // 获取Map集合中所有的键,存储到Set集合中。 public Set<Map.Entry<K,V>> entrySet() // 获取到Map集合中所有的键值对对象的集合(Set集合)。
遍历 Map 的方法
键找值方式:即通过元素中的键,获取键所对应的值
步骤:
- 获取 Map 中所有的键,由于键是唯一的,所以返回一个 Set 集合存储所有的键。
keyset()
- 遍历键的 Set 集合,得到每一个键。
- 根据键,获取键所对应的值。
get(K key)
- 获取 Map 中所有的键,由于键是唯一的,所以返回一个 Set 集合存储所有的键。
演示:
public class Test { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("张三", 168); map.put("李四", 165); map.put("王五", 178); Set<String> keySet = map.keySet(); for (String string : keySet) { Integer value = map.get(string); System.out.println(value); } } }
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
步骤
- 使用
Map
集合中的方法entrySet()
,把 Map 集合中多个Entry
对象取出来,存储到一个Set
集合中 - 遍历
Set
集合,获取每一个 Entry 对象 - 使用
Entry
对象中的方法getKey()
和getValue()
获取键与值
public class Test { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("张三", 168); map.put("李四", 165); map.put("王五", 178); Set<Map.Entry<String, Integer>> set = map.entrySet(); for (Map.Entry<String,Integer> entry : set) { System.out.println(entry.getKey() + ":" + entry.getValue()); } } }
- 使用
HashMap
java.util.HashMap<K,V> implements Map<K,V>
- 特点:
- HashMap 集合底层是哈希表:查询速度特别快
jdk1.8 之前:数组+单向链表
jdk1.8 之后,数组+单向链表|红黑树(链表的长度超过 8):提高查询速度 - HashMap 集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
- HashMap 集合底层是哈希表:查询速度特别快
LinkedHashMap
java.util.LinkedHashMap<K,V> extends HashMap<K,V>
- 特点:
LinkedHashMap
集合底层是哈希表+链表(保证迭代的顺序)LinkedHashMap
集合是一个有序的集合,存储元素和取出元素的顺序是一致的