发布时间:2023-02-09 文章分类:编程知识 投稿人:赵颖 字号: 默认 | | 超大 打印

读Java实战(第二版)笔记05_Collection API的增强功能

1.集合工厂

1.1.Arrays.asList()

1.1.1.创建了一个固定大小的列表

1.1.2.列表的元素可以更新

1.1.3.不能增加或者删除

1.1.4.大小固定的可变数组

1.2.没有Arrays.asSet()

1.2.1.可以向HashSet的构造器传递一个列表实现

1.2.2.Stream.of 结合Collectors.toSet()实现

1.2.3.可变的Set

1.3.List.of

1.3.1.一个只读列表

1.3.2.保护你的集合,以免被意外地修改

1.3.3.不要在工厂方法创建的列表中存放null元素

1.3.4.10个元素是分水岭,Set,Map也一样

1.3.5.使用List.of创建超过10个元素的列表

1.3.6.使用List.of创建不超过10个元素的列表

1.4.Set.of

1.4.1.创建列表元素的不可变Set集合

1.5.Map.of

1.5.1.创建不到10个键值对的小型不可变Map

1.6.Map.ofEntries

1.6.1.以变长参数列表形式组织的Map.Entry<K, V>对象作为参数

1.6.2.创建额外的对象,从而实现对键和值的封装

1.6.3.不可变Map

1.6.4.Map.entry

1.6.4.1.用于创建Map.Entry对象的工厂方法

1.7.Java9

1.8.除非需要进行某种形式的数据处理并对数据进行转换,否则应该尽量使用工厂方法

2.定长元素版本的函数

2.1.没有分配数组、初始化以及最后对它进行垃圾回收的开销

3.变参版本的函数

3.1.需要额外分配一个数组

3.2.这个数组被封装于列表中

3.3.要负担分配数组、初始化以及最后对它进行垃圾回收的开销

4.使用Set

4.1.removeIf

4.1.1.移除集合中匹配指定谓词的元素

5.使用List

5.1.removeIf

5.1.1.移除集合中匹配指定谓词的元素

5.2.replaceAll

5.2.1.用一个函数(UnaryOperator)替换元素

5.3.sort

5.3.1.对列表自身的元素进行排序

6.Java8

6.1.改变的是集合自身

7.使用Map

7.1.forEach

7.1.1.接受一个BiConsumer,以Map的键和值作为参数

7.1.2.让代码更简洁

7.2.排序

7.2.1.Entry.comparingByValue

7.2.2.Entry.comparingByKey

7.3.getOrDefault

7.3.1.提供一个默认值

7.3.2.在Map中找不到指定的键时,该默认值会作为返回值

7.3.3.如果键在Map中存在,但碰巧被赋予的值是null,那么getOrDefault还是会返回null

7.3.4.无论该键存在与否,作为参数传入的表达式每次都会被执行

7.4.computeIfAbsent

7.4.1.如果指定的键没有对应的值(没有该键或者该键对应的值是空),那么使用该键计算新的值,并将其添加到Map中

7.4.2.应用场景是缓存信息

7.5.computeIfPresent

7.5.1.如果指定的键在Map中存在,就计算该键的新值,并将其添加到Map中

7.5.2.如果生成结果的方法返回的值为空,那么当前的映射就会从Map中移除

7.6.compute

7.6.1.使用指定的键计算新的值,并将其存储到Map中

7.7.remove

7.7.1.从Map中删除指定键对应的映射条目

7.8.replaceAll

7.8.1.通过BiFunction替换Map中每个项的值

7.9.Replace

7.9.1.如果键存在,就可以通过该方法替换Map中该键对应的值

7.9.2.可以仅在原有键对应某个特定的值时才进行替换

7.10.merge

7.10.1.在合并时对值有更加灵活的控制

7.10.1.1.使用BiFunction方法处理重复的键

7.10.1.2.执行初始化检查

7.10.2.如果指定的键并没有关联值,或者关联的是一个空值,那么会将它关联到指定的非空值

7.10.3.否则,会用给定映射函数的[返回值]替换该值,如果映射函数的返回值为空就删除[该键]

7.11.putAll

7.11.1.Map中不能含有重复的键

8.桶(bucket)

8.1.由链接列表(LinkedList)实现的

8.2.时间复杂度是O(n)

9.同步式的Hashtable

9.1.标准的HashMap是不带同步的

10.ConcurrentHashMap

10.1.应对高并发的场景

10.1.1.读写性能都更好

10.1.2.其内部实现基于分段锁

10.1.3.允许执行并发的添加和更新操作

10.2.forEach

10.2.1.对每个(键,值)对执行指定的操作

10.3.reduce

10.3.1.依据归约函数整合所有(键,值)对的计算结果

10.4.search

10.4.1.对每个(键,值)对执行一个函数,直到函数取得一个非空值

10.5.参数形式

10.5.1.使用键(forEachKey, reduceKeys, searchKeys)

10.5.2.使用值(forEachValue, reduceValues, searchValues)

10.5.3.使用Map.Entry对象(forEachEntry, reduceEntries, searchEntries)

10.6.注要点

10.6.1.都不会对ConcurrentHashMap的状态上锁

10.6.2.只是在运行中动态地对对象加锁

10.6.3.执行操作的函数不应对执行顺序或其他对象或可能在运行中变化的值有任何的依赖

10.6.4.int、long、double等基础类型的归约操作(reduceValuesToInt、reduce-KeysToLong等)会更加高效

10.7.并行阈值

10.7.1.Map的规模比指定的阈值小,方法就只能顺序执行

10.7.2.使用通用线程池时,如果把并行阈值设置为1将获得最大的并行度

10.7.3.阈值设定为Long.MAX_VALUE时,方法将以单线程的方式运行

10.8.mappingCount

10.8.1.以长整形long返回Map中的映射数目

10.9.keySet

10.9.1.以Set的形式返回ConcurrentHashMap的一个视图

10.9.2.Map中的变化会反映在返回的Set中