Java 25 is Here! Getting Started with the New LTS Release
Java 25 has officially landed! After Java 21 in September 2023, we finally have our next Long-Term Support (LTS) release. While Java 22, 23, and 24 came in between, they weren't LTS versions, which is why most enterprise developers focus on these stable, long-supported releases.
I can tell you that Java 25 isn't just another version—it's packed with features that make Java more beginner-friendly, performance-optimized, and enterprise-ready.
What Makes Java 25 Special?
Java 25 was released on September 16, 2025, and includes 18 JDK Enhancement Proposals (JEPs) that span from beginner-friendly syntax improvements to advanced performance optimizations. Oracle plans to provide long-term support for Java 25 for at least 8 years, making it a reliable choice for production environments.
Top New Features in Java 25
1. Compact Source Files & Instance Main Methods (JEP 512) Final
Remember the intimidating "Hello World" that scared Java beginners?
Before Java 25:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
With Java 25:
void main() {
System.out.println("Hello, World!");
}
That's it! No class declaration, no public static
, no String[] args
. This dramatically simplifies Java for beginners by allowing them to write programs without the traditional boilerplate code.
2. Flexible Constructor Bodies (JEP 513) Final
Previously, super()
HAD to be the first statement in a constructor. Java 25 relaxes this restriction:
class Parent {
Parent(String name) {
System.out.println("Parent: " + name);
}
}
class Child extends Parent {
Child(String name) {
// Now you can add validation BEFORE super()!
if (name == null) {
throw new IllegalArgumentException("Name cannot be null");
}
System.out.println("Validating name: " + name);
super(name); // Can now come after other statements
System.out.println("Child initialized successfully");
}
}
3. Module Import Declarations (JEP 511) Final
Say goodbye to endless import lists! You can now import entire modules with a single line:
import module java.base;
void main() {
// All java.base module classes are now available
List<String> items = List.of("Java", "25", "Rocks");
items.forEach(System.out::println);
}
4. Collections API Enhancements
Working with collections is now more intuitive:
void main() {
List<String> languages = List.of("Java", "Python", "JavaScript", "Go");
// New convenient methods
System.out.println("First: " + languages.getFirst());
System.out.println("Last: " + languages.getLast());
// Reverse the entire list
List<String> reversed = languages.reversed();
System.out.println("Reversed: " + reversed);
}
5. Unnamed Variables with Underscore
For unused variables in exception handling or loops:
void main() {
try {
int number = Integer.parseInt("not-a-number");
} catch (Exception _) { // Using _ for unused exception
System.out.println("Invalid input provided");
// No need to reference the exception object
}
}
6. Key Derivation Function (KDF) API (JEP 504) Final
Java 25 standardizes access to widely used cryptographic primitives for deriving encryption keys from user passwords:
import javax.crypto.KDF;
import javax.crypto.spec.HKDFParameterSpec;
void deriveSecureKey() {
KDF hkdf = KDF.getInstance("HKDF-SHA256");
AlgorithmParameterSpec params = HKDFParameterSpec.ofExtract()
.addIKM("user-password".getBytes())
.addSalt("random-salt".getBytes())
.thenExpand("app-context".getBytes(), 32);
SecretKey derivedKey = hkdf.deriveKey("AES", params);
System.out.println("Secure key derived successfully!");
}
All the dancing around with SecretKeyFactory and PBEKeySpec for PBKDF2 or fussing with HKDFParameterSpec is now a relic of the past. One API to rule them all.
Preview & Incubator Features
Scoped Values (JEP 506) - 5th Preview
Better alternative to ThreadLocal:
private static final ScopedValue<String> USER_CONTEXT = ScopedValue.newInstance();
void handleRequest(String userId) {
ScopedValue.where(USER_CONTEXT, userId)
.run(() -> {
processOrder();
sendNotification();
});
}
void processOrder() {
String currentUser = USER_CONTEXT.get(); // Available in nested calls
System.out.println("Processing order for: " + currentUser);
}
Vector API (JEP 508) - 10th Incubator
The Vector API allows mathematical vector operations to be executed particularly efficiently for AI/ML workloads:
import jdk.incubator.vector.*;
void vectorMath() {
var species = FloatVector.SPECIES_256;
float[] a = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f};
float[] b = {2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f};
float[] result = new float[8];
var va = FloatVector.fromArray(species, a, 0);
var vb = FloatVector.fromArray(species, b, 0);
var vc = va.mul(vb); // Vectorized multiplication
vc.intoArray(result, 0);
}
Installation Guide
Download Java 25
Visit the official site: https://jdk.java.net/25/
macOS Installation
# Download and extract
curl -O https://download.java.net/java/GA/jdk25/...
# Move to system location
sudo mv jdk-25.jdk /Library/Java/JavaVirtualMachines/
# Update environment
echo 'export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-25.jdk/Contents/Home' >> ~/.zshrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
# Verify installation
java --version
Windows Installation
- Download the Windows x64 zip file
- Extract to
C:\Program Files\Java\jdk-25
- Set
JAVA_HOME
environment variable - Add
%JAVA_HOME%\bin
to PATH - Verify:
java --version
Linux Installation
# Download and extract
wget https://download.java.net/java/GA/jdk25/...
tar -xzf openjdk-25_linux-x64_bin.tar.gz
# Move and setup
sudo mv jdk-25 /opt/
export JAVA_HOME=/opt/jdk-25
export PATH=$JAVA_HOME/bin:$PATH
# Make permanent
echo 'export JAVA_HOME=/opt/jdk-25' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
Resources and What's Next
- Official Download: https://jdk.java.net/25/
- JEP Documentation: https://openjdk.org/projects/jdk/25/
- My GitHub Repo with Examples: https://github.com/bsanjuu/Java25
What's Your Take?
Which Java 25 feature are you most excited about? Are you planning to upgrade your projects to Java 25?
Drop your thoughts in the comments below!
follow me here on Dev.to for more Java content!
Top comments (0)