1.集合概述
- 集合主要为了保存数量不确定的数组以及具有映射关系的数据(关联数组)。
- 集合类主要为了保存、盛装其他数据,因此也被称为容器类。位于Java.util包下。
- 集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。
- Java 集合类型分为 Collection 和 Map,它们是 Java 集合的根接口,这两个接口又包含了一些子接口或实现类。
Collection接口基本结构(黄色为接口,蓝色为实现类)
Map接口基本结构
集合接口及其作用:
集合实现类及其作用:
2.Collection接口
- Collection是List、Set和Queue的父接口,通常情况下不被直接使用。
- Collection接口定义了一些通用的方法,可以实现对集合的基本操作(Set,List和Queue)
Collection接口常用方法如下:
3.List集合(ArrayList与LinkedList)
- List为有序可重复集合,集合中每个元素都有其对应的顺序索引。
- List集合默认按元素添加顺序设置元素的索引(第一个为0,第二个为1…)
- List实现Collection接口,主要有两个常用实现类:ArrayList与LinkedList
3.1 ArrayList类
ArrayList类实现了可变数组的大小,此外还提供了快速基于索引访问元素的方式,对尾部成员的增加和删除支持较好。向ArrayList中插入删除元素速度较慢。
3.1.1 构造方式
- ArrayList():构造一个初始容量为 10 的空列表。
- ArrayList(Collection<?extends E>c):构造一个包含指定 Collection 元素的列表,这些元素是按照该 Collection 的迭代器返回它们的顺序排列的。
3.1.2 常用方法
除Collection接口方法外还包括:
3.2 LinkedList类
LinkedList类采用链表接口保存对象,便于向集合中插入或者删除元素。插入删除元素效率高,但随机访问元素速度较慢(特定索引)。
构造方式同ArrayList,有两种
常用方法:
3.3 ArrayList与LinkedList区别
相同:
ArrayList与LinkedList都是List接口的实现类,都实现了List的所有未实现的方法
不同:
- ArrayList基于动态数组数据结构的实现,访问速度优于LinkedList
- LinkedList基于链表数据结构的实现,占用内存空间较大,但在批量插入删除时优于ArrayList
4.Set集合(HashSet与TreeSet)
set实现collection接口,Set集合中的对象不按特定顺序排序且不能包含重复对象(只能有一个null)
4.1 HashSet
4.1.1 特点:
- HashSet按照HashSet算法存储集合中的元素,有很好的存取查找性能。
- 不能保证元素的排列顺序
- HashSet非同步,若多个线程需同时访问或修改一个HashSet需通过代码保证其同步。
- 集合元素值可以为null(只能有一个)
4.1.2 存取流程:
向HashSet集合存入一个元素时,HashSet会调用该对象的hashCode()方法来取得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。若有两个元素通过equals()方法比较返回的结果为true,但它们的hashCode不相等,HashSet会将他们存储于不同位置,依然可以添加成功。(Set中存的是引用而非值)
4.1.3 构造方法:
- HashSet():构造一个新的空的 Set 集合。
- HashSet(Collection<? extends E>c):构造一个包含指定 Collection 集合元素的新 Set 集合。其中,“< >”中的 extends 表示 HashSet 的父类,即指明该 Set 集合中存放的集合元素类型。c 表示其中的元素将被存放在此 Set 集合中。
4.2 TreeSet
TreeSet同时实现了Set与SortSet接口(SortSet为Set的子接口,可以实现对集合进行自然排序),因此使用TreeSet类实现Set接口默认情况下是自然排序的(升序)。2) TreeSet只能对实现了Comparable接口的类进行排序(Comparable接口有一个compareTo(Object o)方法用于比较两个对象的大小)。
注:实现了Comparable接口的类如下:
4.2.1 TreeSet的常用方法:
5.Map集合
5.1 概述
Map 集合里保存着两组值,一组值用于保存 Map 里的 key,另外一组值用于保存 Map 里的 value,key 和 value 都可以是任何引用类型的数据。Map 的 key 不允许重复,value 可以重复。
Map 接口主要有两个实现类:HashMap 类和 TreeMap 类。其中,HashMap 类按哈希算法来存取键对象,而 TreeMap 类可以对键对象进行排序。
5.2 Map接口常用方法
注意:TreeMap 类的使用方法与 HashMap 类相同,唯一不同的是 TreeMap 类可以对键对象进行排序
5.3 遍历Map集合的四种方式
5.3.1 使用entries实现Map遍历
for (Map.Entry<String, String> entry : map.entrySet())
eg.
for (Map.Entry<String, String> entry : map.entrySet()) {String mapKey = entry.getKey();String mapValue = entry.getValue();System.out.println(mapKey + ":" + mapValue);}
5.3.2 使用for-each循环遍历key或values(一般只需key或value其一时使用,比entrySet性能好)
// 打印键集合for (String key : map.keySet()) {System.out.println(key);}// 打印值集合for (String value : map.values()) {System.out.println(value);}
5.3.3 使用迭代器(Iterator)遍历
Iterator <Entry<String, String>> entries = map.entrySet().iterator();while (entries.hasNext()) {Entry<String, String> entry = entries.next();String key = entry.getKey();String value = entry.getValue();System.out.println(key + ":" + value);}
5.3.4 通过键找值遍历(效率较低,从键取值较耗时)
for(String key : map.keySet()){String value = map.get(key);System.out.println(key+":"+value);}
5.4 Java8中map新增方法
见blog:https://www.cnblogs.com/winkey4986/p/10957428.html
6.不可变集合(Java9新增)
Java9提供了一个对集合添加元素的简单方法,即Set,List,Mao得of方法可创建元素得不可变集合(不可变意味着程序不能向集合中田间元素,也不能从集合中删除元素)eg.
List list = List.of(34, -25, 67, 231);
Map map = Map.of("语文", 89, "数学", 82, "英语", 92);