Java 8 (2014年发布)
Java 8 是一个里程碑版本,带来了许多重大特性:
1. Lambda 表达式
简化了匿名内部类的写法,支持函数式编程。
语法:
(参数) -> { 方法体 }
示例:
List<String> list = Arrays.asList("A", "B", "C");
list.forEach(s -> System.out.println(s));
2. 函数式接口 (Functional Interface)
使用 @FunctionalInterface
注解标识一个只有一个抽象方法的接口。
3. Stream API
用于集合的处理,提供了函数式编程风格的操作。
示例:
List<String> list = Arrays.asList("A", "B", "C");
list.stream()
.filter(s -> s.startsWith("A"))
.forEach(System.out::println);
4. 默认方法 (Default Methods)
接口中可以有带实现的默认方法。
示例:
interface MyInterface {
default void sayHello() {
System.out.println("Hello, World!");
}
}
5. Optional 类
用于避免 NullPointerException
。
示例:
Optional<String> optional = Optional.ofNullable(null);
optional.ifPresent(System.out::println);
6. 新的日期时间 API
引入 java.time
包,替代旧的 Date
和 Calendar
类。
示例:
LocalDate today = LocalDate.now();
System.out.println(today);
Java 9 (2017年发布)
1. 模块化系统 (Project Jigsaw)
引入模块系统,将 JDK 分为多个模块,提高了性能和安全性。
模块声明:
module my.module {
requires java.base;
exports com.example.myapp;
}
2. JShell (交互式 REPL)
提供了一个命令行工具,可以直接运行 Java 代码。
示例:
jshell> System.out.println("Hello, Java 9!");
Hello, Java 9!
3. 增强的 Stream
API
增加了 takeWhile
和 dropWhile
等新方法。
示例:
List<Integer> list = List.of(1, 2, 3, 4, 5);
list.stream()
.takeWhile(n -> n < 4)
.forEach(System.out::println);
4. 私有接口方法
接口中可以定义私有方法,用于代码复用。
示例:
public interface MyInterface {
default void sayHello() {
say("Hello");
}
private void say(String message) {
System.out.println(message);
}
}
Java 10 (2018年发布)
1. 局部变量类型推断 (var)
使用 var
声明局部变量,自动推断类型。
示例:
var list = new ArrayList<String>();
list.add("Hello");
System.out.println(list);
2. 垃圾回收器优化
引入 G1 垃圾回收器改进,默认的 GC 为 G1。
Java 11 (2018年发布)
1. 新的字符串方法
增加了 isBlank
、lines
、strip
、repeat
等方法。
示例:
String str = " Hello ";
System.out.println(str.strip()); // 去除首尾空白
System.out.println("a".repeat(3)); // 输出 aaa
2. HTTP Client API
标准化了新的 HTTP 客户端 API。
示例:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Java 12-21 新特性概览
- Switch 表达式 (Java 12, 14):增强
switch
,支持表达式返回值。 - Records (Java 16):简化数据模型类的创建。
- Text Blocks (Java 15):简化多行字符串编写。
- Sealed 类 (Java 17):允许指定哪些类可以继承。
- 虚拟线程 (Java 19):提高高并发应用性能。
- 模式匹配 (Java 16-21):增强类型检查和转换。
总结
Java 从 8 开始引入了许多关键的新特性,如 Lambda 表达式 和 Stream API,大大提升了开发效率。后续版本不断加强模块化、类型推断、以及现代化工具,逐步向高效并发和易用性靠随。
扩展:NIO 技术
Java NIO(New Input/Output)是 Java 1.4 中引入的新 I/O API,用于替代传统的 Java IO,提供了更高效的输入/输出操作。NIO 通过 缓冲区(Buffer) 和 通道(Channel) 的概念,实现了非阻塞 I/O 操作和多路复用。
NIO 核心组件
-
Buffer(缓冲区)
- 用于存储数据,NIO 中的数据读写是通过 Buffer 来完成的。
- 常用的缓冲区类型包括:
ByteBuffer
(字节缓冲区)CharBuffer
(字符缓冲区)IntBuffer
(整数缓冲区)DoubleBuffer
(双精度浮点缓冲区)
- 主要方法:
put()
:向缓冲区中写入数据。get()
:从缓冲区中读取数据。flip()
:将缓冲区从写模式切换到读模式。clear()
:清空缓冲区。
-
Channel(通道)
- Channel 是双向的,既可以进行读操作,也可以进行写操作。
- 常用的通道包括:
FileChannel
:用于文件读写。SocketChannel
:用于 TCP 网络读写。ServerSocketChannel
:用于监听 TCP 连接。DatagramChannel
:用于 UDP 数据传输。
- 通道和缓冲区配合使用,通过
read()
和write()
方法进行数据传输。
-
Selector(选择器)
- Selector 是 NIO 中实现非阻塞 I/O 的核心组件,用于监听多个通道的事件(例如:连接、读、写等)。
- 通过
Selector
可以实现单线程管理多个通道,避免传统 I/O 中多线程的性能开销。 - 常用方法:
select()
:阻塞直到有通道就绪。selectNow()
:非阻塞地获取就绪的通道。selectedKeys()
:获取就绪通道的集合。
NIO 非阻塞特性
- 传统 I/O 是阻塞的,线程在执行读写操作时会被阻塞,直到操作完成。
- NIO 通过
Selector
和Channel
实现非阻塞 I/O,线程可以继续执行其他任务,而不会因 I/O 操作而被阻塞。
NIO 示例代码
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class NIOClient {
public static void main(String[] args) {
try {
// 打开一个 SocketChannel
SocketChannel socketChannel = SocketChannel.open();
// 配置为非阻塞模式
socketChannel.configureBlocking(false);
// 连接到服务器
socketChannel.connect(new InetSocketAddress("localhost", 8080));
while (!socketChannel.finishConnect()) {
System.out.println("正在连接服务器...");
}
// 创建一个缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put("Hello, NIO Server!".getBytes());
buffer.flip();
// 写入数据到通道
socketChannel.write(buffer);
buffer.clear();
socketChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
NIO 的优点
- 非阻塞 I/O:提升系统性能,适合处理高并发场景。
- 更少的线程开销:通过 Selector 管理多个通道,减少线程数量。
- 高效的数据传输:通过缓冲区进行批量数据传输。
适用场景
- 高并发网络服务器,例如:聊天室、HTTP 服务器。
- 文件传输或大数据处理应用。