JavaGuide面试题博文:https://javaguide.cn/。
本文是学习笔记,如果需要面试没有时间阅读原博文,可以快速浏览笔记。
推荐深度阅读对应书籍或者知识点原文,避免碎片化学习。
为了解决接口的修改与现有的实现不兼容的问题,新interface
的方法可以用default
或static
修饰。
函数式接口
,也称SAM
接口,SingleAbstractMethodinterfaces
,有且只有一个抽象方法,但可以有多个非抽象方法的接口。
java.util.function
该包下的所有接口都有@FunctionalInterface
注解,提供函数式编程。
Lambda
表达式是一个匿名函数,java8
允许把函数作为参数传递进方法中。方法的参数是函数式接口都可以用Lambda
表达式(parameters) ->{ statements; }
。
Java8
允许使用::
关键字来传递方法或者构造函数引用,无论如何,表达式返回的类型必须是functional-interface
。
lambda
表达式可以引用外边变量,但是该变量默认拥有final
属性,不能被修改,如果修改,编译时就报错。
新增了java.util.stream
,不存储数据,可以检索和逻辑处理集合数据、包括筛选、排序、统计、计数等,类Sql
语句,它的方法参数都是函数式接口类型,所以一般和 Lambda
配合使用。
stream
串行流,parallelStream
并行流,可多线程执行。
使用Optional
解决NPE
问题。
新增java.time.LocalDateTime
,LocalDate
,LocalTime
日期计算,获取指定日期,时区操作。
默认垃圾回收器是ParallelScavenge+ParallelOld
。
新增在JShell
中可以直接输入表达式并查看其执行结果。
引入了模块系统,JDK
被重新组织成94
个模块,通过jlink
创建出只包含所依赖的JDK
模块的自定义运行时镜像。
G1
(Garbage-First Garbage Collector
)成为了默认垃圾回收器。
增加了List.of()
、Set.of()
、Map.of()
和 Map.ofEntries()
等工厂方法来创建不可变集合。
使用of()
创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报java.lang.UnsupportedOperationException
异常。
String
的实现从char[]
改用byte[]
数组存储字符串。
Java9
允许在接口中使用私有方法private
。
在try-with-resources
语句中可以使用effectively-final
变量,没有被final
修饰但是值在初始化后从未更改的变量。
Stream
中增加了新的方法ofNullable()
、dropWhile()
、takeWhile()
以及iterate()
方法的重载方法。
增加了java.lang.ProcessHandle
接口来实现对原生进程进行管理,尤其适合于管理长时间运行的进程。
java.util.concurrent.Flow
类中新增了反应式流规范的核心接口,包含了Flow.Publisher
、Flow.Subscriber
、Flow.Subscription
和Flow.Processor
等4
个核心接口。
Java9
还提供了SubmissionPublisher
作为Flow.Publisher
的一个实现。
变量句柄java.lang.invoke.VarHandle
来表示,替代了java.util.concurrent.atomic
和sun.misc.Unsafe
的部分操作。提供了一系列标准的内存屏障操作,用于更加细粒度的控制内存排序。
局部变量类型推断(var)
,只能用于带有构造器的局部变量和for
循环中。
通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。
Java9
的G1
的FullGC
依然是使用单线程去完成标记清除算法,改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量。
List
,Set
,Map
提供了静态方法copyOf()
返回入参集合的一个不可变拷贝。
Optional
新增了orElseThrow()
方法来在没有值时抛出指定的异常。
HotSpot
附带两个用C++
实现的JITcompiler
:C1
及C2
,新增基于Java
语言编写的JIT
编译器Graal
。
Http Client
几乎被完全重写,并且现在完全支持异步非阻塞。
String
增强。isBlank
,strip
,repeat
。
新增isEmpty()
方法来判断指定的Optional
对象是否为空。
Z Garbage Collector
,是一个可伸缩的、低延迟的垃圾收集器
Lambda
表达式中使用var
进行参数声明。
启动单文件源代码程序,不需要在磁盘上生成.class
文件了。
String
增强,indent()
方法可以实现字符串缩进。transform()
方法可以用来转变指定字符串。
Files
增强,mismatch()
方法用于比较两个文件,并返回第一个不匹配字符的位置,如果文件相同则返回-1L
。
NumberFormat
新增了对复杂的数字进行格式化的支持。
G1
收集器优化,可中止的混合收集集合,及时返回未使用的已分配内存。
增强ZGC
,将向操作系统返回被标识为长时间未使用的页面,这样它们将可以被其他进程重用。
SocketAPI
的底层进行了重写,NioSocketImpl
是对PlainSocketImpl
的直接替代,它使用java.util.concurrent
包下的锁而不是同步方法。
FileSystems
增强,newFileSystem(Path)``newFileSystem(Path, Map
允许在Java
应用程序执行结束时动态进行类归档,提高了应用程序类数据共享(AppCDS
)的可用性。
JVM
参数中添加-XX:+ShowCodeDetailsInExceptionMessages
,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题。
为switch
表达式引入了类似lambda
语法条件匹配成功后的执行块,不需要多写break
,Java13
提供了yield
来在block
中返回值。
CharSequence
接口添加了一个默认方法isEmpty()
来判断字符序列为空,如果是则返回true
。
TreeMap
新引入了下面这些方法:putIfAbsent()
、computeIfAbsent()
、computeIfPresent()
、compute()
、merge()
。
文本块。
隐藏类是为框架(frameworks
)所设计的,隐藏类不能直接被其他类的字节码使用,只能在运行时生成类并通过反射间接使用它们。
向量API
(第一次孵化)
启用C++14
语言特性
ZGC
并发线程堆栈处理
弹性元空间
对基于值的类发出警告
引入了打包工具,命令是jpackage
引入外部内存访问API
以允许Java
程序安全有效地访问Java
堆之外的外部内存。
instanceof
模式匹配
引入record
关键字,record
提供一种紧凑的语法来定义类中的不可变数据。
会默认强封装JDK
的所有内部元素,但关键内部API
(例如 sun.misc.Unsafe
)除外。
Random
、ThreadLocalRandom
和SplittableRandom
来生成随机数各有缺陷,增加RandomGenerator
。
弃用Applet API
以进行删除。
switch
的类型匹配自动转换功能。
删除远程方法调用(RMI
)激活机制,同时保留RMI
的其余部分。RMI
激活机制已过时且不再使用。
弃用安全管理器以进行删除。
将UTF-8
设置为默认字符集
使用jwebserver
命令启动一个简易的静态 Web
服务器。
改进了java.lang.reflect.Method
、Constructor
的实现逻辑,使用方法句柄重新实现反射核心。
全新的SPI
,用于主要名称和地址的解析,以便java.net.InetAddress
可以使用平台之外的第三方解析器。
通过该API
与Java
运行时之外的代码和数据进行互操作。通过高效地调用外部函数和安全地访问外部内存,
该API
使Java
程序能够调用本机库并处理本机数据,而不会像JNI
那样危险和脆弱。
虚拟线程。
结构化并发,一种多线程编程方法,目的是为了通过结构化并发API
来简化多线程编程,并不是为了取代java.util.concurrent
。
作用域值(Scoped Values
)它可以在线程内和线程间共享不可变的数据,优于线程局部变量,尤其是在使用大量虚拟线程时。
字符串模板通用定义,动态构建字符串,通过使用占位符${}
,我们可以将变量的值直接嵌入到字符串中,而不需要手动处理。
字符串模板java
实现String message = STR."Greetings \{name}!"
。
STR
,FMT
,RAW
模板处理器。\{name}
为表达式,运行时,这些表达式将被相应的变量值替换。
Sequenced Collections
具有确定出现顺序的集合。List
和Deque
接口实现了SequencedCollection
接口。
分代ZGC
。
未命名模式和变量使得我们可以使用下划线 _
表示未命名的变量以及模式匹配时不使用的组件,旨在提高代码的可读性和可维护性。
以上是Java语言的核心知识点第七篇总结,希望对大家有所帮助。