---
title: Java 21 ()
description: JDK 21 Sequenced Collections ZGC
category: Java
tag:
- Java
head:
- - meta
- name: keywords
content: Java 21,JDK21,LTS,,Sequenced Collections, ZGC,,switch ,, API
---
JDK 21 2023 9 19
JDK 21 LTS JDK8JDK11JDK17 JDK21
JDK 21 15
- [JEP 430: String Templates](https://openjdk.org/jeps/430)
- [JEP 431: Sequenced Collections](https://openjdk.org/jeps/431)
- [JEP 439: Generational ZGC ZGC](https://openjdk.org/jeps/439)
- [JEP 440: Record Patterns](https://openjdk.org/jeps/440)
- [JEP 441: Pattern Matching for switchswitch ](https://openjdk.org/jeps/441)
- [JEP 442: Foreign Function & Memory API API](https://openjdk.org/jeps/442)
- [JEP 443: Unnamed Patterns and Variables](https://openjdk.org/jeps/443)
- [JEP 444: Virtual Threads](https://openjdk.org/jeps/444)
- [JEP 445: Unnamed Classes and Instance Main Methods main ](https://openjdk.org/jeps/445)
JDK 8 JDK 24

## JEP 430: String Templates
String Templates() JDK 21
String Templates `${}`Java /
String Templates:
```typescript
"Greetings {{ name }}!"; //Angular
`Greetings ${ name }!`; //Typescript
$"Greetings { name }!" //Visual basic
f"Greetings { name }!" //Python
```
Java String Templates
```java
//concatenation
message = "Greetings " + name + "!";
//String.format()
message = String.format("Greetings %s!", name); //concatenation
//MessageFormat
message = new MessageFormat("Greetings {0}!").format(name);
//StringBuilder
message = new StringBuilder().append("Greetings ").append(name).append("!").toString();
```
Java String Templates
```java
String message = STR."Greetings \{name}!";
```
- STR
- `\{name}`
Java
- STR
- FMT STR
- RAW STR FMT `StringTemplate`
```java
String name = "Lokesh";
//STR
String message = STR."Greetings \{name}.";
//FMT
String message = FMT."Greetings %-12s\{name}.";
//RAW
StringTemplate st = RAW."Greetings \{name}.";
String message = STR.process(st);
```
JDK `StringTemplate.Processor` `StringTemplate.Processor` `process`
/
```java
//variable
message = STR."Greetings \{name}!";
//method
message = STR."Greetings \{getName()}!";
//field
message = STR."Greetings \{this.name}!";
```
```java
int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}"; //"10 + 20 = 30"
```
:
```java
String time = STR."The current time is \{
//sample comment - current time in HH:mm:ss
DateTimeFormatter
.ofPattern("HH:mm:ss")
.format(LocalTime.now())
}.";
```
## JEP 431: Sequenced Collections
JDK 21 **Sequenced Collections**encounter order
Sequenced Collections
- [`SequencedCollection`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/SequencedCollection.html)
- [`SequencedSet`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/SequencedSet.html)
- [`SequencedMap`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/SequencedMap.html)
`SequencedCollection` `Collection`
```java
interface SequencedCollection extends Collection {
// New Method
SequencedCollection reversed();
// Promoted methods from Deque
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
```
`List` `Deque` `SequencedCollection`
`ArrayList`
```java
ArrayList arrayList = new ArrayList();
arrayList.add(1); // List contains: [1]
arrayList.addFirst(0); // List contains: [0, 1]
arrayList.addLast(2); // List contains: [0, 1, 2]
Integer firstElement = arrayList.getFirst(); // 0
Integer lastElement = arrayList.getLast(); // 2
List reversed = arrayList.reversed();
System.out.println(reversed); // Prints [2, 1, 0]
```
`SequencedSet` `SequencedCollection` `reversed()`
```java
interface SequencedSet extends SequencedCollection, Set {
SequencedSet reversed();
}
```
`SortedSet` `LinkedHashSet` `SequencedSet`
`LinkedHashSet`
```java
LinkedHashSet linkedHashSet = new LinkedHashSet(List.of(1, 2, 3));
Integer firstElement = linkedHashSet.getFirst(); // 1
Integer lastElement = linkedHashSet.getLast(); // 3
linkedHashSet.addFirst(0); //List contains: [0, 1, 2, 3]
linkedHashSet.addLast(4); //List contains: [0, 1, 2, 3, 4]
System.out.println(linkedHashSet.reversed()); //Prints [4, 3, 2, 1, 0]
```
`SequencedMap` `Map` key `SequencedSet` value `SequencedCollection` entry `SequencedSet`
```java
interface SequencedMap extends Map {
// New Methods
SequencedMap reversed();
SequencedSet sequencedKeySet();
SequencedCollection sequencedValues();
SequencedSet sequencedEntrySet();
V putFirst(K, V);
V putLast(K, V);
// Promoted Methods from NavigableMap
Entry firstEntry();
Entry lastEntry();
Entry pollFirstEntry();
Entry pollLastEntry();
}
```
`SortedMap` `LinkedHashMap` `SequencedMap`
`LinkedHashMap`
```java
LinkedHashMap map = new LinkedHashMap();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
map.firstEntry(); //1=One
map.lastEntry(); //3=Three
System.out.println(map); //{1=One, 2=Two, 3=Three}
Map.Entry first = map.pollFirstEntry(); //1=One
Map.Entry last = map.pollLastEntry(); //3=Three
System.out.println(map); //{2=Two}
map.putFirst(1, "One"); //{1=One, 2=Two}
map.putLast(3, "Three"); //{1=One, 2=Two, 3=Three}
System.out.println(map); //{1=One, 2=Two, 3=Three}
System.out.println(map.reversed()); //{3=Three, 2=Two, 1=One}
```
## JEP 439: Generational ZGC ZGC
JDK21 ZGC GC
```bash
// ZGC
java -XX:+UseZGC -XX:+ZGenerational ...
```
ZGenerational ZGC GC ZGC
> In a future release we intend to make Generational ZGC the default, at which point -XX:-ZGenerational will select non-generational ZGC. In an even later release we intend to remove non-generational ZGC, at which point the ZGenerational option will become obsolete.
>
> Generational ZGC -XX:-ZGenerational ZGC ZGC ZGenerational
ZGC Java
## JEP 440: Record Patterns
Java 19 [JEP 405](https://openjdk.org/jeps/405) JDK 20 [JEP 432](https://openjdk.org/jeps/432) JDK21
[Java 20 ](./java20.md)
## JEP 441: Pattern Matching for switchswitch
Java switch case case
switch
```java
static String formatterPatternSwitch(Object obj) {
return switch (obj) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> obj.toString();
};
}
```
## JEP 442: Foreign Function & Memory API API
Java API Java JVM JVM API Java JNI
API Java 17 [JEP 412](https://openjdk.java.net/jeps/412) Java 18 [JEP 419](https://openjdk.org/jeps/419) Java 19 [JEP 424](https://openjdk.org/jeps/424) JDK 20 [JEP 434](https://openjdk.org/jeps/434) JDK 21 [JEP 442](https://openjdk.org/jeps/442)
[Java 19 ](./java19.md) API
## JEP 443: Unnamed Patterns and Variables
`_`
`try-with-resources` `catch` `for` `_`
```java
try (var _ = ScopedContext.acquire()) {
// No use of acquired resource
}
try { ... }
catch (Exception _) { ... }
catch (Throwable _) { ... }
for (int i = 0, _ = runOnce(); i < arr.length; i++) {
...
}
```
```java
if (r instanceof ColoredPoint(_, Color c)) { ... c ... }
switch (b) {
case Box(RedBall _), Box(BlueBall _) -> processBox(b);
case Box(GreenBall _) -> stopProcessing();
case Box(_) -> pickAnotherBox();
}
```
## JEP 444: Virtual Threads
Java 19 [JEP 425](https://openjdk.org/jeps/425)JDK 20 JDK21
[Java 20 ](./java20.md)
## JEP 445: Unnamed Classes and Instance Main Methods main
`main` Java `main` Java
`main`
```java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
```
`main`
```java
class HelloWorld {
void main() {
System.out.println("Hello, World!");
}
}
```
()
```java
void main() {
System.out.println("Hello, World!");
}
```
##
- Java 21 String Templates
- Java 21 Sequenced Collections