跳至主要內容
Java 24 新特性抢先看

Java 24 新特性抢先看

计划于2025年3月发布的JDK 24 GA版本目前仅包含一个针对JDK 24的JEP。然而,根据已提交的JEP候选和草案,可以推测出其他可能被纳入JDK 24的JEP。以下是一些关键的JEP及其进展:

JEP 472:准备限制对JNI的使用

该JEP提议限制与JDK 22中引入的外部函数和内存(FFM)API中的受限方法一起使用的JNI。从JDK 23开始,如果FFM用户未启用不安全的本地访问,Java运行时将显示有关使用JNI的警告,未来版本中将抛出异常而非警告。

JEP 404:分代Shenandoah(实验性)


程序猿DD原创大约 2 分钟JavaJava
Java 23 发布,一文了解全部新特性

Java 23 发布,一文了解全部新特性

最近 Oracle 发布了Java 编程语言和虚拟机的最新版本:Java 23。作为 Java 21 之后的第一个非 LTS 版本,最终的JEP 特性共有 12 个。

通过 Project Amber 提供的语言特性

JEP 455:Primitive Types in Patterns, instanceof, and switch(预览版)

通过使语言更加统一且更具表达能力,帮助提高 Java 编程的工作效率。通过消除与开发人员在使用模式匹配、instanceof 和 switch 时遇到的基元类型限制,该  JEP 支持所有模式情景的基元类型模式,有助于增强模式匹配,并扩展 instanceof 和 switch,使其能够与所有基元类型一起使用。


程序猿DD原创大约 4 分钟JavaJava
8个实用的Java Streams API

8个实用的Java Streams API

分享8个开箱即用的API,方便日常处理集合。

1. 快速过滤空值:Stream.ofNullable

该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而可能使我们避免空指针异常。

在下面的示例中,有一个包含 null 的List。此时,我们可以使用Stream.ofNullable方法对其进行过滤。

List<String> names = Arrays.asList("Alice", null, "Bob", null, "Charlie");
List<String> nonNuLLNames = names.stream()
    .flatMap(Stream::ofNullable)
    .collect(Collectors.toList());
System.out.println(nonNuLLNames);

DD编辑部原创大约 3 分钟JavaJava
如何在Java中读取超过内存大小的文件

如何在Java中读取超过内存大小的文件

读取文件内容,然后进行处理,在Java中我们通常利用 Files 类中的方法,将可以文件内容加载到内存,并流顺利地进行处理。但是,在一些场景下,我们需要处理的文件可能比我们机器所拥有的内存要大。此时,我们则需要采用另一种策略:部分读取它,并具有其他结构来仅编译所需的数据。

接下来,我们就来说说这一场景:当遇到大文件,无法一次载入内存时候要如何处理。

模拟场景

假设,当前我们需要开发一个程序来分析来自服务器的日志文件,并生成一份报告,列出前 10 个最常用的应用程序。

每天,都会生成一个新的日志文件,其中包含时间戳、主机信息、持续时间、服务调用等信息,以及可能与我们的特定方案无关的其他数据。


DD编辑部原创大约 5 分钟JavaJava
Java 22 发布,一文了解全部新特性

Java 22 发布,一文了解全部新特性

就在昨晚,Java 22正式发布!该版本提供了 12 项功能增强,其中包括 7 项预览功能和 1 项孵化器功能。它们涵盖了对 Java 语言、API、性能以及 JDK 中包含的工具的改进。

下面就来一起学习一下该版本都更新了哪些新特性!

Unnamed Variables & Patterns - JEP 456

JEP 456 - 未命名变量和模式:当需要但未使用变量声明或嵌套模式时,提高了可读性。两者都由下划线字符表示。

价值


程序猿DD原创大约 10 分钟JavaJava
Java 21 虚拟线程如何限流控制吞吐量

Java 21 虚拟线程如何限流控制吞吐量

虚拟线程(Virtual Threads)是 Java 21 所有新特性中最为吸引人的内容,它可以大大来简化和增强Java应用的并发性。但是,随着这些变化而来的是如何最好地管理此吞吐量的问题。本文,就让我们看一下开发人员在使用虚拟线程时,应该如何管理吞吐量。

在大多数情况下,开发人员不需要自己创建虚拟线程。例如,对于 Web 应用程序,Tomcat 或 Jetty 等底层框架将为每个传入请求自动生成一个虚拟线程。

如果在应用程序内部需要自行调用来提供业务并发能力时,我们可以使用Java 21新特性:虚拟线程(Virtual Threads)中介绍的方法去创建和使用,比如较为常用的就是Executors.newVirtualThreadPerTaskExecutor()


程序猿DD原创大约 2 分钟JavaJavaJava 21虚拟线程
Java 21中关于Locale区域设置的变化

Java 21中关于Locale区域设置的变化

当我们要尝试解决本地化问题时,首先要验证就是JVM使用的区域设置(Locale)是哪个。在Java 21中,弄清楚JVM使用的是哪个区域设置(Locale),这项任务变得更加容易了。

查看当前配置

在Java 21中,我们可以通过使用-X:showSettings来查看localetzdata,开发者可以通过-X:showSettings:locale仅显示Locale信息,如下所示:


程序猿DD原创大约 2 分钟JavaJavaJava 21
Java 21中的两个值得关注的Bug修复

Java 21中的两个值得关注的Bug修复

在Java 21中,除了推出很多新特性之外,一些Bug修复,也需要注意一下。因为这些改变可能在升级的时候,造成影响。

Double.toString()Float.toString()的精度问题修复

比如:对于Double.String(1e23)

  • 在Java 19后,输出内容为:1.0E23
  • 在Java 18中,输出内容为:9.999999999999999E22

程序猿DD原创大约 1 分钟JavaJavaJava 21
Java 21增强对Emoji表情符号的处理了

Java 21增强对Emoji表情符号的处理了

发现一个 Java 21 中有意思的东西!在java.Lang.Character类中增加了用于确定字符是否为 Emoji 表情符号的 API,主要包含下面六个新的静态方法:

public static boolean isEmoji(int codePoint) {
  return CharacterData.of(codePoint).isEmoji(codePoint);
}

public static boolean isEmojiPresentation(int codePoint) {
  return CharacterData.of(codePoint).isEmojiPresentation(codePoint);
}

public static boolean isEmojiModifier(int codePoint) {
  return CharacterData.of(codePoint).isEmojiModifier(codePoint);
}

public static boolean isEmojiModifierBase(int codePoint) {
  return CharacterData.of(codePoint).isEmojiModifierBase(codePoint);
}
  
public static boolean isEmojiComponent(int codePoint) {
  return CharacterData.of(codePoint).isEmojiComponent(codePoint);
}

public static boolean isExtendedPictographic(int codePoint) {
  return CharacterData.of(codePoint).isExtendedPictographic(codePoint);
}

程序猿DD原创大约 2 分钟JavaJavaJava 21
2
3
4
5