草庐IT

读Java实战(第二版)笔记01_Java的变化

躺柒 2023-04-19 原文

1. 语言的演变

1.1. C和C++仍然是构建操作系统和各种嵌入式系统的流行工具

1.2. Java和C#等安全型语言在诸多运行资源不太紧张的应用中已经取代了C和C++

1.3. Java可能会被同样运行在JVM上的竞争对手语言(如Scala或Groovy)取代

1.4. Ada、Algol、COBOL、Pascal、Delphi、SNOBOL没落

1.4.1. COBOL一度是最重要的商用语言之一

2. Java的演进路径

2.1. Java 8于2014年3月

2.1.1. 比Java历史上任何一次改变都深远

2.1.2. 长支持(LTS)

2.2. Java 9于2017年9月

2.2.1. 效率提升方面的重要改进

2.2.2. 反应式编程支持

2.2.2.1. RxJava

2.2.2.2. Akka

2.2.2.3. 构建高并发系统的标准方式

2.3. Java 10于2018年3月

2.3.1. 对类型推断做了微调

2.4. Java 11于2018年9月

2.4.1. 异步HTTP客户端库

2.4.2. 长支持(LTS)

2.5. 12 2019 年 3 月

2.5.1. switch语句增强;数字转字符串NumberFormat;G1收集器的优化

2.6. 13 2019 年 9 月

2.6.1. switch优化更新;文本块升级;增加ZGC以将未使用的堆内存返回给操作系统

2.7. 14 2020 年 3 月

2.7.1. instanceof模式匹配;提出Records类;空指针异常的地方变得更具体;移除CMS垃圾收集器

2.8. 15 2020 年 9 月

2.8.1. 密封类;隐藏类;ZGC 成为正式的垃圾收集器

2.9. 16 2021 年 3 月

2.9.1. 内存管理提升;新的打包工具;UNIX-Domain Socket channels;Value-based Classes的警告;提供了 C++ 14语言特性

2.10. 17 2021 年 9 月

2.10.1. 恢复始终严格的浮点语义;增强型伪随机数发生器;弃用即将删除的Applet API

2.10.2. 长支持(LTS)

2.11. 18 2022 年 3 月

2.11.1. 指定 UTF-8 作为标准 Java API 的默认字符集;引入一个简单的 Web 服务器;支持在 Java API 文档中加入代码片段

2.12. 19 2022 年 9 月

2.12.1. 结构化并发

2.12.2. Record模式

2.12.3. 外部函数和内存 API

2.12.4. 虚拟线程

2.12.5. switch 表达式和语句的模式匹配

2.13. 从Java的演进路径来看,它一直致力于让并发编程更容易、出错更少

3. Java8解决了两个迫切需求

3.1. 编写更简洁的代码

3.1.1. Stream API

3.1.1.1. 由Stream库来选择底层最佳执行机制

3.1.1.2. 避免用synchronized编写代码

3.1.2. 向方法传递代码的技巧

3.1.3. 接口的默认方法

3.2. 更方便地利用处理器的多核

4. 流处理

4.1. 流是一系列数据项,一次只生成一项

4.2. 程序可以从输入流中一个一个读取数据项,然后以同样的方式将数据项写入输出流

5. 函数式编程范式的基石

5.1. 没有共享的可变数据

5.1.1. 一个方法可以通过它将参数值转换为结果的方式来完整描述

5.1.2. 就像一个数学函数,没有可见的副作用

5.1.3. 所写的代码不能访问共享的可变数据来完成它的工作

5.1.4. “纯函数”“无副作用函数”或“无状态函数”

5.2. 将方法和函数(即代码)传递给其他方法的能力

5.2.1. 用行为参数化把代码传递给方法

6. 命令式编程范式

6.1. 写的程序则是一系列改变状态的指令

7. 默认方法

7.1. 默认方法只是推进程序演进的一种技术,并不会直接帮助你实现某个特性

7.2. 接口可以包含实现类没有提供实现的方法签名了

7.3. 给接口设计者提供了一种扩充接口的方式,而不会破坏现有的代码

7.4. 使用default关键字来表示

8. 方法和Lambda作为一等值

8.1. 方法引用

8.2. Lambda

8.2.1. 匿名函数

8.2.2. 长度多于几行的话,还是应该用方法引用来指向一个有描述性名称的方法,而不是使用匿名的Lambda

8.3. 以代码的清晰度为准绳

9. 谓词(predicate)

9.1. 在数学上常常用来代表类似于函数的东西,它接受一个参数值,并返回true或false

9.2. Function‹T,Boolean›

9.3. Predicate‹T›

9.3.1. 更标准的方式

9.3.2. 效率更高

9.3.3. 避免了把boolean封装在Boolean里面

10. 外部迭代

10.1. for-each循环一个个地迭代元素

10.2.

11. 内部迭代

11.1. 数据处理完全是在库内部进行的

11.2.

12. Optional‹T›类

12.1. 通过显式使用更多的描述性数据类型来避免null

12.2. 如果能一致地使用它,就能帮助避免出现Null-PointerException

12.3. 一个容器对象,它既可以包含值,也可以不包含值

12.4. 通过类型系统,允许表明一个变量可能缺失值

13. (结构化的)模式匹配

13.1. 使用模式匹配比if-then-else更简明

13.1.1. 编译器能够检测常见的错误

13.2. 采用多态和方法重写替代if-then-else来处理这种类型的数据

14. 演变

14.1. 使用for-each循环,而不用暴露Iterator里面的模板写法

14.2. 经典面向对象思想,而向函数式编程领域转变

14.2.1. Collection主要是为了存储和访问数据,Stream则主要用于描述对数据的计算

14.3. Java 9提供了模块系统

14.3.1. 模块对简单的类JAR组件进行了增强,使其具备了结构,既能作为用户文档,也能由机器进行检查

14.4. 菱形继承问题

有关读Java实战(第二版)笔记01_Java的变化的更多相关文章

  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. 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

  3. 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)我

  4. ruby-on-rails - 启用 Rack::Deflater 时 ETag 发生变化 - 2

    在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案

  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

随机推荐