[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/UserXSX/JavaGuide/main/docs/java/new-features/java21.md [Back]  [Original]

---
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 

![](https://oss.javaguide.cn/github/javaguide/java/new-features/jdk8~jdk24.png)

## 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

Web Proxy Viewer  |  New URL  |  Original Page