一、集合

(一)Collection集合

image-20260207175905405

Collection集合的特点

image-20260207175937432

1、List

ArrayList数组、LinkedList链表

2、Set

HashSet

JDK8前:数组+链表

JDK8后:数组+链表+红黑树

LinkedHashSet

HashSet中的每个元素都加上前后指针,变成双向链表

TreeSet

自定义排序规则

image-20260207174737113

image-20260207174919356

Double.compare(a, b)默认是升序,即a-b>0则a在排在后面。

如果修改成Double.compare(b, a)就变成降序了。

Collection集合的常用方法

image-20260207180043460

(二)Map集合

键值对

image-20260207175427860

Map集合体系的特点

image-20260207175515215

Map常用方法

image-20260207175642875

Map集合的遍历方式

image-20260207200510900

1、键

image-20260207201458784

2、键值对

image-20260207200921676

3、lambda表达式

image-20260207201112305

其实在forEach的底层源码中,就是使用的方法二键值对来进行遍历的,每次遍历完再调用accpet方法,对遍历的元素进行相应的操作。

image-20260207201313525

二、Stream流

image-20260207210132559

(一)获取Stream流

Collection系列、数组获取Stream流

image-20260208163039366

Map系列获取Stream流

image-20260208163431806

(二)Stream流常用方法

中间方法

image-20260208170509248

如果希望自定义对象能够去重复,重写对象的hashCode和equals方法,才可以去重!

终结方法

image-20260208172318683

注:max和min方法返回的类型是Optional对象,需要使用它的get方法来获取其中的内容。

image-20260208172638959

收集Stream流

image-20260208172917327

补充:函数式接口、lambda表达式、方法引用

1、函数式接口

有且仅有一个抽象方法,但是可以有多个非抽象方法接口

1
2
3
public interface Function<T, R>{
R apply(T t);
}

2、lambda表达式

举例:

1
2
3
4
5
6
7
8
public static void main(String[] args){
List<Teacher> list = new ArrayList<>();
list.add(new Teacher("张三", 10000));
list.add(new Teacher("李四", 20000));
// 这里toMap方法需要传入两个Function函数式接口的 实现类对象。使用了lambda表达式,t为参数,t.getName为返回的内容。
Map<String, Double> map = list.stream().collect(Collectors.toMap(t -> t.getName()), t -> t.getSalary());
System.out.println(map);
}

3、方法引用

1
Map<String, Double> map = list.stream().collect(Collectors.toMap(Teacher::getName, Teacher::getSalary);

方法引用会自动根据toMap所需的参数(Function函数式接口的实现类对象)中唯一的那个抽象方法所需的参数个数(1个),去Teacher中的方法getName中匹配两个参数的getName方法作为这个抽象方法的@Override

lambda表达式方法引用都是去匹配函数式接口的实现类对象中那个抽象方法的@Override