您的位置:首页 > 编程语言 > Java开发

Java-集合(List,Set,Map)

2021-09-14 23:01 507 查看

1.集合概述

  1. 集合主要为了保存数量不确定的数组以及具有映射关系的数据(关联数组)。
  2. 集合类主要为了保存、盛装其他数据,因此也被称为容器类。位于Java.util包下。
  3. 集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。
  4. Java 集合类型分为 Collection 和 Map,它们是 Java 集合的根接口,这两个接口又包含了一些子接口或实现类。

Collection接口基本结构(黄色为接口,蓝色为实现类)

Map接口基本结构

集合接口及其作用:

集合实现类及其作用:

2.Collection接口

  1. Collection是List、Set和Queue的父接口,通常情况下不被直接使用。
  2. Collection接口定义了一些通用的方法,可以实现对集合的基本操作(Set,List和Queue)

Collection接口常用方法如下:

3.List集合(ArrayList与LinkedList)

  1. List为有序可重复集合,集合中每个元素都有其对应的顺序索引。
  2. List集合默认按元素添加顺序设置元素的索引(第一个为0,第二个为1...)
  3. List实现Collection接口,主要有两个常用实现类:ArrayList与LinkedList

3.1 ArrayList类

ArrayList类实现了可变数组的大小,此外还提供了快速基于索引访问元素的方式,对尾部成员的增加和删除支持较好向ArrayList中插入删除元素速度较慢。

3.1.1 构造方式

  1. ArrayList():构造一个初始容量为 10 的空列表。
  2. ArrayList(Collection<?extends E>c):构造一个包含指定 Collection 元素的列表,这些元素是按照该 Collection 的迭代器返回它们的顺序排列的。

3.1.2 常用方法

除Collection接口方法外还包括:

3.2 LinkedList类

LinkedList类采用链表接口保存对象,便于向集合中插入或者删除元素。插入删除元素效率高,但随机访问元素速度较慢(特定索引)。

构造方式同ArrayList,有两种

常用方法:

3.3 ArrayList与LinkedList区别

相同:

ArrayList与LinkedList都是List接口的实现类,都实现了List的所有未实现的方法

不同:

  1. ArrayList基于动态数组数据结构的实现,访问速度优于LinkedList
  2. LinkedList基于链表数据结构的实现,占用内存空间较大,但在批量插入删除时优于ArrayList

4.Set集合(HashSet与TreeSet)

set实现collection接口,Set集合中的对象不按特定顺序排序且不能包含重复对象(只能有一个null)

4.1 HashSet

4.1.1 特点:

  1. HashSet按照HashSet算法存储集合中的元素,有很好的存取查找性能。
  2. 不能保证元素的排列顺序
  3. HashSet非同步,若多个线程需同时访问或修改一个HashSet需通过代码保证其同步。
  4. 集合元素值可以为null(只能有一个)

4.1.2 存取流程:

向HashSet集合存入一个元素时,HashSet会调用该对象的hashCode()方法来取得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。 若有两个元素通过equals()方法比较返回的结果为true,但它们的hashCode不相等,HashSet会将他们存储于不同位置,依然可以添加成功。(Set中存的是引用而非值)

4.1.3 构造方法:

  1. HashSet():构造一个新的空的 Set 集合。
  2. 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);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: