草庐IT

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

躺柒 2023-04-19 原文

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中

有关读Java实战(第二版)笔记05_Collection API的增强功能的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  7. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐