最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java全版本特性與用法示例(含總覽?+?分版本要點(diǎn))

 更新時(shí)間:2026年05月21日 09:19:54   作者:nbsaas-boot  
Java自JDK8開啟現(xiàn)代化演進(jìn)以來,始終遵循半年特性版本+兩年LTS(長(zhǎng)期支持)版本的發(fā)布節(jié)奏,持續(xù)在語言表達(dá)力、并發(fā)性能、開發(fā)體驗(yàn)、安全能力四大維度突破,這篇文章主要介紹了Java全版本特性與用法(含總覽+分版本要點(diǎn))的相關(guān)資料,需要的朋友可以參考下

本文按 正式發(fā)布的 JDK / Java SE 大版本 羅列:自 JDK 1.0(1996) 起,至 Java 26(2026-03,當(dāng)前時(shí)間線內(nèi)已發(fā)布);文末附 類文件主版本號(hào)編譯參數(shù)。具體行為以你使用的 發(fā)行版(OpenJDK/Oracle/…)的 Release Notes 為準(zhǔn)。

命名習(xí)慣: 對(duì)外常稱 Java 8、Java 17;開發(fā)者版本號(hào)可能仍寫 1.8、1.17(9 起模塊系統(tǒng)后較少混用 1.9)。

發(fā)布節(jié)奏(2017 年 9 月起): 大版本約 每 6 個(gè)月 一次;LTS 由 Oracle/OpenJDK 路線約定,常見 LTS 為 8、11、17、21、25(以官方為準(zhǔn))。

每節(jié)“正式特性”示例的約定:該版本號(hào) 起,下列代碼塊展示 默認(rèn)即可編譯、不依賴 --enable-preview 的正式語言或標(biāo)準(zhǔn)庫能力;若該版僅有預(yù)覽/工程類變更,則在該節(jié)單獨(dú)說明,并改用 自較早版本起已穩(wěn)定、且與當(dāng)年發(fā)行說明仍兼容 的庫或 JVM 接口示例(不冒充“新 正式 語法”)。

0. 全版本總覽表

版本常記名類文件主版本約首發(fā)日期備注
JDK 1.0Java 1451996-01首版
JDK 1.1451997-02
J2SE 1.2Java 2461998-12“Java 2” 品牌、集合、Swing…
J2SE 1.3472000-05
J2SE 1.4482002-02assert、NIO、正則…
J2SE 5.0Java 5492004-09泛型、枚舉、注解…
Java SE 6502006-12從此對(duì)外稱 Java SE
Java SE 7512011-07try-with-resources、 diamond…
Java SE 8LTS522014-03Lambda、Stream、java.time
Java SE 9532017-09模塊、JShell…
Java SE 10542018-03var
Java SE 11LTS552018-09標(biāo)準(zhǔn) HttpClient
Java SE 12562019-03
Java SE 13572019-09
Java SE 14582020-03
Java SE 15592020-09
Java SE 16602021-03
Java SE 17LTS612021-09密封類、switch 模式預(yù)覽演進(jìn)
Java SE 18622022-03默認(rèn) UTF-8 等
Java SE 19632022-09虛擬線程預(yù)覽等
Java SE 20642023-03多為預(yù)覽/孵化
Java SE 21LTS652023-09虛擬線程正式、模式匹配等
Java SE 22662024-03FFM API 等
Java SE 23672024-09撤 String Templates 預(yù)覽等
Java SE 24682025-03安全點(diǎn):Security Manager 等
Java SE 25LTS692025-09模塊 import、簡(jiǎn)潔入口等定稿 JEP 見發(fā)行說明
Java SE 26702026-03HTTP/3 客戶端、移除 Applet API 等
Java SE 27計(jì)劃712026-09路線圖,以官方為準(zhǔn)

說明: 表中 Java SE 27尚未 GA 時(shí),本文不虛構(gòu)其「新終態(tài)」語法;在 GA 后應(yīng)以 JEP 與發(fā)行說明 為準(zhǔn)增補(bǔ)對(duì)應(yīng)小節(jié)。其余已 GA 大版本在下方各節(jié)均至少給出一個(gè) 不依賴 --enable-preview 的「正式能力」 例(§21 等以 JEP 為預(yù)覽為主 的版本單獨(dú)說明,并附 JFR/既有 API 等 的正式用例作為替代)。

1. JDK 1.0(1996)

  • 核心語言與 java.lang / java.util 基礎(chǔ)類。
  • AWT 圖形、Applet、基礎(chǔ) I/O網(wǎng)絡(luò)。

示例:典型古老寫法(無泛型、無 main 參數(shù)短路):

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

2. JDK 1.1(1997)

  • 內(nèi)部類、JDBCRMI序列化、JavaBeans。
  • 反射(以自省為主,運(yùn)行期可修改能力在后續(xù)版本加強(qiáng))。
  • AWT 事件模型大改、國(guó)際化與 Unicode。

正式 1.1:內(nèi)部類 + JDBC 最簡(jiǎn)“可連接”形態(tài)(DriverManager 在 1.1 中引入,URL/驅(qū)動(dòng)以你環(huán)境為準(zhǔn)):

// JDBC 1.0 起:用反射加載驅(qū)動(dòng)是常見寫法
// Class.forName("org.example.Driver");
// java.sql.Connection c = java.sql.DriverManager.getConnection("jdbc:...");

正式 1.1:非靜態(tài)內(nèi)部類可訪問外部實(shí)例:

class Outer {
    class Inner { void f() { System.out.println(Outer.this); } }
}

3. J2SE 1.2 / “Java 2”(1998)

  • 集合框架List/Map/Set 等)、strictfp、SwingJava 插件、Java IDL(CORBA)、首版廣泛 JIT(HotSpot 路線起點(diǎn))。

正式 1.2:集合 + Iterator(無泛型版本):

import java.util.*;

List list = new ArrayList();
list.add("a");
for (Iterator it = list.iterator(); it.hasNext(); ) {
    String s = (String) it.next();
}
Map map = new HashMap();
map.put("k", "v");

正式 1.2:Swing 頂層窗口最小骨架:

import javax.swing.JFrame;
import javax.swing.JLabel;
// JFrame f = new JFrame(); f.getContentPane().add(new JLabel("ok")); f.pack(); f.setVisible(true);

4. J2SE 1.3(2000)

  • HotSpot VM 進(jìn)入主線、JNDI 入核心、JavaSound、JPDA、RMI 與 CORBA 互操作加強(qiáng)、動(dòng)態(tài)代理類。

正式 1.3:動(dòng)態(tài)代理 Proxy + InvocationHandler Lambda,用匿名類):

import java.lang.reflect.*;

interface I { int run(); }
class H implements InvocationHandler {
    public Object invoke(Object p, Method m, Object[] a) { return 1; }
}
// I r = (I) Proxy.newProxyInstance(I.class.getClassLoader(), new Class[]{I}, new H);

5. J2SE 1.4(2002,JSR 59)

  • 語言:**assert**。
  • 庫:正則、java.util.logging、NIO(阻塞/選擇器)異常鏈、IPv6JAXP、安全與加密封裝、Image I/O、Web Start、Preferences。

正式 1.4:斷言 assert默認(rèn)關(guān)閉,運(yùn)行 用 java -ea … 開啟):

class A4 {
    void m(int x) {
        assert x >= 0 : "x must be non-negative";
    }
}

6. Java SE 5.0 / 1.5(2004,Tiger)

  • 泛型、注解、枚舉、自動(dòng)裝箱/拆箱變長(zhǎng)參數(shù)、for-each、靜態(tài) import、java.util.concurrent、內(nèi)存模型修訂。
import java.util.*;

enum Day { MON, TUE }
List<String> list = new ArrayList<String>();
for (String s : list) { }
void foo(int... xs) { }

7. Java SE 6 / 1.6(2006)

  • 腳本(JSR 223,內(nèi)置 Rhino)、JAX-WS 2.x、JDBC 4.0、編譯器 API、Pluggable Annotations、SwingJVM/ GC 性能、JAXB 2.0 等。

正式 6:JSR 223 腳本引擎(內(nèi)置 Rhino JavaScript 名依實(shí)現(xiàn)而定,常見為 jsJavaScript):

import javax.script.*;
ScriptEngine eng = new ScriptEngineManager().getEngineByName("js");
if (eng != null) {
    eng.eval("1 + 2");
}

8. Java SE 7 / 1.7(2011)

  • try-with-resources、String 可出現(xiàn)在 switch、diamond new ArrayList<>()Fork/Join、Objects、Path / NIO.2(部分在新 I/O 體系)。
import java.io.InputStream;
import java.nio.file.*;
import java.util.*;
import java.util.concurrent.*;

// try-with-resources + NIO.2
void read(Path path) throws Exception {
    try (InputStream in = Files.newInputStream(path)) { /* 自動(dòng) close */ }
}

正式 7:Stringswitch、diamond、ObjectsPaths

import java.util.Objects;
import java.nio.file.Paths;

String cmd = "go";
switch (cmd) {
    case "go": break;
    default: break;
}
List<String> a = new ArrayList<>();      // diamond
Path p = Paths.get("a", "b", "c.txt");
Objects.requireNonNull(p, "p");

正式 7:Fork/Join 骨架:

// ForkJoinPool.commonPool() 在 1.7 引入
import java.util.concurrent.RecursiveTask;

class Sum extends RecursiveTask<Integer> { /* compute/split 省略 */ }

9. Java SE 8(2014,LTS)

  • LambdaStream、java.time、Optional、接口 default/static、Nashorn(JS 引擎,后于更高版本移除)、重復(fù)注解CompletableFuture 等。

Lambda 與 Stream:

import java.util.*;
import java.util.stream.Collectors;

List<String> names = Arrays.asList("a", "bb", "ccc");
List<String> longOnes = names.stream()
    .filter(s -> s.length() > 1)
    .map(String::toUpperCase)
    .collect(Collectors.toList());

接口默認(rèn)方法:

interface Greeter {
    default void hello() { System.out.println("Hi"); }
}

時(shí)間 API:

import java.time.*;
import java.time.format.DateTimeFormatter;
LocalDate d = LocalDate.now();
ZonedDateTime z = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));

Stream 求和(Java 8 無 List.of,用 Arrays.asList):

import java.util.Arrays;
int sum = Arrays.asList(1, 2, 3).stream().mapToInt(i -> i).sum();

10. Java SE 9(2017)

  • Java 平臺(tái)模塊系統(tǒng)(module-info.java)、JShell、集合工廠 List.of/Set.of/Map.of接口 private 方法、HTTP/2 客戶端(孵化) 等。
module com.example.app {
    requires java.base;
    exports com.example.api;
}
List<String> list = List.of("a", "b");
interface Util {
    private static int add(int a, int b) { return a + b; }
    default int twice(int x) { return add(x, x); }
}

11. Java SE 10(2018)

  • 局部變量類型推斷 var、G1 全并發(fā)的部分改進(jìn)、類數(shù)據(jù)共享應(yīng)用面擴(kuò)展等。
var list = new ArrayList<String>();
for (var s : list) { }

12. Java SE 11(2018,LTS)

  • 標(biāo)準(zhǔn) HttpClientString 增強(qiáng)isBlank/lines/strip)、單文件 java Hello.java 直接運(yùn)行、部分模塊/組件從 JDK 拆出或移除(如 JavaFX/EE 曾捆綁策略變化,以發(fā)行版為準(zhǔn))、ZGC 實(shí)驗(yàn)等。
"  \n".isBlank();
"line1\nline2".lines().forEach(System.out::println);

正式 11:標(biāo)準(zhǔn) java.net.http.HttpClient同步 GET 骨架):

import java.net.URI;
import java.net.http.*;
import java.time.Duration;

HttpClient c = HttpClient.newBuilder()
    .connectTimeout(Duration.ofSeconds(5))
    .build();
HttpRequest r = HttpRequest.newBuilder(URI.create("https://httpbin.org/get"))
    .GET()
    .build();
// HttpResponse<String> res = c.send(r, HttpResponse.BodyHandlers.ofString());
java Hello.java

13. Java SE 12(2019)

  • switch 表達(dá)式(預(yù)覽)Shenandoah(實(shí)驗(yàn))、微基準(zhǔn)套、JVM 常量 API、G1/內(nèi)存返還等 GC/JVM 項(xiàng);String::transform(JEP 344 相關(guān),庫方法)、緊湊數(shù)字格式 等庫增強(qiáng)。

正式 12:java.lang.constant(JEP 334,描述類文件里的常量形態(tài)):

import java.lang.constant.ClassDesc;
import java.lang.constant.MethodTypeDesc;

ClassDesc str = ClassDesc.of("java.lang.String");
MethodTypeDesc mt = MethodTypeDesc.ofDescriptor("()V");
System.out.println(str.displayName() + " / " + mt.descriptorString());

正式 12:緊湊數(shù)字 NumberFormat(JEP 277/庫增強(qiáng),無需 preview):

import java.text.NumberFormat;
import java.util.Locale;

NumberFormat f = NumberFormat.getCompactNumberInstance(
        Locale.CHINA, NumberFormat.Style.SHORT);
System.out.println(f.format(12_000_000)); // 顯示形式依 Locale

(以下 switch 在 12 為預(yù)覽;在 14 中成為正式特性,見 §15。12 中若編譯需 --enable-preview):

// 預(yù)覽:在 12 中需 --enable-preview;演示形態(tài),省略 month/year 等上下文
// int days = switch (m) { case 1,3,5 -> 31; default -> 30; };

14. Java SE 13(2019)

  • 文本塊(預(yù)覽)switch 表達(dá)式(第二輪預(yù)覽)、ZGC 歸還未用內(nèi)存Socket API 重寫、動(dòng)態(tài) CDS 等。

正式 13:本版無新終態(tài) JLS 語法;下列 文本塊 在 13 仍為預(yù)覽"""--enable-preview)。到 15 才成為終態(tài),例見 §16。

正式 13:標(biāo)準(zhǔn)庫用法不變 的 NIO 套接字 + try-with-resources(實(shí)現(xiàn)已換,見 JEP 353,應(yīng)用側(cè)類型名多不變):

// 與 Java 5+ 同形態(tài);JDK 13 中底層實(shí)現(xiàn)為新 Socket 實(shí)現(xiàn)
try (java.net.Socket s = new java.net.Socket()) {
    s.connect(new java.net.InetSocketAddress("openjdk.org", 443), 5_000);
}

預(yù)覽 13:二輪 switch 表達(dá)式;文本塊 預(yù)覽 示例(在 15 前需 preview):

// javac 13: --enable-preview
String html = """
    <html>
      <body>Hi</body>
    </html>
    """;

15. Java SE 14(2020)

  • switch 表達(dá)式(正式,JEP 361)、instanceof 模式匹配(預(yù)覽)、record(預(yù)覽)、文本塊(二輪預(yù)覽)、NPE 更可讀JFR 流式、包裝工具 jpackage(孵化)移除 CMS、ZGC 平臺(tái)擴(kuò)展、外部?jī)?nèi)存 API(孵化) 等。

正式 14:switch 表達(dá)式/語句 終態(tài)(JEP 361, 再標(biāo) preview):

// Java 14+ 默認(rèn)即可編譯
int n = 2;
String s = switch (n) {
    case 1, 2 -> "a or b";
    default -> "other";
};

預(yù)覽 14:模式 instanceof、record、文本塊三者在 14 仍為預(yù)覽/二輪(若寫需當(dāng)版 --enable-preview):

Object obj = "x";
if (obj instanceof String str) { System.out.println(str.length()); } // 預(yù)覽
// record Point(int x, int y) { }  // 預(yù)覽,宜單獨(dú)文件/類
String t = """
    two lines
    ok
    """;  // 二輪 文本 預(yù)覽

16. Java SE 15(2020)

  • 文本塊(正式)密封類(預(yù)覽)、ZGC / Shenandoah 生產(chǎn)可用、instanceof 模式二輪預(yù)覽、record 二輪預(yù)覽、隱藏類、移除 Nashorn 等。

正式 15:文本塊(JEP 378 終態(tài),無需 preview):

String json = """
    {
      "a": 1
    }
    """;
System.out.println(json.stripIndent());

預(yù)覽 15:密封類、記錄類型與模式 instanceof 的進(jìn)一步輪次在定稿上仍看 16/17;下例在 15 中多為 預(yù)覽sealed 需看當(dāng)版 JEP):

// 在 16/17 前通常需按發(fā)行說明啟用 preview
// public abstract sealed class Shape permits Circle, Rect { }

17. Java SE 16(2021)

  • record(正式)、instanceof 模式(正式)、密封類二輪預(yù)覽強(qiáng)封裝 JDK 內(nèi)部(默認(rèn))、Vector API / Panama 孵化、Unix 域套接字打包工具 等。

正式 16:record 與 模式 instanceof 終態(tài)(var 自 10 起):

public class R16 {
    public record User(String name, int age) { }

    public static void main(String[] args) {
        var u = new User("Ann", 20);
        System.out.println(u.name());
        Object o = u;
        if (o instanceof User x) {
            System.out.println(x.age());
        }
    }
}

18. Java SE 17(2021,LTS)

  • 密封類(正式)、強(qiáng)封裝內(nèi)部 API 強(qiáng)化、模式匹配 for switch(預(yù)覽)、新偽隨機(jī)數(shù) API、FFM 孵化、移實(shí)驗(yàn) AOT 等、棄用 Applet 等長(zhǎng)期路線。

正式 17:密封類型(JEP 409)+ 偽隨機(jī)(JEP 356):

sealed interface Shape permits Circle, Rect { }
final class Circle implements Shape { }
final class Rect implements Shape { }
import java.util.random.RandomGenerator;

RandomGenerator g = RandomGenerator.getDefault();
int n = g.nextInt(0, 10);

預(yù)覽 17:對(duì) Object 的模式 switch(至 21 終態(tài));若用 Java 17 編譯 需 javac --enable-preview

// static String pick(Object o) { return switch (o) { case null -> "n"; case String s -> s; default -> o.toString(); }; }

19. Java SE 18(2022)

  • 默認(rèn) UTF-8、簡(jiǎn)易 Web 服務(wù)器、javadoc 代碼片段、反射在 MethodHandle 上重寫switch 模式匹配(二輪預(yù)覽)、終結(jié)機(jī)制 Finalization 棄用 等。

正式 18:默認(rèn)UTF-8 作為 Charset.defaultCharset()(JEP 400,在常見桌面/服務(wù)器 配置 上為 UTF-8;不是byte[] 語義):

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

Charset d = Charset.defaultCharset();
assert StandardCharsets.UTF_8.equals(d)
        || true; // 少數(shù)配置仍可能非 UTF-8,以運(yùn)行環(huán)境為準(zhǔn)
System.out.println(d);

正式 18:JEP 408 jwebserver 提供零代碼只讀根目錄服務(wù)(命令即「示例」;等價(jià)能力也可用 com.sun.net.httpserver 自寫 HttpHandler)。

# 在含 index.html 的目錄執(zhí)行(需 JDK 18+ 且安裝含 jwebserver 的 build)
# jwebserver -p 8080

20. Java SE 19(2022)

  • 虛擬線程(預(yù)覽)、記錄模式(預(yù)覽)、switch 模式(三輪預(yù)覽)、FFM(預(yù)覽)、結(jié)構(gòu)化并發(fā)(孵化)、RISC-V 移植等。

本版 語言/庫 新增 能力多為 預(yù)覽/孵化;下例 為 19 的 預(yù)覽: 記錄模式javac/java--enable-preview), 作為「正式 無 preview」 示例 使用。

// javac 19: --enable-preview --release 19
class Rp19 {
    record Rectangle(int x, int y, int w, int h) { }

    int area(Object o) {
        if (o instanceof Rectangle(int x, int y, int w, int h)) {
            return w * h;
        }
        return 0;
    }
}

正式 19(在 1.0 即存在、 preview 的 標(biāo)準(zhǔn)庫):InetAddress自 18/19 起 對(duì) 點(diǎn)分 IPv4 文本 的解析更嚴(yán)格(JEP 418 行為 側(cè)),API 名 未變

import java.net.InetAddress;

InetAddress a = InetAddress.getByName("192.0.2.1");
System.out.println(a.getHostAddress());

21. Java SE 20(2023)

  • 多為 預(yù)覽/孵化Scoped Values、Record 模式、虛擬線程、FFM、結(jié)構(gòu)化并發(fā)、Vector API 等續(xù)演進(jìn))。

本大版本 JEP 列表僅 預(yù)覽/孵化 為主,無 新的 語言 終態(tài) 語法;正式(標(biāo)準(zhǔn)、非 preview)的 jdk.jfr 自 Java 8/9+ 起 可用。下為 JFR 錄制 骨架(在 20+ 仍普遍可用、無 preview):

import jdk.jfr.FlightRecorder;
import jdk.jfr.Recording;

if (FlightRecorder.isAvailable()) {
    try (Recording r = new Recording()) {
        r.setName("demo");
        r.setToDisk(true);
        r.start();
        Thread.sleep(1);
        r.stop();
    }
}

22. Java SE 21(2023,LTS)

  • 虛擬線程(正式)、switch 模式匹配與記錄模式、有序集合、分代 ZGC、KEM API 等;仍有多項(xiàng) 預(yù)覽String Templates、Scoped Values、結(jié)構(gòu)化并發(fā) 等,后續(xù)版本有增刪).

正式 21:虛擬線程 執(zhí)行器、switch 模式 與 記錄 模式 終態(tài)、SequencedCollection 等:

try (var ex = java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor()) {
    ex.submit(() -> { /* 大量 IO */ });
}
// 模式 switch + 記錄 + 密封:在 21 為 終態(tài)(對(duì) 前序 版 的 預(yù)覽 形態(tài) 的 定稿),默認(rèn) 無需 --enable-preview
public class Pets {
    sealed interface Pet permits Cat, Dog { }
    record Cat(String n) implements Pet { }
    record Dog(String n) implements Pet { }

    static String label(Pet p) {
        return switch (p) {
            case Cat c  -> "cat " + c.n();
            case Dog d  -> "dog " + d.n();
        };
    }
}
import java.util.*;

SequencedCollection<String> sc = new LinkedList<>();
sc.addLast("a");
sc.addFirst("b");
// sc.getFirst();

預(yù)覽 21:String Templates 等 見 后文 各 LTS/版本 的 定稿 說明。極簡(jiǎn) void main()25 起 可 經(jīng) JEP 512 定稿 見 §26。

// void main() { }  // 在 25 前多為 preview;見 JEP 445/512 軌跡

23. Java SE 22(2024)

  • FFM API(正式)、未命名變量/模式多文件源碼啟動(dòng)、Stream Gatherers(預(yù)覽)G1 區(qū)域固定 等;移除 Thread::countStackFrames。

正式 22:Foreign Function & Memory API 終態(tài)(JEP 454,包 java.lang.foreign),Arena 分配 與 按 布局 的 VarHandle 讀 寫 int

import java.lang.foreign.*;
import java.lang.invoke.VarHandle;

ValueLayout.OfInt L = ValueLayout.JAVA_INT;
VarHandle h = L.varHandle();
try (Arena arena = Arena.ofConfined()) {
    MemorySegment seg = arena.allocate(4, 4);
    h.set(seg, 0L, 22);
    System.out.println((int) h.get(seg, 0L));
}

如 你 的 JDK 為 MemorySegment 提供 getInt/setInt 等 簡(jiǎn)寫,可 替 之;以 本 版本 JavaDoc 為準(zhǔn)。

未命名 變量 _ 等 其它 終態(tài)/預(yù)覽 以當(dāng)版 JEP 為準(zhǔn)。Streamgather 在 22 為預(yù)覽正式Stream::gather§25(Java 24)。

24. Java SE 23(2024)

  • 原語類型模式(預(yù)覽)、類文件 API(預(yù)覽二輪)、Markdown 文檔注釋、ZGC 默認(rèn)分代、模塊 import(預(yù)覽) 等;String Templates 預(yù)覽在 23 中撤回 以繼續(xù)設(shè)計(jì)。

正式 23:Markdown 文檔注釋(JEP 467;javadoc 工具在生成 HTML 時(shí)按 Markdown 規(guī)則渲染常見標(biāo)記):

/**
 * # 標(biāo)題示例
 * - 列表 與 **加粗**(具體支持度以本 JDK 的 `javadoc` 幫助為準(zhǔn))
 */
public class ApiDoced23 {
    /** 單句摘要 */
    public void run() { }
}

其余如 ZGC 分代 默認(rèn) 啟用 多為 JVM 行為啟動(dòng) 參數(shù);類文件 API、模塊 import、原語 模式 在 當(dāng)版 的 定稿/預(yù)覽 狀態(tài) 見 發(fā)行 說明 與 各 JEP。

# 對(duì)上一文件生成 文檔 時(shí) 啟用 Markdown(以本機(jī) javadoc 支持為準(zhǔn),例如 23+)
# javadoc -d out ApiDoced23.java

25. Java SE 24(2025)

  • Security Manager 永久禁用、類文件 API(正式)Stream Gatherers(正式)、Scoped Values(預(yù)覽多輪至定稿前)、JNI 使用收緊準(zhǔn)備刪除 Win32 x86 端口、G1/ ZGC / Shenandoah 等 JVM 與 AOT 類加載 等(共數(shù)十 JEP,以 Release Notes 為準(zhǔn))。

正式 24:Stream::gather內(nèi)置 java.util.stream.Gatherers(JEP 485 終態(tài); 再 標(biāo) 預(yù)覽):

import java.util.List;
import java.util.stream.Gatherers;
import java.util.stream.Stream;

// 將元素按 固定 窗長(zhǎng) 分塊
List<List<Integer>> windows = Stream.of(1, 2, 3, 4, 5, 6, 7, 8)
        .gather(Gatherers.windowFixed(3))
        .toList();
System.out.println(windows);

另:類文件 API(JEP 484,包 java.lang.classfile)用于 讀/寫 class 文件 模型;Security Manager 永久 禁用JVM/運(yùn)行 行為,應(yīng)用 側(cè) 多 為 刪 -Djava.security.manager 新 語法 示例。

26. Java SE 25(2025,LTS)

Java 25 是 LTS,在 語言、標(biāo)準(zhǔn)庫、JVM、工具鏈 上有一批 JEP。下表按 定稿 / 仍為預(yù)覽或孵化 區(qū)分;語法類JEP 511 / 512 / 513 為核心(在 23~24 多為 Preview,25 起為正式語言特性)。

26.1 本版 JEP 一覽(與語法/用法的對(duì)應(yīng))

JEP主題在 25 中的狀態(tài)(概要)
511模塊 import:import module M;正式(語言)
512緊湊源文件 + 實(shí)例/簡(jiǎn)化 main + IO正式(語言+庫)
513靈活構(gòu)造器體(super/this 前可寫“前言”語句)正式(語言)
506Scoped Values正式java.util.concurrent 等)
510密鑰派生(KDF)API正式
470PEM 編解碼(密碼對(duì)象)預(yù)覽
502Stable Values預(yù)覽
505Structured Concurrency第 5 預(yù)覽
507模式中的原始類型(instanceof / switch 等)第 3 預(yù)覽
503移除 32 位 x86 端口平臺(tái)(JDK 包不再提供該目標(biāo))
519Compact Object HeadersJVM 默認(rèn)能力(依構(gòu)建而定)
521分代 ShenandoahJVM
508Vector API孵化(持續(xù))
514 / 515AOT 命令行與剖析工具/JVM
509 / 518 / 520JFR 能力擴(kuò)展監(jiān)控

精確定義、邊界條件與 javac/java 開關(guān)以 JDK 25 Release Notes 與各 JEP 為準(zhǔn)。

26.2 新語法一:import module(JEP 511,正式)

作用: 用一條聲明按需導(dǎo)入某模塊export 的包 里,對(duì)當(dāng)前模塊可見的 public 頂層 類型,相當(dāng)于批量「按包 * import」,并能把 傳遞可讀模塊 里再 export 出來、并被你讀到的包一并納入作用域,從而減少 import 列表。

形式:

import module java.base;
import module java.sql;
// import module com.example.mylib;  // 你方模塊需在 module-info 中 requires 對(duì)應(yīng)模塊

示例 A:在普通類中省略大量 import(類路徑 / 無 module-info 也可使用 JDK 具名模塊)

import module java.base;

// 本文件在「未命名模塊」、類路徑上時(shí),仍可使用對(duì) JDK 的 import module
class PrintArgs {
    public static void main(String[] args) {
        var list = new java.util.ArrayList<String>();
        for (var a : args) {
            list.add(a);
        }
        System.out.println(String.join(", ", list));
    }
}
javac --release 25 PrintArgs.java
java PrintArgs a b c

示例 B:與 Swing 等同時(shí)用時(shí)需消歧(List 等業(yè)務(wù)常見名與 AWT 沖突)

import module java.desktop;
import module java.base;
import java.awt.Label;   // 明確要 AWT 的 Label
import java.util.List;  // 明確要 java.util 的 List

// ... 在方法中使用 Label、List

注意:

  • 目標(biāo)寫的是 模塊名(如 java.base),不能import module 去導(dǎo)入「無模塊名」的 類路徑/未命名模塊 中的包;這與 module-info 里「依賴只能寫具名模塊」的模型一致。
  • 若多模塊里出現(xiàn) 簡(jiǎn)單名沖突(例如 List 在 AWT 與 java.util 中),需再用 單類型 import按包 * 消歧;Oracle 文檔建議對(duì) Label、List 等顯式 import java.awt.Label 等(參見 Oracle 文檔 Module Import Declarations)。
  • 緊湊源文件(見 26.3)中,等價(jià)于已自動(dòng) import module java.base(可再寫 import module java.se 等以擴(kuò)大 API 面;java.se 可能需 --add-modules java.se)。

26.3 新語法二:緊湊源文件與main入口(JEP 512,正式)

目標(biāo): 小腳本/教學(xué)場(chǎng)景減少「public class + public static void main」的儀式,且造一套獨(dú)立方言;程序仍是「方法 → 類 → 包 → 模塊」結(jié)構(gòu),只是由編譯器隱式聲明頂層類。

(1)普通類里:實(shí)例或簡(jiǎn)化的可啟動(dòng) main

  • 若存在帶 String[](或 String...) 的 main,啟動(dòng)器優(yōu)先選它并 static 調(diào)用(與傳統(tǒng)一致)。
  • 否則可選 無參 void main() 等「可啟動(dòng) main」;若為 實(shí)例方法,JVM 會(huì)先用無參、非 private 構(gòu)造器創(chuàng)建對(duì)象再調(diào)用實(shí)例 main(無合適構(gòu)造器則報(bào)錯(cuò))。

(2)緊湊源文件(無包裹 class

  • 源文件中只有 import + 頂層的 field/method(等同類體成員),沒有 class 關(guān)鍵字。
  • 編譯器隱式生成一個(gè) final、無名包、僅默認(rèn)無參構(gòu)造、僅繼承 Object 的類;必須含至少一個(gè)可啟動(dòng) main,否則編譯錯(cuò)誤。
  • 隱式類名由實(shí)現(xiàn)生成,源碼中不要依賴該名字;也不能在源碼里 new 這個(gè)隱式類(教學(xué)向取舍)。

(3)java.lang.IO(JDK 25 起)
為入門場(chǎng)景提供行式 I/O,不再在緊湊源里隱式 static import IO.*,應(yīng)寫 IO.println(...) 或自行 import static(JEP 512 說明相對(duì) 24 的調(diào)整)。

示例(緊湊源文件,可直接 java Hello.java 運(yùn)行):

import module java.base;

void main() {
    IO.println("Hello, Java 25");
}

示例(具名類 + 無參實(shí)例入口):

class Hello {
    void main() {
        IO.println("Hi");
    }
}

示例:?jiǎn)?dòng)器會(huì)優(yōu)先選帶 String[]static main;下面會(huì)走傳統(tǒng)入口,不會(huì)走無參 void main()

import module java.base;

class Launcher {
    public static void main(String[] args) {
        IO.println("args=" + java.util.List.of(args));
    }

    void main() {
        IO.println("只有刪除上面的 static main 時(shí)才會(huì)用實(shí)例 main");
    }
}

示例:緊湊源里多個(gè)成員 + 子程序(仍須有一個(gè)可啟動(dòng)的 main

將文件存為 Hello.java 后與 26.2 示例 A 一樣使用 JDK 25+ 的源碼啟動(dòng)或先 javacjava。

import module java.base;

String greet(String name) {
    return "Hello, " + name;
}

void main() {
    IO.println(greet("Java"));
}
java Hello.java
# 或:javac --release 25 Hello.java  &&  java Hello   # 具體可運(yùn)行類名以 javac 輸出為準(zhǔn)

與 26.2 配合:具名源文件頂行使用 import module java.base; 后,多數(shù) java.util、java.io 等可不再逐類 import。

26.4 新語法三:靈活構(gòu)造器體(JEP 513,正式)

原規(guī)則: 構(gòu)造器體要么以 this(...)/super(...) 開頭,要么編譯器在開頭插 super()。

新規(guī)則: 允許在顯式this(...) / super(...) 之前寫一段前言(prologue);在的語句為后記(epilogue)。
前言處于 「早期構(gòu)造期」 語義中:禁止this(含隱式) 訪問未構(gòu)造完成的實(shí)例、禁止隨意調(diào)實(shí)例方法;允許對(duì)本類、且聲明處沒有內(nèi)聯(lián)初始化的 field簡(jiǎn)單賦值,以及不依賴 this 的純計(jì)算,以便在調(diào)用父類構(gòu)造前完成校驗(yàn)/準(zhǔn)備。目的包括:在父類構(gòu)造尚未this 暴露給子類前,把子類字段先置于一致狀態(tài)、避免從父類構(gòu)造回調(diào)看到「半初始化」子類狀態(tài)。

示例 1:前言里做純計(jì)算,再調(diào)用 super

class Base {
    Base(int v) { }
}

class Sub extends Base {
    private final int v;

    Sub(int raw) {
        int x = Math.max(0, raw);
        super(x);
        this.v = x;
    }
}

示例 2:把校驗(yàn)從「擠在 super(…) 實(shí)參里」拆到前言(語義等價(jià)時(shí)更易讀)
(舊寫法常寫作 super(Objects.requireNonNull(s, "msg").length()) 一類。)

import java.util.Objects;

class Base2 {
    Base2(int len) { }
}

class Sub2 extends Base2 {
    Sub2(String s) {
        String t = Objects.requireNonNull(s, "s");
        super(t.length());
    }
}

注意:「早期構(gòu)造期」禁止this 調(diào)實(shí)例方法、讀實(shí)例字段等;允許的語句集合、以及 record 緊湊構(gòu)造等,以 Java 25 的 JLS 為準(zhǔn)

26.5 標(biāo)準(zhǔn)庫定稿:Scoped Values(JEP 506)與 KDF(JEP 510)

Scoped Values — 在子調(diào)用棧上綁定只讀上下文,子線程可繼承(由 API 與 StructuredTaskScope 等配合),與 ThreadLocal 相比更偏向「多線程+結(jié)構(gòu)化任務(wù)」里的明確邊界。

示例(同一進(jìn)程、單線程子調(diào)用鏈,演示 where / get

import java.util.concurrent.ScopedValue;

public class ScopedDemo {
    private static final ScopedValue<String> USER = ScopedValue.newInstance();

    public static void main(String[] args) {
        ScopedValue.where(USER, "alice").run(() -> {
            System.out.println(USER.get());
            m();
        });
    }

    static void m() {
        System.out.println("in m: " + USER.get());
    }
}

KDF(JEP 510)javax.crypto.KDFjavax.crypto.spec.HKDFParameterSpec 等,用標(biāo)準(zhǔn)算法名(如 HKDF-SHA256) 從 IKM、salt、info 派生 SecretKey 或原始字節(jié)。

示例:同一主密鑰不同 info 派生多把獨(dú)立材料(需 JDK 25+)

import javax.crypto.KDF;
import javax.crypto.SecretKey;
import javax.crypto.spec.HKDFParameterSpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Base64;

public class KdfDemo {
    public static void main(String[] args) throws Exception {
        byte[] ikm = new byte[32];
        new SecureRandom().nextBytes(ikm);
        byte[] salt = new byte[16];
        new SecureRandom().nextBytes(salt);

        KDF hkdf = KDF.getInstance("HKDF-SHA256");

        byte[] encInfo = "app|v1|enc".getBytes(StandardCharsets.UTF_8);
        AlgorithmParameterSpec encSpec = HKDFParameterSpec.ofExtract()
                .addIKM(ikm)
                .addSalt(salt)
                .thenExpand(encInfo, 32);
        SecretKey aes = hkdf.deriveKey("AES", encSpec);

        byte[] macInfo = "app|v1|mac".getBytes(StandardCharsets.UTF_8);
        AlgorithmParameterSpec macSpec = HKDFParameterSpec.ofExtract()
                .addIKM(ikm)
                .addSalt(salt)
                .thenExpand(macInfo, 32);
        byte[] macKey = hkdf.deriveData(macSpec);

        System.out.println("AES: " + Base64.getEncoder().encodeToString(aes.getEncoded()));
        System.out.println("MAC: " + Base64.getEncoder().encodeToString(macKey));
    }
}
javac --release 25 KdfDemo.java
java KdfDemo

HKDFParameterSpec 的鏈?zhǔn)?API 與當(dāng)前 JDK 小版本有出入,以 本機(jī) javax.crypto.spec.HKDFParameterSpec 的 JavaDoc 為準(zhǔn)。HKDF 假設(shè) IKM 已有足夠熵;用戶口令 請(qǐng)用 PBKDF2 / Argon2 等專用口令 KDF,勿直接當(dāng) HKDF 的 IKM。

26.6 仍為預(yù)覽的語言/ API(一般需用--enable-preview編譯與運(yùn)行;以發(fā)行說明為準(zhǔn))

以下示例在 JDK 25 下通常使用:

javac --release 25 --enable-preview   YourFile.java
java  --enable-preview   YourFile
# 或源碼直跑:java --enable-preview YourFile.java

1)JEP 502:Stable Values(java.lang.StableValue,預(yù)覽 API) — 惰性、至多初始化一次、之后只讀,適合懶加載單例等。

// javac --release 25 --enable-preview StablePreview.java
// java  --enable-preview StablePreview

import java.lang.StableValue;
import java.util.logging.Logger;

public class StablePreview {
    private static final StableValue<Logger> LOG = StableValue.of();

    private static Logger logger() {
        return LOG.orElseSet(() -> Logger.getLogger(StablePreview.class.getName()));
    }

    public static void main(String[] args) {
        logger().info("ok");
    }
}

2)JEP 507:原始類型與模式匹配(第 3 預(yù)覽,語言預(yù)覽) — 在 switch 等處使用 case int i、case int i when … 等,把原先寫在 default 里再讀一遍選擇器的邏輯收緊到 case 上。

// 保存為 MapStatus.java
// 編譯/運(yùn)行需:javac --release 25 --enable-preview MapStatus.java
//              java  --enable-preview MapStatus
public class MapStatus {
    public static void main(String[] args) {
        System.out.println(mapStatus(99));
    }

    static String mapStatus(int code) {
        return switch (code) {
            case 0 -> "ok";
            case 1 -> "warn";
            case 2 -> "err";
            case int i -> "other: " + i;   // 綁定“其余 int 值”
        };
    }
}

3)JEP 505:結(jié)構(gòu)化并發(fā) — 使用 java.util.concurrent.StructuredTaskScope 等,在子任務(wù)失敗時(shí)整體失敗/關(guān)閉子任務(wù),避免“孤兒”線程。以下演示 ShutdownOnFailurefork / join / get(若編譯器報(bào)預(yù)覽特性,則對(duì) javac / java 同樣加上 --enable-preview)。

// StructConcDemo.java
import java.util.concurrent.StructuredTaskScope;

public class StructConcDemo {
    public static void main(String[] args) throws Exception {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            var a = scope.fork(() -> "x");
            var b = scope.fork(() -> 1);
            scope.join();
            scope.throwIfFailed();
            System.out.println(a.get() + b.get());
        }
    }
}
javac --release 25 StructConcDemo.java
java  StructConcDemo

4)JEP 470:PEM 編解碼、5)JEP 505 的其它形態(tài) 等,包名/工廠方法以 JEP 與 25u JavaDoc 為準(zhǔn),此處不展開貼長(zhǎng)示例。

生產(chǎn)環(huán)境是否啟用需團(tuán)隊(duì)統(tǒng)一;預(yù)覽在定稿時(shí)可能有小改。

26.7 JVM、平臺(tái)與觀測(cè)(與「寫語法」關(guān)系較弱但常一起升級(jí))

  • 移除 32 位 x86 端口(JEP 503):不再提供該目標(biāo)的構(gòu)建;老機(jī)器需換 64 位或留在舊 JDK。
  • Compact Object Headers(JEP 519)分代 Shenandoah(JEP 521):堆內(nèi)對(duì)象頭與低延遲 GC 的演進(jìn),影響內(nèi)存與 STW/吞吐,不直接改 Java 語法。
  • AOT 命令行/剖析(JEP 514/515)、JFR 擴(kuò)展(JEP 509/518/520)、Vector API 繼續(xù)孵化(JEP 508):偏向運(yùn)維、性能與原生向量計(jì)算。

小結(jié): 若只記 Java 25 「新語法三件套」,即 import module、緊湊源/實(shí)例與簡(jiǎn)化 main、靈活構(gòu)造器體;其余多為 庫定稿、預(yù)覽特性與 JVM/工具。與 Java 24 的差異請(qǐng)對(duì)照 你當(dāng)前 javac/java--help extra 與發(fā)行說明。

27. Java SE 26(2026-03)

  • HTTP/3 客戶端(JEP 517)、移除 Applet API(JEP 504)等。細(xì)節(jié)以 OpenJDK 26 與發(fā)行說明為準(zhǔn)。

正式 26:在 java.net.http.HttpClient顯式 首選 HTTP/3(若 對(duì) 端/網(wǎng)絡(luò) 不 支持 則 自動(dòng) 協(xié)商 降 為 HTTP/2 或 1.1,見 JEP 517):

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.time.Duration;

// 需 Java 26+ 且 本 版本 的 HttpClient 暴露 Version.HTTP_3
HttpClient client = HttpClient.newBuilder()
        .version(HttpClient.Version.HTTP_3)
        .connectTimeout(Duration.ofSeconds(10))
        .build();

HttpRequest request = HttpRequest.newBuilder(URI.create("https://openjdk.org/"))
        .GET()
        .build();

// HttpResponse<String> res = client.send(request, HttpResponse.BodyHandlers.ofString());
// System.out.println(res.version());

另:已標(biāo)記 移除的 Applet API 的 使用 在 新 代 JDK 中 應(yīng) 刪除 或 遷移;無 需 在 新 項(xiàng)目 中 給 可運(yùn)行 的 Applet 示例。

Java SE 27(計(jì)劃,未 GA)

  • 不附「新終態(tài)」示例:待正式發(fā)行后,以 JDK、JEP 與 JLS 更新為準(zhǔn)在本文中增補(bǔ)。

28. 工具鏈與release編譯

查看運(yùn)行時(shí):

java -version

按目標(biāo)版本編譯(推薦 release,避免誤用高版本 API):

javac --release 17 -d out src/com/example/App.java

Maven 示例:

<properties>
  <maven.compiler.release>17</maven.compiler.release>
</properties>

29. 速查:能力 → 約最低版本

能力約從
泛型/注解/enum/for-each5
try-with-resources / NIO.2 路徑7
Lambda/Stream/java.time8
模塊/工廠不可變集合9
var10
標(biāo)準(zhǔn) HttpClient / 字符串 strip11
文本塊 / record / 密封15~17
虛擬線程21(正式)
FFM(Panama)定稿22
import module、緊湊源/簡(jiǎn)化 main、靈活構(gòu)造器體25(正式)

更細(xì)的 JEP 編號(hào)、預(yù)覽/定稿 以對(duì)應(yīng)版本的 OpenJDK Release Notes 為準(zhǔn);若寫生產(chǎn)代碼,團(tuán)隊(duì)?wèi)?yīng)固定 LTS 與 --enable-preview 策略。

30. 參考

  • 版本年表與特性摘要:Wikipedia: Java version history(與人名、日期交叉核對(duì))
  • 正式規(guī)范以 JLS、JVMS、各版 JDK Release Notes 為準(zhǔn)。

到此這篇關(guān)于Java全版本特性與用法示例(含總覽+分版本要點(diǎn))的文章就介紹到這了,更多相關(guān)Java全版本特性與用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解JAVA多線程之線程間的通信方式

    深入理解JAVA多線程之線程間的通信方式

    下面小編就為大家?guī)硪黄钊肜斫釰AVA多線程之線程間的通信方式。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • Jetbrains系列產(chǎn)品重置試用思路詳解

    Jetbrains系列產(chǎn)品重置試用思路詳解

    這篇文章主要介紹了Jetbrains系列產(chǎn)品重置試用思路詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • redis客戶端Jedis使用小結(jié)

    redis客戶端Jedis使用小結(jié)

    Jedis是Redis的一款Java語言的開源客戶端連接工具,本文主要介紹了redis客戶端Jedis使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解

    SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解

    在Java微服務(wù)越來越火的今天。幾乎什么公司都在搞微服務(wù)。而使用的比較多的就是Spring?Cloud技術(shù)棧。今天就來研究一下Spring?Cloud中服務(wù)發(fā)現(xiàn)與調(diào)用的基本原理
    2022-07-07
  • Java中的復(fù)合數(shù)據(jù)類型

    Java中的復(fù)合數(shù)據(jù)類型

    這篇文章主要介紹了Java中的復(fù)合數(shù)據(jù)類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest

    SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest

    在使用框架日常開發(fā)中需要在controller中進(jìn)行一些異步操作減少請(qǐng)求時(shí)間,但是發(fā)現(xiàn)在使用@Anysc注解后會(huì)出現(xiàn)Request對(duì)象無法獲取的情況,本文就此情況給出完整的解決方案
    2022-04-04
  • servlet之session簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    servlet之session簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了servlet之session簡(jiǎn)介,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java線程創(chuàng)建與Thread類的使用方法

    Java線程創(chuàng)建與Thread類的使用方法

    這篇文章主要介紹了Java線程創(chuàng)建與Thread類的使用方法,圍繞java多線程中Thread類的使用以及有關(guān)線程對(duì)象創(chuàng)建和常用方法的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的下伙伴可以參考一下
    2022-06-06
  • 徹底卸載、更換jdk全過程

    徹底卸載、更換jdk全過程

    本文介紹了卸載舊版JDK并安裝新版JDK的詳細(xì)步驟,包括卸載JDK、刪除注冊(cè)表中的JavaSoft文件夾、刪除環(huán)境變量、刪除exe文件以及安裝新版JDK
    2026-02-02
  • springboot 高版本后繼續(xù)使用log4j的完美解決方法

    springboot 高版本后繼續(xù)使用log4j的完美解決方法

    這篇文章主要介紹了 springboot 高版本后繼續(xù)使用log4j的解決方法,需要的朋友可以參考下
    2017-12-12

最新評(píng)論

汝阳县| 佛学| 大厂| 凤台县| 安庆市| 博湖县| 桐柏县| 繁峙县| 龙泉市| 浦东新区| 平乡县| 轮台县| 龙井市| 安仁县| 江口县| 凤翔县| 崇仁县| 琼中| 田林县| 洞口县| 北票市| 江达县| 措美县| 郴州市| 古浪县| 宁德市| 大关县| 房产| 西安市| 巨鹿县| 高密市| 攀枝花市| 集安市| 深泽县| 城固县| 威远县| 西乌| 安仁县| 马尔康县| 老河口市| 库尔勒市|