{"id":446,"date":"2023-03-20T09:31:46","date_gmt":"2023-03-20T01:31:46","guid":{"rendered":"https:\/\/fugary.com\/?p=446"},"modified":"2023-04-15T12:59:36","modified_gmt":"2023-04-15T04:59:36","slug":"%e7%94%a8chatgpt%e6%95%b4%e7%90%86%e7%9a%84jdk%e5%8e%86%e5%b9%b4%e6%9b%b4%e6%96%b0%e5%86%85%e5%ae%b9","status":"publish","type":"post","link":"https:\/\/fugary.com\/?p=446","title":{"rendered":"\u7528ChatGPT\u6574\u7406\u7684JDK\u5386\u5e74\u66f4\u65b0\u5185\u5bb9"},"content":{"rendered":"<p><code>ChatGPT<\/code>\u6700\u8fd1\u633a\u706b\uff0c\u6bd4\u8f83\u6709\u610f\u601d\u7684\u662f\u76f8\u540c\u7684\u95ee\u9898\uff0c\u6bcf\u6b21\u5f97\u5230\u7684\u7b54\u6848\u51e0\u4e4e\u90fd\u4e0d\u4e00\u6837\uff0c\u603b\u4f1a\u6709\u4e9b\u533a\u522b\uff0c\u800c\u4e14<code>ChatGPT<\/code>\u53ea\u7ba1\u7b54\u95ee\u9898\uff0c\u4e0d\u7ba1\u5bf9\u4e0d\u5bf9\uff0c\u5b9e\u9645\u4e0a\u6709\u4e9b\u95ee\u9898\u662f\u9519\u8bef\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u65f6\u5019\u524d\u540e\u77db\u76fe\u3002<\/p>\n<p>\u4e0b\u9762\u7528<code>ChatGPT<\/code>\u6574\u7406\u7684<code>JDK<\/code>\u5347\u7ea7\u5185\u5bb9\uff0c\u53ef\u4f9b\u53c2\u8003\uff0c\u56e0\u4e3a\u76ee\u524d\u7248\u672c\u662f<code>GPT3.5<\/code>\uff0c\u5185\u5bb9\u53ea\u6709<code>2021<\/code>\u5e74<code>9<\/code>\u6708\u7684\u6570\u636e\uff0c\u6700\u65b0\u7684<code>JDK18<\/code>\u548c<code>JDK19<\/code>\u6682\u65e0\u6570\u636e\u3002<\/p>\n<h4>JDK 1.0 \uff081996\u5e741\u670823\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u9996\u6b21\u53d1\u5e03 JDK\u3002<\/li>\n<li>\u5305\u62ec Java \u7f16\u8bd1\u5668\u3001Java \u865a\u62df\u673a\u3001Java \u7c7b\u5e93\u7b49\u5de5\u5177\u3002<\/li>\n<\/ul>\n<p>JDK 1.0\u4e8e1996\u5e74\u53d1\u5e03\uff0c\u662fJava\u5e73\u53f0\u7684\u7b2c\u4e00\u4e2a\u6b63\u5f0f\u7248\u672c\u3002\u76f8\u5bf9\u4e8e\u540e\u7eed\u7684\u7248\u672c\uff0cJDK 1.0\u7684\u7279\u6027\u8f83\u4e3a\u7b80\u5355\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<ol>\n<li>Java\u7f16\u7a0b\u8bed\u8a00\uff1aJDK 1.0\u5305\u62ec\u4e86Java\u7f16\u7a0b\u8bed\u8a00\u7684\u6700\u521d\u7248\u672c\uff0c\u8fd9\u4e2a\u7248\u672c\u652f\u6301\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u548c\u5783\u573e\u56de\u6536\u673a\u5236\uff0c\u4e3a\u540e\u7eedJava\u7248\u672c\u5960\u5b9a\u4e86\u57fa\u7840\u3002<\/li>\n<li>Java\u6807\u51c6\u5e93\uff1aJDK 1.0\u5305\u62ec\u4e86Java\u6807\u51c6\u5e93\u7684\u6700\u521d\u7248\u672c\uff0c\u8fd9\u4e2a\u7248\u672c\u5305\u62ec\u4e86\u4e00\u4e9b\u57fa\u672c\u7684\u7c7b\u548c\u63a5\u53e3\uff0c\u5982java.lang\u3001java.util\u3001java.io\u7b49\u3002<\/li>\n<li>AWT\uff08\u62bd\u8c61\u7a97\u53e3\u5de5\u5177\u5305\uff09\uff1aJDK 1.0\u5f15\u5165\u4e86AWT\uff0c\u8fd9\u662f\u4e00\u4e2a\u56fe\u5f62\u7528\u6237\u754c\u9762\uff08GUI\uff09\u5de5\u5177\u5305\uff0c\u5b83\u63d0\u4f9b\u4e86\u4e00\u4e9b\u57fa\u672c\u7684GUI\u7ec4\u4ef6\uff0c\u5982\u7a97\u53e3\u3001\u6309\u94ae\u3001\u6587\u672c\u6846\u7b49\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">import java.awt.*;\nimport java.awt.event.*;\n\npublic class MyFrame extends Frame {\n    private Button button;\n    private Label label;\n\n    public MyFrame() {\n        setTitle(&quot;My Frame&quot;);\n        setSize(300, 200);\n\n        button = new Button(&quot;Click me&quot;);\n        label = new Label(&quot;Hello&quot;);\n\n        button.addActionListener(new ActionListener() {\n            public void actionPerformed(ActionEvent e) {\n                label.setText(&quot;Clicked&quot;);\n            }\n        });\n\n        setLayout(new FlowLayout());\n        add(button);\n        add(label);\n    }\n}<\/code><\/pre>\n<p>\u8fd9\u4e2a\u793a\u4f8b\u6f14\u793a\u4e86\u5982\u4f55\u521b\u5efa\u4e00\u4e2a\u57fa\u672c\u7684GUI\u5e94\u7528\u7a0b\u5e8f\uff0c\u5b83\u5305\u62ec\u4e00\u4e2a\u7a97\u53e3\u3001\u4e00\u4e2a\u6309\u94ae\u548c\u4e00\u4e2a\u6807\u7b7e\u3002\u5f53\u7528\u6237\u70b9\u51fb\u6309\u94ae\u65f6\uff0c\u6807\u7b7e\u4e0a\u7684\u6587\u672c\u4f1a\u53d1\u751f\u53d8\u5316\u3002<\/p>\n<p>JDK 1.0\u7684\u7279\u6027\u8f83\u4e3a\u7b80\u5355\uff0c\u4f46\u5b83\u5960\u5b9a\u4e86Java\u5e73\u53f0\u7684\u57fa\u7840\uff0c\u4e3a\u540e\u7eed\u7248\u672c\u7684\u53d1\u5c55\u6253\u4e0b\u4e86\u575a\u5b9e\u7684\u57fa\u7840\u3002<\/p>\n<h4>JDK 1.1\uff081997\u5e742\u670819\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u652f\u6301\u5185\u90e8\u7c7b\u548c JavaBeans\u3002<\/li>\n<li>\u5f15\u5165\u4e86AWT\u4e8b\u4ef6\u4f53\u7cfb\u3002<\/li>\n<li>\u6dfb\u52a0\u4e86JAR (Java Archive) \u6587\u4ef6\u683c\u5f0f\uff0c\u7528\u4e8e\u5c06\u591a\u4e2a Java \u7c7b\u6587\u4ef6\u7ec4\u5408\u6210\u4e00\u4e2a\u6587\u4ef6\u3002<\/li>\n<li>\u589e\u52a0\u4e86JDBC (Java Database Connectivity) \u6570\u636e\u5e93\u8bbf\u95eeAPI\u3002<\/li>\n<li>\u5f15\u5165\u4e86Java IDL (Interface Definition Language) API\uff0c\u5141\u8bb8 Java \u5e94\u7528\u7a0b\u5e8f\u901a\u8fc7 CORBA (Common Object Request Broker Architecture) \u4e0e\u5176\u4ed6\u8bed\u8a00\u7684\u5e94\u7528\u7a0b\u5e8f\u8fdb\u884c\u901a\u4fe1\u3002<\/li>\n<\/ul>\n<h4>JDK 1.2\uff081998\u5e7412\u67088\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u589e\u52a0\u4e86Java 2 Platform\uff0cStandard Edition (J2SE)\u3002<\/li>\n<li>\u589e\u52a0\u4e86Swing GUI (Graphical User Interface) \u5de5\u5177\u5305\uff0c\u7528\u4e8e\u521b\u5efa\u8de8\u5e73\u53f0\u7684\u7528\u6237\u754c\u9762\u3002<\/li>\n<li>\u589e\u52a0\u4e86Java Naming and Directory Interface (JNDI) API\uff0c\u7528\u4e8e\u5728\u5206\u5e03\u5f0f\u7cfb\u7edf\u4e2d\u67e5\u627e\u548c\u8bbf\u95ee\u547d\u540d\u548c\u76ee\u5f55\u670d\u52a1\u3002<\/li>\n<li>\u589e\u52a0\u4e86Java Security API\uff0c\u7528\u4e8e\u5728 Java \u5e94\u7528\u7a0b\u5e8f\u4e2d\u5b9e\u73b0\u5b89\u5168\u6027\u548c\u52a0\u5bc6\u3002<\/li>\n<li>\u589e\u52a0\u4e86Java Plug-in \u6280\u672f\uff0c\u4f7f\u5f97 Java \u5e94\u7528\u7a0b\u5e8f\u80fd\u591f\u5728 Web \u6d4f\u89c8\u5668\u4e2d\u8fd0\u884c\u3002<\/li>\n<\/ul>\n<h4>JDK 1.3\uff082000\u5e745\u67088\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u589e\u52a0\u4e86Java Sound API\uff0c\u7528\u4e8e\u5728 Java \u5e94\u7528\u7a0b\u5e8f\u4e2d\u5b9e\u73b0\u97f3\u9891\u529f\u80fd\u3002<\/li>\n<li>\u5f15\u5165\u4e86Java Platform Debugger Architecture (JPDA) API\uff0c\u7528\u4e8e\u5f00\u53d1\u548c\u8c03\u8bd5 Java \u5e94\u7528\u7a0b\u5e8f\u3002<\/li>\n<li>\u652f\u6301Java Web Start\uff0c\u7528\u4e8e\u5728 Web \u4e0a\u542f\u52a8\u548c\u7ba1\u7406 Java \u5e94\u7528\u7a0b\u5e8f\u3002<\/li>\n<li>\u652f\u6301JavaServer Pages (JSP) \u6280\u672f\uff0c\u7528\u4e8e\u5728 Web \u5e94\u7528\u7a0b\u5e8f\u4e2d\u521b\u5efa\u52a8\u6001 Web \u9875\u9762\u3002<\/li>\n<\/ul>\n<h4>JDK 1.4\uff082002\u5e742\u670813\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u589e\u52a0\u4e86Java XML API\uff0c\u7528\u4e8e\u5904\u7406 XML \u6570\u636e\u3002<\/li>\n<li>\u5f15\u5165\u4e86Java Web Services API\uff0c\u7528\u4e8e\u5b9e\u73b0 Web \u670d\u52a1\u3002<\/li>\n<li>\u589e\u52a0\u4e86Java NIO (New I\/O) API\uff0c\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b0\u7684 I\/O \u5904\u7406\u65b9\u5f0f\u3002<\/li>\n<li>\u5f15\u5165\u4e86Java Assertions\uff0c\u7528\u4e8e\u68c0\u67e5 Java \u7a0b\u5e8f\u7684\u9519\u8bef\u3002<\/li>\n<li>\u5f15\u5165\u4e86Java Web Start\uff0c\u4f7f\u5f97 Java \u5e94\u7528\u7a0b\u5e8f\u53ef\u4ee5\u81ea\u52a8\u4e0b\u8f7d\u548c\u66f4\u65b0\u3002<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u662f JDK 4 \u4e2d\u7684\u4e00\u4e9b\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>\u589e\u5f3a\u7684\u5f02\u5e38\u5904\u7406\u673a\u5236\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">try {\n    \/\/ some code that may throw an exception\n} catch (SomeException e) {\n    \/\/ handle the exception\n} catch (AnotherException e) {\n    \/\/ handle another exception\n} finally {\n    \/\/ always executed\n}<\/code><\/pre>\n<ol start=\"2\">\n<li>\u53ef\u6269\u5c55\u7684\u6ce8\u91ca\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">\/**\n * This is a Javadoc comment.\n *\n * @param foo the foo parameter\n * @return the result\n * @throws SomeException if something goes wrong\n *\/\npublic int myMethod(int foo) throws SomeException {\n    \/\/ some code\n}<\/code><\/pre>\n<ol start=\"3\">\n<li>XML \u5904\u7406 API\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\nDocumentBuilder builder = factory.newDocumentBuilder();\nDocument document = builder.parse(new File(&quot;myfile.xml&quot;));\nElement root = document.getDocumentElement();\nNodeList nodes = root.getElementsByTagName(&quot;element&quot;);\nfor (int i = 0; i &lt; nodes.getLength(); i++) {\n    Element element = (Element) nodes.item(i);\n    String text = element.getTextContent();\n    \/\/ process text\n}<\/code><\/pre>\n<ol start=\"4\">\n<li>NIO\uff08New Input\/Output\uff09\u5e93\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">Path path = Paths.get(&quot;myfile.txt&quot;);\nCharset charset = StandardCharsets.UTF_8;\nString content = new String(Files.readAllBytes(path), charset);\n\/\/ process content<\/code><\/pre>\n<ol start=\"5\">\n<li>\u6539\u8fdb\u7684 JAR \u6587\u4ef6\u683c\u5f0f\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-shell\">jar cfm myapp.jar Manifest.txt *.class\njava -jar myapp.jar<\/code><\/pre>\n<ol start=\"6\">\n<li>\u6539\u8fdb\u7684 GUI \u5de5\u5177\u5305\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">JFrame frame = new JFrame(&quot;My Frame&quot;);\nframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\nframe.setSize(400, 300);\nJLabel label = new JLabel(&quot;Hello, world!&quot;);\nframe.getContentPane().add(label);\nframe.setVisible(true);<\/code><\/pre>\n<h4>JDK 1.5\uff082004\u5e749\u670830\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u5f15\u5165\u4e86Java \u8bed\u8a00\u7684\u6cdb\u578b\u652f\u6301\u3002<\/li>\n<li>\u589e\u52a0\u4e86Java \u5e76\u53d1 API\uff0c\u7528\u4e8e\u5b9e\u73b0\u591a\u7ebf\u7a0b\u548c\u5e76\u53d1\u7f16\u7a0b\u3002<\/li>\n<li>\u5f15\u5165\u4e86Java \u865a\u62df\u673a\u7684 JMX (Java Management Extensions) \u6280\u672f\uff0c\u7528\u4e8e\u7ba1\u7406\u548c\u76d1\u63a7 Java \u5e94\u7528\u7a0b\u5e8f\u3002<\/li>\n<li>\u589e\u52a0\u4e86\u81ea\u52a8\u88c5\u7bb1\/\u62c6\u7bb1\uff0c\u5141\u8bb8\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5176\u5bf9\u5e94\u7684\u5305\u88c5\u7c7b\u578b\u8fdb\u884c\u4e92\u76f8\u8f6c\u6362\u3002<\/li>\n<li>\u5f15\u5165\u4e86\u679a\u4e3e\u7c7b\u578b\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5b9a\u4e49\u4e00\u4e2a\u56fa\u5b9a\u7684\u679a\u4e3e\u96c6\u5408\u3002<\/li>\n<li>\u589e\u52a0\u4e86\u53ef\u53d8\u53c2\u6570\u65b9\u6cd5\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5b9a\u4e49\u53ef\u53d8\u6570\u91cf\u7684\u53c2\u6570\u3002<\/li>\n<li>\u589e\u52a0\u4e86\u9759\u6001\u5bfc\u5165\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728\u4e0d\u4f7f\u7528\u7c7b\u540d\u7684\u60c5\u51b5\u4e0b\u76f4\u63a5\u4f7f\u7528\u9759\u6001\u6210\u5458\u3002<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u662f JDK 5 \u4e2d\u7684\u4e00\u4e9b\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>\u6cdb\u578b\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">List&lt;String&gt; list = new ArrayList&lt;String&gt;();\nlist.add(&quot;foo&quot;);\nString str = list.get(0);<\/code><\/pre>\n<ol start=\"2\">\n<li>\u81ea\u52a8\u88c5\u7bb1\/\u62c6\u7bb1\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">Integer i = 42;\nint j = i;<\/code><\/pre>\n<ol start=\"3\">\n<li>\u589e\u5f3a\u7684 for \u5faa\u73af\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">List&lt;String&gt; list = new ArrayList&lt;String&gt;();\nlist.add(&quot;foo&quot;);\nlist.add(&quot;bar&quot;);\nfor (String str : list) {\n    System.out.println(str);\n}<\/code><\/pre>\n<ol start=\"4\">\n<li>\u679a\u4e3e\u7c7b\u578b\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">public enum DayOfWeek {\n    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n}<\/code><\/pre>\n<ol start=\"5\">\n<li>\u9759\u6001\u5bfc\u5165\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">import static java.lang.Math.*;\ndouble result = sqrt(pow(x, 2) + pow(y, 2));<\/code><\/pre>\n<ol start=\"6\">\n<li>\u53ef\u53d8\u53c2\u6570\u65b9\u6cd5\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">public static void printValues(String... values) {\n    for (String value : values) {\n        System.out.println(value);\n    }\n}\nprintValues(&quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;);<\/code><\/pre>\n<ol start=\"7\">\n<li>\u6ce8\u89e3\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.METHOD)\npublic @interface MyAnnotation {\n    String value();\n}\n\npublic class MyClass {\n    @MyAnnotation(&quot;Hello, world!&quot;)\n    public void myMethod() {\n        \/\/ some code\n    }\n}<\/code><\/pre>\n<h4>JDK 1.6\uff082006\u5e7412\u670811\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u652f\u6301JDBC4.0<\/li>\n<li>\u96c6\u6210\u4e86JAXB\uff0c\u652f\u6301XML\u7ed1\u5b9a<\/li>\n<li>\u5f15\u5165\u4e86Java Compiler API\uff0c\u5141\u8bb8Java\u7a0b\u5e8f\u5728\u8fd0\u884c\u65f6\u8c03\u7528Java\u7f16\u8bd1\u5668<\/li>\n<li>\u5f15\u5165\u4e86JConsole\u5de5\u5177\uff0c\u7528\u4e8e\u76d1\u63a7Java\u5e94\u7528\u7a0b\u5e8f\u7684\u6027\u80fd\u548c\u8d44\u6e90\u4f7f\u7528\u60c5\u51b5<\/li>\n<li>\u5f15\u5165\u4e86Scripting API\uff0c\u652f\u6301\u5728Java\u4e2d\u8c03\u7528\u811a\u672c\u8bed\u8a00<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u662f JDK 6 \u4e2d\u7684\u4e00\u4e9b\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>\u63d2\u5165\u5f0f\u6ce8\u89e3\u5904\u7406 API\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">@SupportedAnnotationTypes(&quot;com.example.MyAnnotation&quot;)\npublic class MyAnnotationProcessor extends AbstractProcessor {\n    @Override\n    public boolean process(Set&lt;? extends TypeElement&gt; annotations, RoundEnvironment roundEnv) {\n        for (TypeElement annotation : annotations) {\n            for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) {\n                \/\/ process annotated elements\n            }\n        }\n        return true;\n    }\n}<\/code><\/pre>\n<ol start=\"2\">\n<li>JDBC 4.0 \u6539\u8fdb\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">Connection conn = DriverManager.getConnection(url, username, password);\ntry (PreparedStatement stmt = conn.prepareStatement(&quot;SELECT * FROM mytable&quot;);\n     ResultSet rs = stmt.executeQuery()) {\n    while (rs.next()) {\n        \/\/ process result set\n    }\n}<\/code><\/pre>\n<ol start=\"3\">\n<li>JAX-WS 2.0 \u548c JAXB 2.0 \u7684\u652f\u6301\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">@WebService\npublic class MyWebService {\n    @WebMethod\n    public String helloWorld(String name) {\n        return &quot;Hello, &quot; + name + &quot;!&quot;;\n    }\n}\n\n@XmlRootElement\npublic class MyObject {\n    @XmlElement\n    public String name;\n    @XmlElement\n    public int age;\n}<\/code><\/pre>\n<ol start=\"4\">\n<li>\u811a\u672c\u8bed\u8a00\u652f\u6301\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">ScriptEngineManager manager = new ScriptEngineManager();\nScriptEngine engine = manager.getEngineByName(&quot;JavaScript&quot;);\nObject result = engine.eval(&quot;var x = 1 + 2; x * 3;&quot;);\nSystem.out.println(result); \/\/ prints &quot;9&quot;<\/code><\/pre>\n<ol start=\"5\">\n<li>\u6539\u8fdb\u7684 GUI \u5de5\u5177\u5305\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">JFrame frame = new JFrame(&quot;My Frame&quot;);\nframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\nframe.setSize(400, 300);\nframe.setVisible(true);<\/code><\/pre>\n<ol start=\"6\">\n<li>\u66f4\u597d\u7684\u6027\u80fd\u548c\u7a33\u5b9a\u6027\uff1a<\/li>\n<\/ol>\n<p>JDK 6 \u6539\u8fdb\u4e86 JVM \u7684\u6027\u80fd\u548c\u7a33\u5b9a\u6027\uff0c\u5305\u62ec\u66f4\u5feb\u7684\u542f\u52a8\u65f6\u95f4\u3001\u66f4\u4f4e\u7684\u5185\u5b58\u6d88\u8017\u3001\u66f4\u5feb\u7684\u5783\u573e\u56de\u6536\u7b49\u3002<\/p>\n<h4>JDK 1.7\uff082011\u5e747\u670828\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u5b57\u7b26\u4e32\u5728 switch \u8bed\u53e5\u4e2d\u7684\u652f\u6301<\/li>\n<li>\u6570\u5b57\u5b57\u9762\u91cf\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u6cd5\u652f\u6301<\/li>\n<li>Try-with-resources \u8bed\u53e5\u7684\u652f\u6301\uff0c\u53ef\u4ee5\u7b80\u5316\u8d44\u6e90\u7ba1\u7406<\/li>\n<li>\u5bf9\u6cdb\u578b\u7c7b\u578b\u5b9e\u4f8b\u5316\u7684\u7b80\u5316\u8bed\u6cd5<\/li>\n<li>\u591a\u4e2a\u5f02\u5e38\u7c7b\u578b\u7684\u6355\u83b7\u548c\u5904\u7406<\/li>\n<li>\u53ef\u53d8\u53c2\u6570\u65b9\u6cd5\u7684\u6539\u8fdb<\/li>\n<li>\u589e\u5f3a\u7684\u5b57\u8282\u7801\u652f\u6301\uff0c\u5305\u62ec invokedynamic \u6307\u4ee4<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u662f JDK 7 \u4e2d\u7684\u4e00\u4e9b\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>\u5b57\u7b26\u4e32\u5728 switch \u8bed\u53e5\u4e2d\u7684\u652f\u6301\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">String day = &quot;MON&quot;;\nswitch (day) {\n    case &quot;MON&quot;:\n        System.out.println(&quot;\u661f\u671f\u4e00&quot;);\n        break;\n    case &quot;TUE&quot;:\n        System.out.println(&quot;\u661f\u671f\u4e8c&quot;);\n        break;\n    case &quot;WED&quot;:\n        System.out.println(&quot;\u661f\u671f\u4e09&quot;);\n        break;\n    default:\n        System.out.println(&quot;\u65e0\u6548\u7684\u65e5\u671f&quot;);\n}<\/code><\/pre>\n<ol start=\"2\">\n<li>\u6570\u5b57\u5b57\u9762\u91cf\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u6cd5\u652f\u6301\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">int binary = 0b1010;\nSystem.out.println(binary);<\/code><\/pre>\n<ol start=\"3\">\n<li>Try-with-resources \u8bed\u53e5\u7684\u652f\u6301\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">try (BufferedReader br = new BufferedReader(new FileReader(file))) {\n    String line;\n    while ((line = br.readLine()) != null) {\n        System.out.println(line);\n    }\n} catch (IOException e) {\n    e.printStackTrace();\n}<\/code><\/pre>\n<ol start=\"4\">\n<li>\u5bf9\u6cdb\u578b\u7c7b\u578b\u5b9e\u4f8b\u5316\u7684\u7b80\u5316\u8bed\u6cd5\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">List&lt;String&gt; list = new ArrayList&lt;&gt;();<\/code><\/pre>\n<ol start=\"5\">\n<li>\u591a\u4e2a\u5f02\u5e38\u7c7b\u578b\u7684\u6355\u83b7\u548c\u5904\u7406\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">try {\n    \/\/ some code\n} catch (IOException | SQLException e) {\n    e.printStackTrace();\n}<\/code><\/pre>\n<ol start=\"6\">\n<li>\u53ef\u53d8\u53c2\u6570\u65b9\u6cd5\u7684\u6539\u8fdb\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">public static void printValues(String... values) {\n    for (String value : values) {\n        System.out.println(value);\n    }\n}<\/code><\/pre>\n<ol start=\"7\">\n<li>invokedynamic \u6307\u4ee4\u7684\u4f7f\u7528\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">MethodHandles.Lookup lookup = MethodHandles.lookup();\nMethodHandle mh = lookup.findStatic(Math.class, &quot;sqrt&quot;,\n        MethodType.methodType(double.class, double.class));\nCallSite cs = new ConstantCallSite(mh);\nMethodHandle sqrt = cs.dynamicInvoker();\ndouble result = (double) sqrt.invokeExact(4.0);\nSystem.out.println(result);<\/code><\/pre>\n<h4>JDK 8\uff082014\u5e743\u670818\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>Lambda \u8868\u8fbe\u5f0f\uff0c\u53ef\u4ee5\u65b9\u4fbf\u5730\u5728 Java \u4e2d\u5b9e\u73b0\u51fd\u6570\u5f0f\u7f16\u7a0b\uff1b<\/li>\n<li>\u63a5\u53e3\u9ed8\u8ba4\u65b9\u6cd5\uff0c\u5141\u8bb8\u63a5\u53e3\u5b9a\u4e49\u9ed8\u8ba4\u7684\u65b9\u6cd5\u5b9e\u73b0\uff1b<\/li>\n<li>\u51fd\u6570\u5f0f\u63a5\u53e3\uff0c\u6807\u8bc6\u53ea\u6709\u4e00\u4e2a\u62bd\u8c61\u65b9\u6cd5\u7684\u63a5\u53e3\uff0c\u4e3a Lambda \u8868\u8fbe\u5f0f\u63d0\u4f9b\u7c7b\u578b\u652f\u6301\uff1b<\/li>\n<li>Stream API\uff0c\u63d0\u4f9b\u66f4\u65b9\u4fbf\u7684\u96c6\u5408\u5904\u7406\u65b9\u5f0f\uff1b<\/li>\n<li>\u65b0\u7684\u65e5\u671f\u65f6\u95f4 API\uff0c\u66f4\u65b9\u4fbf\u5730\u5904\u7406\u65e5\u671f\u548c\u65f6\u95f4\uff1b<\/li>\n<li>\u5143\u6ce8\u89e3 @Repeatable\uff0c\u5141\u8bb8\u5728\u540c\u4e00\u4e2a\u5143\u7d20\u4e0a\u591a\u6b21\u4f7f\u7528\u76f8\u540c\u7684\u6ce8\u89e3\uff1b<\/li>\n<li>Type Annotations\uff0c\u589e\u52a0\u4e86\u5bf9\u6ce8\u89e3\u7684\u4e0a\u4e0b\u6587\u7c7b\u578b\u68c0\u67e5\uff1b<\/li>\n<li>\u5176\u4ed6\u6539\u8fdb\uff0c\u5982 JVM \u7684\u6027\u80fd\u63d0\u5347\u3001Base64 \u7f16\u89e3\u7801\u7b49\u3002<\/li>\n<\/ul>\n<p>Java 8\uff08JDK 8\uff09\u662fJava\u5e73\u53f0\u7684\u4e00\u4e2a\u91cd\u8981\u7248\u672c\uff0c\u5b83\u4e8e2014\u5e743\u6708\u53d1\u5e03\u3002\u4e0b\u9762\u662fJava 8\u7684\u4e00\u4e9b\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>Lambda\u8868\u8fbe\u5f0f\uff1aLambda\u8868\u8fbe\u5f0f\u662fJava 8\u4e2d\u6700\u91cd\u8981\u7684\u65b0\u7279\u6027\u4e4b\u4e00\uff0c\u5b83\u53ef\u4ee5\u7528\u66f4\u7b80\u6d01\u7684\u65b9\u5f0f\u5b9a\u4e49\u533f\u540d\u51fd\u6570\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">List&lt;String&gt; names = Arrays.asList(&quot;Alice&quot;, &quot;Bob&quot;, &quot;Charlie&quot;);\nnames.forEach(name -&gt; System.out.println(name));<\/code><\/pre>\n<ol start=\"2\">\n<li>Stream API\uff1aStream API\u662fJava 8\u4e2d\u5f15\u5165\u7684\u4e00\u79cd\u65b0\u7684\u96c6\u5408\u5904\u7406\u65b9\u5f0f\uff0c\u5b83\u53ef\u4ee5\u8ba9\u6211\u4eec\u66f4\u52a0\u65b9\u4fbf\u5730\u5bf9\u96c6\u5408\u8fdb\u884c\u8fc7\u6ee4\u3001\u6620\u5c04\u3001\u6392\u5e8f\u7b49\u64cd\u4f5c\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">List&lt;String&gt; names = Arrays.asList(&quot;Alice&quot;, &quot;Bob&quot;, &quot;Charlie&quot;);\nList&lt;String&gt; filteredNames = names.stream().filter(name -&gt; name.startsWith(&quot;A&quot;)).collect(Collectors.toList());<\/code><\/pre>\n<ol start=\"3\">\n<li>\u65b0\u7684\u65e5\u671f\u65f6\u95f4API\uff1aJava 8\u4e2d\u5f15\u5165\u4e86\u4e00\u79cd\u5168\u65b0\u7684\u65e5\u671f\u65f6\u95f4API\uff0c\u5b83\u53ef\u4ee5\u66f4\u597d\u5730\u5904\u7406\u65e5\u671f\u65f6\u95f4\u64cd\u4f5c\uff0c\u800c\u4e14\u6bd4\u65e7\u7684Date\u548cCalendar\u7c7b\u66f4\u52a0\u7b80\u5355\u6613\u7528\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">LocalDateTime currentDateTime = LocalDateTime.now();\nDateTimeFormatter formatter = DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd HH:mm:ss&quot;);\nString formattedDateTime = currentDateTime.format(formatter);\nSystem.out.println(formattedDateTime);<\/code><\/pre>\n<ol start=\"4\">\n<li>\u9ed8\u8ba4\u65b9\u6cd5\uff1aJava 8\u4e2d\u63a5\u53e3\u53ef\u4ee5\u5b9a\u4e49\u9ed8\u8ba4\u65b9\u6cd5\uff0c\u8fd9\u4e9b\u65b9\u6cd5\u53ef\u4ee5\u5728\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b\u4e2d\u76f4\u63a5\u8c03\u7528\uff0c\u800c\u4e0d\u9700\u8981\u91cd\u65b0\u5b9e\u73b0\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">public interface MyInterface {\n    default void printHello() {\n        System.out.println(&quot;Hello&quot;);\n    }\n}\n\npublic class MyClass implements MyInterface {\n    \/\/ \u4e0d\u9700\u8981\u91cd\u65b0\u5b9e\u73b0printHello()\u65b9\u6cd5\n}\n\nMyClass obj = new MyClass();\nobj.printHello(); \/\/ \u8f93\u51fa\uff1aHello<\/code><\/pre>\n<ol start=\"5\">\n<li>\u65b9\u6cd5\u5f15\u7528\uff1a\u65b9\u6cd5\u5f15\u7528\u662f\u4e00\u79cd\u66f4\u7b80\u6d01\u7684Lambda\u8868\u8fbe\u5f0f\u5199\u6cd5\uff0c\u5b83\u53ef\u4ee5\u76f4\u63a5\u5f15\u7528\u5df2\u6709\u7684\u65b9\u6cd5\u6765\u66ff\u4ee3Lambda\u8868\u8fbe\u5f0f\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">List&lt;String&gt; names = Arrays.asList(&quot;Alice&quot;, &quot;Bob&quot;, &quot;Charlie&quot;);\nnames.forEach(System.out::println);<\/code><\/pre>\n<p>\u8fd9\u4e9b\u662fJava 8\u7684\u4e00\u4e9b\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff0cJava 8\u8fd8\u5f15\u5165\u4e86\u5176\u4ed6\u4e00\u4e9b\u65b0\u7279\u6027\u548c\u6539\u8fdb\uff0c\u5982\u91cd\u590d\u6ce8\u89e3\u3001\u7c7b\u578b\u6ce8\u89e3\u3001\u53ef\u91cd\u590d\u6ce8\u89e3\u3001Nashorn JavaScript\u5f15\u64ce\u7b49\u3002\u8fd9\u4e9b\u65b0\u7279\u6027\u548c\u6539\u8fdb\u4f7f\u5f97Java 8\u6210\u4e3a\u4e86\u4e00\u4e2a\u66f4\u52a0\u5f3a\u5927\u548c\u73b0\u4ee3\u5316\u7684\u5e73\u53f0\u3002<\/p>\n<h4>JDK 9\uff082017\u5e749\u670821\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u6a21\u5757\u5316\u7cfb\u7edf\uff0c\u5f15\u5165\u4e86 Jigsaw \u9879\u76ee\uff0c\u5c06 JDK \u5206\u4e3a\u591a\u4e2a\u6a21\u5757\uff1b<\/li>\n<li>\u63a5\u53e3\u79c1\u6709\u65b9\u6cd5\uff0c\u5141\u8bb8\u5728\u63a5\u53e3\u4e2d\u5b9a\u4e49\u79c1\u6709\u65b9\u6cd5\uff1b<\/li>\n<li>Java REPL\uff08JShell\uff09\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u8fd0\u884c Java \u4ee3\u7801\uff1b<\/li>\n<li>\u6539\u8fdb\u7684 Stream API\uff0c\u65b0\u589e\u4e86 takeWhile \u548c dropWhile \u7b49\u65b9\u6cd5\uff1b<\/li>\n<li>HTTP 2 \u5ba2\u6237\u7aef\uff0c\u63d0\u4f9b\u4e86\u5bf9 HTTP\/2 \u534f\u8bae\u7684\u652f\u6301\uff1b<\/li>\n<li>\u6539\u8fdb\u7684 GC\uff0c\u5f15\u5165\u4e86 G1 \u6539\u8fdb\u7248 GC \u7b97\u6cd5\uff0c\u51cf\u5c11\u4e86 GC \u505c\u987f\u65f6\u95f4\uff1b<\/li>\n<li>\u91cd\u6784\u4e86\u96c6\u5408\u5b9e\u73b0\uff0c\u5c06\u539f\u6765\u7684 Vector\u3001Hashtable \u7b49\u7c7b\u6539\u4e3a\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684 ArrayList\u3001HashMap \u7b49\u7c7b\u3002<\/li>\n<\/ul>\n<p>Java 9\uff08JDK 9\uff09\u662fJava\u5e73\u53f0\u7684\u53e6\u4e00\u4e2a\u91cd\u8981\u7248\u672c\uff0c\u5b83\u4e8e2017\u5e749\u6708\u53d1\u5e03\u3002\u4e0b\u9762\u662fJava 9\u7684\u4e00\u4e9b\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>\u6a21\u5757\u5316\u7cfb\u7edf\uff1aJava 9\u5f15\u5165\u4e86\u6a21\u5757\u5316\u7cfb\u7edf\uff0c\u5b83\u53ef\u4ee5\u8ba9\u5f00\u53d1\u8005\u66f4\u597d\u5730\u7ba1\u7406\u548c\u7ec4\u7ec7\u4ee3\u7801\uff0c\u540c\u65f6\u8fd8\u53ef\u4ee5\u63d0\u9ad8\u5e94\u7528\u7a0b\u5e8f\u7684\u5b89\u5168\u6027\u548c\u6027\u80fd\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<p>\u6a21\u5757\u5316\u7cfb\u7edf\u53ef\u4ee5\u901a\u8fc7module-info.java\u6587\u4ef6\u6765\u5b9a\u4e49\u6a21\u5757\u548c\u6a21\u5757\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre><code class=\"language-java\">module my.module {\n    requires some.module;\n    exports my.package;\n}<\/code><\/pre>\n<ol start=\"2\">\n<li>JShell\uff1aJShell\u662fJava 9\u4e2d\u5f15\u5165\u7684\u4e00\u4e2a\u4ea4\u4e92\u5f0f\u7f16\u7a0b\u5de5\u5177\uff0c\u5b83\u53ef\u4ee5\u8ba9\u5f00\u53d1\u8005\u66f4\u5feb\u901f\u5730\u6d4b\u8bd5\u548c\u8c03\u8bd5\u4ee3\u7801\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<p>\u5728JShell\u4e2d\uff0c\u53ef\u4ee5\u76f4\u63a5\u8f93\u5165Java\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\u548c\u8c03\u8bd5\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre><code class=\"language-shell\">jshell&gt; int a = 10;\na ==&gt; 10\n\njshell&gt; int b = 20;\nb ==&gt; 20\n\njshell&gt; a + b\n$3 ==&gt; 30<\/code><\/pre>\n<ol start=\"3\">\n<li>\u63a5\u53e3\u79c1\u6709\u65b9\u6cd5\uff1aJava 9\u5141\u8bb8\u5728\u63a5\u53e3\u4e2d\u5b9a\u4e49\u79c1\u6709\u65b9\u6cd5\uff0c\u8fd9\u4e9b\u65b9\u6cd5\u53ef\u4ee5\u88ab\u63a5\u53e3\u7684\u9ed8\u8ba4\u65b9\u6cd5\u6216\u9759\u6001\u65b9\u6cd5\u8c03\u7528\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">public interface MyInterface {\n    default void printHello() {\n        print(&quot;Hello&quot;);\n    }\n\n    private void print(String message) {\n        System.out.println(message);\n    }\n}\n\nMyInterface obj = new MyInterface() {};\nobj.printHello(); \/\/ \u8f93\u51fa\uff1aHello<\/code><\/pre>\n<ol start=\"4\">\n<li>\u6539\u8fdb\u7684\u96c6\u5408\u5de5\u5382\u65b9\u6cd5\uff1aJava 9\u4e2d\u5f15\u5165\u4e86\u4e00\u79cd\u66f4\u52a0\u7b80\u5355\u6613\u7528\u7684\u96c6\u5408\u5de5\u5382\u65b9\u6cd5\uff0c\u5b83\u53ef\u4ee5\u8ba9\u6211\u4eec\u66f4\u65b9\u4fbf\u5730\u521b\u5efa\u96c6\u5408\u5bf9\u8c61\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">List&lt;String&gt; names = List.of(&quot;Alice&quot;, &quot;Bob&quot;, &quot;Charlie&quot;);\nSet&lt;Integer&gt; numbers = Set.of(1, 2, 3, 4, 5);<\/code><\/pre>\n<ol start=\"5\">\n<li>\u6539\u8fdb\u7684try-with-resources\u8bed\u53e5\uff1aJava 9\u4e2d\u7684try-with-resources\u8bed\u53e5\u53ef\u4ee5\u8ba9\u6211\u4eec\u66f4\u65b9\u4fbf\u5730\u5904\u7406\u591a\u4e2a\u8d44\u6e90\u7684\u60c5\u51b5\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">try (InputStream in = new FileInputStream(&quot;file1.txt&quot;);\n     OutputStream out = new FileOutputStream(&quot;file2.txt&quot;)) {\n    \/\/ \u5904\u7406\u8f93\u5165\u8f93\u51fa\u6d41\n} catch (IOException e) {\n    \/\/ \u5904\u7406\u5f02\u5e38\n}<\/code><\/pre>\n<p>HTTP\/2 \u5ba2\u6237\u7aef\uff1a<\/p>\n<pre><code class=\"language-java\">HttpClient client = HttpClient.newHttpClient();\nHttpRequest request = HttpRequest.newBuilder()\n  .uri(URI.create(&quot;https:\/\/example.com&quot;))\n  .GET()\n  .build();\nHttpResponse&lt;String&gt; response = client.send(request, \n  HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body(<\/code><\/pre>\n<p>\u8fd9\u4e9b\u662fJava 9\u7684\u4e00\u4e9b\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff0cJava 9\u8fd8\u5f15\u5165\u4e86\u5176\u4ed6\u4e00\u4e9b\u65b0\u7279\u6027\u548c\u6539\u8fdb\uff0c\u5982HTTP\/2\u5ba2\u6237\u7aef\u3001\u6539\u8fdb\u7684\u6ce8\u89e3\u5904\u7406\u5668\u3001\u6539\u8fdb\u7684\u5783\u573e\u56de\u6536\u5668\u7b49\u3002\u8fd9\u4e9b\u65b0\u7279\u6027\u548c\u6539\u8fdb\u8fdb\u4e00\u6b65\u63d0\u5347\u4e86Java\u5e73\u53f0\u7684\u6027\u80fd\u548c\u53ef\u7528\u6027\u3002<\/p>\n<h4>JDK 10\uff082018\u5e743\u670820\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u5f15\u5165\u4e86var\u5173\u952e\u5b57\uff0c\u652f\u6301\u7c7b\u578b\u63a8\u65ad<\/li>\n<li>\u5f15\u5165\u4e86\u5c40\u90e8\u53d8\u91cf\u7c7b\u578b\u63a8\u65ad<\/li>\n<li>\u5f15\u5165\u4e86Graal JIT\u7f16\u8bd1\u5668<\/li>\n<li>\u5f15\u5165\u4e86\u5e94\u7528\u7a0b\u5e8f\u6570\u636e\u5171\u4eab\uff08Application Data Sharing\uff09\u529f\u80fd\uff0c\u7528\u4e8e\u52a0\u901f\u5e94\u7528\u7a0b\u5e8f\u7684\u542f\u52a8\u65f6\u95f4<\/li>\n<li>\u5f15\u5165\u4e86ThreadLocal\u63e1\u624b\u534f\u8bae\uff08Thread-Local Handshakes\uff09\uff0c\u7528\u4e8e\u66f4\u6709\u6548\u5730\u7ba1\u7406\u7ebf\u7a0b\u7684\u6267\u884c\u72b6\u6001<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u662f JDK 10 \u4e2d\u7684\u4e00\u4e9b\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>\u5c40\u90e8\u53d8\u91cf\u7c7b\u578b\u63a8\u65ad\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">var list = new ArrayList&lt;String&gt;();\nlist.add(&quot;foo&quot;);\nlist.add(&quot;bar&quot;);\nfor (var str : list) {\n    System.out.println(str);\n}<\/code><\/pre>\n<ol start=\"2\">\n<li>\u5e94\u7528\u7c7b\u6570\u636e\u5171\u4eab\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-shell\">java -Xshare:dump\njava -Xshare:on -jar myapp.jar<\/code><\/pre>\n<ol start=\"3\">\n<li>\u6539\u8fdb\u7684 G1 \u5783\u573e\u6536\u96c6\u5668\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-shell\">java -XX:+UseG1GC -Xms512m -Xmx512m myapp.jar<\/code><\/pre>\n<ol start=\"4\">\n<li>\u7ebf\u7a0b\u672c\u5730\u63e1\u624b\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">Thread.currentThread().handshake();<\/code><\/pre>\n<ol start=\"5\">\n<li>\u6539\u8fdb\u7684 Optional \u7c7b\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">Optional&lt;String&gt; optional = Optional.ofNullable(someString);\noptional.ifPresent(str -&gt; System.out.println(str));\nString result = optional.orElse(&quot;default&quot;);<\/code><\/pre>\n<ol start=\"6\">\n<li>\u6539\u8fdb\u7684\u96c6\u5408\u5de5\u5382\u65b9\u6cd5\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">List&lt;String&gt; list = List.of(&quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;);\nSet&lt;Integer&gt; set = Set.of(1, 2, 3);\nMap&lt;String, Integer&gt; map = Map.of(&quot;foo&quot;, 1, &quot;bar&quot;, 2);<\/code><\/pre>\n<ol start=\"7\">\n<li>\u57fa\u4e8e\u65f6\u95f4\u7684\u7248\u672c\u63a7\u5236\uff08Experimental\uff09\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-shell\">java -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler myapp.jar<\/code><\/pre>\n<h4>JDK 11\uff082018\u5e749\u670825\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>HTTP \u5ba2\u6237\u7aef\uff08HTTP Client\uff09<\/li>\n<li>Unicode 10 \u652f\u6301<\/li>\n<li>\u5c40\u90e8\u53d8\u91cf\u8bed\u6cd5\uff08Local-Variable Syntax\uff09<\/li>\n<li>\u5783\u573e\u6536\u96c6\u5668\u63a5\u53e3\uff08Garbage Collector Interface\uff09<\/li>\n<li>Epsilon \u5783\u573e\u6536\u96c6\u5668\uff08Experimental\uff09<\/li>\n<li>ZGC \u5783\u573e\u6536\u96c6\u5668\uff08Experimental\uff09<\/li>\n<li>\u6539\u8fdb\u7684 Optional \u7c7b<\/li>\n<li>\u5e9f\u5f03\u7684\u529f\u80fd\u548c\u9650\u5236<\/li>\n<li>\u6539\u8fdb\u7684 JVM<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u662f JDK 11 \u4e2d\u7684\u4e00\u4e9b\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>HTTP \u5ba2\u6237\u7aef\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">HttpClient client = HttpClient.newHttpClient();\nHttpRequest request = HttpRequest.newBuilder()\n        .uri(URI.create(&quot;https:\/\/www.example.com&quot;))\n        .build();\nHttpResponse&lt;String&gt; response = client.send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.body());<\/code><\/pre>\n<ol start=\"2\">\n<li>Unicode 10 \u652f\u6301\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">String emoji = &quot;\\uD83D\\uDE01&quot;;\nSystem.out.println(emoji);<\/code><\/pre>\n<ol start=\"3\">\n<li>\u5c40\u90e8\u53d8\u91cf\u8bed\u6cd5\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">var list = List.of(&quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;);\nfor (var str : list) {\n    System.out.println(str);\n}<\/code><\/pre>\n<ol start=\"4\">\n<li>\u5783\u573e\u6536\u96c6\u5668\u63a5\u53e3\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">List&lt;GarbageCollectorMXBean&gt; gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();\nfor (GarbageCollectorMXBean gcMxBean : gcMxBeans) {\n    System.out.println(gcMxBean.getName());\n}<\/code><\/pre>\n<ol start=\"5\">\n<li>Epsilon \u5783\u573e\u6536\u96c6\u5668\uff08Experimental\uff09\uff1a<\/li>\n<\/ol>\n<pre><code>java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC myapp.jar<\/code><\/pre>\n<ol start=\"6\">\n<li>ZGC \u5783\u573e\u6536\u96c6\u5668\uff08Experimental\uff09\uff1a<\/li>\n<\/ol>\n<pre><code>java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC myapp.jar<\/code><\/pre>\n<ol start=\"7\">\n<li>\u6539\u8fdb\u7684 Optional \u7c7b\uff1a<\/li>\n<\/ol>\n<pre><code>Optional&lt;String&gt; optional = Optional.ofNullable(someString);\noptional.ifPresentOrElse(str -&gt; System.out.println(str), () -&gt; System.out.println(&quot;Not present&quot;));\nString result = optional.orElseThrow();<\/code><\/pre>\n<ol start=\"8\">\n<li>\u5e9f\u5f03\u7684\u529f\u80fd\u548c\u9650\u5236\uff1a<\/li>\n<\/ol>\n<ul>\n<li>\u5e9f\u5f03\u7684\u529f\u80fd\uff1aJava EE \u548c CORBA \u6a21\u5757<\/li>\n<li>\u9650\u5236\uff1a\u5bf9\u4e8e\u672a\u7ecf\u6388\u6743\u7684\u4ee3\u7801\uff0c\u4e0d\u518d\u652f\u6301\u8fd0\u884c applet \u548c WebStart \u5e94\u7528\u7a0b\u5e8f<\/li>\n<\/ul>\n<ol start=\"9\">\n<li>\u6539\u8fdb\u7684 JVM\uff1a<\/li>\n<\/ol>\n<ul>\n<li>\u6539\u8fdb\u4e86\u5e94\u7528\u7a0b\u5e8f\u7c7b\u6570\u636e\u5171\u4eab\uff08Application Class-Data Sharing\uff09\u529f\u80fd\uff0c\u52a0\u5feb\u4e86\u542f\u52a8\u65f6\u95f4<\/li>\n<li>\u6539\u8fdb\u4e86\u5783\u573e\u6536\u96c6\u5668\u6027\u80fd<\/li>\n<li>\u6539\u8fdb\u4e86\u52a8\u6001\u7c7b\u6587\u4ef6\u5e38\u91cf\uff08Dynamic Class-File Constants\uff09\u529f\u80fd\uff0c\u652f\u6301\u5728\u5e38\u91cf\u6c60\u4e2d\u5b58\u50a8\u8fd0\u884c\u65f6\u751f\u6210\u7684\u5e38\u91cf\u503c<\/li>\n<li>\u6539\u8fdb\u4e86 JVM \u4ee3\u7801\u5e93\u7684\u6a21\u5757\u5316<\/li>\n<\/ul>\n<h4>JDK 12\uff082019\u5e743\u670819\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>Switch \u8868\u8fbe\u5f0f\uff08Switch Expressions\uff09<\/li>\n<li>File.mismatch() \u65b9\u6cd5<\/li>\n<li>\u6539\u8fdb\u7684 Shenandoah \u5783\u573e\u6536\u96c6\u5668<\/li>\n<li>\u5e9f\u5f03\u7684 Nashorn JavaScript \u5f15\u64ce<\/li>\n<li>\u6539\u8fdb\u7684 JVM<\/li>\n<li>\u65b0\u7684\u6807\u51c6\u5e93\u7279\u6027<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u662f JDK 12 \u4e2d\u7684\u4e00\u4e9b\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>Switch \u8868\u8fbe\u5f0f\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">int dayOfWeek = 1;\nString dayOfWeekName = switch (dayOfWeek) {\n    case 1 -&gt; &quot;Monday&quot;;\n    case 2 -&gt; &quot;Tuesday&quot;;\n    case 3 -&gt; &quot;Wednesday&quot;;\n    case 4 -&gt; &quot;Thursday&quot;;\n    case 5 -&gt; &quot;Friday&quot;;\n    case 6 -&gt; &quot;Saturday&quot;;\n    case 7 -&gt; &quot;Sunday&quot;;\n    default -&gt; throw new IllegalArgumentException(&quot;Invalid day of the week: &quot; + dayOfWeek);\n};\nSystem.out.println(dayOfWeekName);<\/code><\/pre>\n<ol start=\"2\">\n<li>File.mismatch() \u65b9\u6cd5\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-java\">Path path1 = Paths.get(&quot;file1.txt&quot;);\nPath path2 = Paths.get(&quot;file2.txt&quot;);\nlong mismatch = Files.mismatch(path1, path2);\nif (mismatch == -1L) {\n    System.out.println(&quot;Files are identical.&quot;);\n} else {\n    System.out.println(&quot;Files differ at byte position &quot; + mismatch + &quot;.&quot;);\n}<\/code><\/pre>\n<ol start=\"3\">\n<li>\u6539\u8fdb\u7684 Shenandoah \u5783\u573e\u6536\u96c6\u5668\uff1a<\/li>\n<\/ol>\n<p>Shenandoah \u662f JDK 12 \u4e2d\u7684\u4e00\u4e2a\u5b9e\u9a8c\u6027\u5783\u573e\u6536\u96c6\u5668\uff0c\u65e8\u5728\u63d0\u9ad8\u5927\u5185\u5b58\u5806\u7684 GC \u6027\u80fd\u3002\u4f7f\u7528 Shenandoah \u5783\u573e\u6536\u96c6\u5668\u65f6\uff0c\u9700\u8981\u901a\u8fc7\u6dfb\u52a0\u4ee5\u4e0b\u6807\u5fd7\u6765\u542f\u7528\uff1a<\/p>\n<pre><code class=\"language-shell\">java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC myapp.jar<\/code><\/pre>\n<ol start=\"4\">\n<li>\u5e9f\u5f03\u7684 Nashorn JavaScript \u5f15\u64ce\uff1a<\/li>\n<\/ol>\n<p>Nashorn JavaScript \u5f15\u64ce\u5728 JDK 11 \u4e2d\u88ab\u6807\u8bb0\u4e3a\u5e9f\u5f03\uff0c\u5728 JDK 12 \u4e2d\u88ab\u79fb\u9664\u3002\u5efa\u8bae\u4f7f\u7528\u5176\u4ed6\u7684 JavaScript \u5f15\u64ce\u3002<\/p>\n<ol start=\"5\">\n<li>\u6539\u8fdb\u7684 JVM\uff1a<\/li>\n<\/ol>\n<ul>\n<li>\u6539\u8fdb\u4e86\u5e94\u7528\u7a0b\u5e8f\u7c7b\u6570\u636e\u5171\u4eab\uff08Application Class-Data Sharing\uff09\u529f\u80fd\uff0c\u52a0\u5feb\u4e86\u542f\u52a8\u65f6\u95f4<\/li>\n<li>\u6539\u8fdb\u4e86 ZGC \u5783\u573e\u6536\u96c6\u5668\u6027\u80fd<\/li>\n<li>\u6539\u8fdb\u4e86 JVM \u5bf9 Docker \u5bb9\u5668\u7684\u652f\u6301<\/li>\n<\/ul>\n<ol start=\"6\">\n<li>\u65b0\u7684\u6807\u51c6\u5e93\u7279\u6027\uff1a<\/li>\n<\/ol>\n<p>JDK 12 \u7684\u6807\u51c6\u5e93\u65b0\u589e\u4e86\u4e00\u4e9b\u529f\u80fd\uff0c\u4f8b\u5982\uff1a<\/p>\n<ul>\n<li>\u652f\u6301 Unicode 11.0 \u7248\u672c<\/li>\n<li>\u65b0\u7684 String \u65b9\u6cd5\uff1aindent()\u3001transform()\u3001describeConstable() \u7b49<\/li>\n<li>\u65b0\u7684 Collectors \u65b9\u6cd5\uff1ateeing()\u3001filtering() \u7b49<\/li>\n<li>\u65b0\u7684\u96c6\u5408\u64cd\u4f5c\uff1aCollectors.toUnmodifiableMap()\u3001List.copyOf()\u3001Set.copyOf() \u7b49<\/li>\n<\/ul>\n<h4>JDK 13\uff082019\u5e749\u670817\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u5f15\u5165\u4e86 Text Blocks\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728 Java \u4ee3\u7801\u4e2d\u4f7f\u7528\u591a\u884c\u5b57\u7b26\u4e32\u3002<\/li>\n<li>\u5f15\u5165\u4e86 Switch \u8868\u8fbe\u5f0f\u7684\u589e\u5f3a\u7248\u672c\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728 Switch \u8bed\u53e5\u4e2d\u4f7f\u7528 Yield \u8bed\u53e5\u3002<\/li>\n<li>\u5f15\u5165\u4e86\u65b0\u7684\u5783\u573e\u6536\u96c6\u5668 ZGC\uff08Experimental\uff09\uff0c\u7528\u4e8e\u5904\u7406\u5927\u578b\u5185\u5b58\u5806\u3002<\/li>\n<\/ul>\n<p>\u4e0b\u9762\u662fJDK 13\u7684\u4e3b\u8981\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>Switch\u8868\u8fbe\u5f0f\uff1a\u652f\u6301\u5728Switch\u8bed\u53e5\u4e2d\u4f7f\u7528\u8868\u8fbe\u5f0f\uff0c\u4ece\u800c\u63d0\u9ad8\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u548c\u7b80\u6d01\u6027\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">String day = &quot;MONDAY&quot;;\nint numLetters = switch (day) {\n    case &quot;MONDAY&quot;, &quot;FRIDAY&quot;, &quot;SUNDAY&quot; -&gt; 6;\n    case &quot;TUESDAY&quot; -&gt; 7;\n    case &quot;THURSDAY&quot;, &quot;SATURDAY&quot; -&gt; 8;\n    case &quot;WEDNESDAY&quot; -&gt; 9;\n    default -&gt; throw new IllegalStateException(&quot;\u65e0\u6548\u7684\u65e5\u671f &quot; + day);\n};<\/code><\/pre>\n<ol start=\"2\">\n<li>\u6587\u672c\u5757\uff1a\u7b80\u5316\u4e86\u591a\u884c\u5b57\u7b26\u4e32\u7684\u521b\u5efa\u65b9\u5f0f\uff0c\u4ece\u800c\u63d0\u9ad8\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u548c\u6613\u7528\u6027\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">String html = &quot;&quot;&quot;\n              &lt;html&gt;\n                  &lt;body&gt;\n                      &lt;p&gt;Hello, world&lt;\/p&gt;\n                  &lt;\/body&gt;\n              &lt;\/html&gt;\n              &quot;&quot;&quot;;<\/code><\/pre>\n<ol start=\"3\">\n<li>ZGC\uff08Z Garbage Collector\uff09\uff1a\u65b0\u7684\u5783\u573e\u56de\u6536\u5668\uff0c\u652f\u6301\u5927\u5185\u5b58\u5e94\u7528\u7a0b\u5e8f\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<p>\u5728\u542f\u52a8JVM\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u9009\u9879\u542f\u7528ZGC\u5783\u573e\u56de\u6536\u5668\uff1a<\/p>\n<pre><code class=\"language-shell\">java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp<\/code><\/pre>\n<ol start=\"4\">\n<li>\u65b0\u589e\u4e86\u4e00\u4e9bAPI\uff1a\u5305\u62ec\u8fed\u4ee3\u5668API\u3001\u5783\u573e\u56de\u6536API\u7b49\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">List&lt;Integer&gt; list = Arrays.asList(1, 2, 3);\nlist.forEach(System.out::println);\n\n\/\/\u8f93\u51fa\uff1a\n\/\/1\n\/\/2\n\/\/3<\/code><\/pre>\n<h4>JDK 14\uff082020\u5e743\u670817\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u5f15\u5165\u4e86 Pattern Matching for instanceof\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728 instanceof \u8868\u8fbe\u5f0f\u4e2d\u4f7f\u7528\u6a21\u5f0f\u5339\u914d\u3002<\/li>\n<li>\u5f15\u5165\u4e86 Records\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u8f7b\u677e\u5730\u5b9a\u4e49\u4e0d\u53ef\u53d8\u7684\u6570\u636e\u7c7b\u3002<\/li>\n<li>\u5f15\u5165\u4e86 Switch \u8868\u8fbe\u5f0f\u7684\u589e\u5f3a\u7248\u672c\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728 Switch \u8bed\u53e5\u4e2d\u4f7f\u7528\u7bad\u5934\u8bed\u6cd5\u3002<\/li>\n<\/ul>\n<ol>\n<li>Records\uff08\u8bb0\u5f55\u7c7b\u578b\uff09\uff1a\u63d0\u4f9b\u4e86\u4e00\u79cd\u7d27\u51d1\u7684\u8bed\u6cd5\u6765\u58f0\u660e\u4e00\u4e2a\u53ea\u5305\u542b\u6570\u636e\u7684\u7c7b\uff0c\u4ece\u800c\u7b80\u5316\u4e86Java\u4e2d\u7684\u6570\u636e\u7c7b\u7684\u521b\u5efa\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">public record Person(String name, int age) {}<\/code><\/pre>\n<ol start=\"2\">\n<li>instanceof \u6a21\u5f0f\u5339\u914d\uff1a\u6269\u5c55\u4e86instanceof\u8fd0\u7b97\u7b26\uff0c\u652f\u6301\u5728\u5224\u65ad\u5bf9\u8c61\u7c7b\u578b\u7684\u540c\u65f6\uff0c\u5c06\u5bf9\u8c61\u8f6c\u6362\u4e3a\u8be5\u7c7b\u578b\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">if (obj instanceof String str) {\n    System.out.println(str.toUpperCase());\n}<\/code><\/pre>\n<ol start=\"3\">\n<li>Text Blocks\uff08\u6587\u672c\u5757\uff09\uff1a\u5728JDK 13\u4e2d\u5f15\u5165\u7684\u6587\u672c\u5757\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\u548c\u6269\u5c55\uff0c\u53ef\u4ee5\u66f4\u7075\u6d3b\u5730\u5904\u7406\u5b57\u7b26\u4e32\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">String html = &quot;&quot;&quot;\n              &lt;html&gt;\n                  &lt;body&gt;\n                      &lt;p&gt;Hello, world&lt;\/p&gt;\n                  &lt;\/body&gt;\n              &lt;\/html&gt;\n              &quot;&quot;&quot;;<\/code><\/pre>\n<ol start=\"4\">\n<li>Switch \u8868\u8fbe\u5f0f\u589e\u5f3a\uff1aSwitch\u8868\u8fbe\u5f0f\u652f\u6301yield\u8bed\u53e5\uff0c\u53ef\u4ee5\u8fd4\u56de\u4e00\u4e2a\u503c\uff0c\u4ece\u800c\u51cf\u5c11\u4e86\u4ee3\u7801\u7684\u590d\u6742\u5ea6\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">public enum Day {\n    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY\n}\n\npublic int getDayValue(Day day) {\n    return switch (day) {\n        case MONDAY -&gt; 1;\n        case TUESDAY -&gt; 2;\n        case WEDNESDAY -&gt; 3;\n        case THURSDAY -&gt; 4;\n        case FRIDAY -&gt; 5;\n        case SATURDAY, SUNDAY -&gt; {\n            int value = day.name().length();\n            yield value;\n        }\n    };\n}<\/code><\/pre>\n<ol start=\"5\">\n<li>Packaging Tool\uff08\u6253\u5305\u5de5\u5177\uff09\uff1a\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6253\u5305\u5de5\u5177\uff0c\u53ef\u4ee5\u5c06Java\u5e94\u7528\u7a0b\u5e8f\u6253\u5305\u6210\u53ef\u6267\u884c\u6587\u4ef6\u6216\u53ef\u53d1\u5e03\u7684\u6587\u4ef6\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-shell\">jpackage --name MyApp --input target\/myapp-1.0.jar --main-jar myapp-1.0.jar --type dmg<\/code><\/pre>\n<p>\u8fd9\u4e9b\u662fJDK 14\u7684\u4e3b\u8981\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff0c\u4f46\u4e0d\u9650\u4e8e\u6b64\u3002\u8be6\u7ec6\u7684\u5347\u7ea7\u5185\u5bb9\u53ef\u4ee5\u53c2\u8003\u5b98\u65b9\u6587\u6863\u3002<\/p>\n<h4>JDK 15\uff082020\u5e749\u670815\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u5f15\u5165\u4e86 Sealed Classes\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u9650\u5236\u7ee7\u627f\u67d0\u4e2a\u7c7b\u7684\u5b50\u7c7b\u7684\u6570\u91cf\u3002<\/li>\n<li>\u5f15\u5165\u4e86 Hidden Classes\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u751f\u6210\u7c7b\u5e76\u5c06\u5176\u9690\u85cf\u3002<\/li>\n<li>\u5f15\u5165\u4e86 Text Blocks \u7684\u589e\u5f3a\u7248\u672c\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728\u5b57\u7b26\u4e32\u4e2d\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u3002<\/li>\n<\/ul>\n<ol>\n<li>Sealed Classes\uff08\u5c01\u95ed\u7c7b\uff09\uff1a\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b0\u7684\u7c7b\u9650\u5236\u673a\u5236\uff0c\u53ef\u4ee5\u9650\u5236\u7c7b\u7684\u5b50\u7c7b\u5316\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u4ee3\u7801\u7684\u5b89\u5168\u6027\u548c\u53ef\u8bfb\u6027\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">public abstract sealed class Animal permits Cat, Dog {\n    \/\/ \u7c7b\u5b9a\u4e49\n}\n\npublic final class Cat extends Animal {\n    \/\/ \u5b50\u7c7b\u5b9a\u4e49\n}\n\npublic final class Dog extends Animal {\n    \/\/ \u5b50\u7c7b\u5b9a\u4e49\n}<\/code><\/pre>\n<ol start=\"2\">\n<li>Hidden Classes\uff08\u9690\u85cf\u7c7b\uff09\uff1a\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b0\u7684\u7c7b\u52a0\u8f7d\u673a\u5236\uff0c\u53ef\u4ee5\u9690\u85cf\u7c7b\u7684\u5b9e\u73b0\u7ec6\u8282\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u4ee3\u7801\u7684\u5b89\u5168\u6027\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">Lookup lookup = MethodHandles.lookup();\nClass&lt;?&gt; clazz = lookup.defineHiddenClass(bytes, true).lookupClass();\nObject instance = clazz.getDeclaredConstructor().newInstance();<\/code><\/pre>\n<ol start=\"3\">\n<li>Text Blocks\uff08\u6587\u672c\u5757\uff09\u589e\u5f3a\uff1a\u5728JDK 14\u4e2d\u5f15\u5165\u7684\u6587\u672c\u5757\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\u548c\u6269\u5c55\uff0c\u652f\u6301\u5728\u6587\u672c\u5757\u4e2d\u4f7f\u7528\u8f6c\u4e49\u5b57\u7b26\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">String sql = &quot;&quot;&quot;\n             SELECT * \\\n             FROM customers \\\n             WHERE id = ? \\\n             ORDER BY name DESC\n             &quot;&quot;&quot;;<\/code><\/pre>\n<ol start=\"4\">\n<li>ZGC\uff08Z Garbage Collector\uff09\u589e\u5f3a\uff1aZGC\u5783\u573e\u56de\u6536\u5668\u652f\u6301\u5728\u591a\u4e2a\u5904\u7406\u5668\u4e0a\u5e76\u884c\u5904\u7406\u5783\u573e\u56de\u6536\u4efb\u52a1\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u6027\u80fd\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<p>\u5728\u542f\u52a8JVM\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u9009\u9879\u542f\u7528ZGC\u5783\u573e\u56de\u6536\u5668\uff1a<\/p>\n<pre><code class=\"language-shell\">java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp<\/code><\/pre>\n<ol start=\"5\">\n<li>Pattern Matching for instanceof\uff08instanceof\u6a21\u5f0f\u5339\u914d\uff09\u589e\u5f3a\uff1ainstanceof\u6a21\u5f0f\u5339\u914d\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\uff0c\u652f\u6301\u5728\u5224\u65ad\u5bf9\u8c61\u7c7b\u578b\u7684\u540c\u65f6\uff0c\u5c06\u5bf9\u8c61\u8f6c\u6362\u4e3a\u8be5\u7c7b\u578b\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">if (obj instanceof String str &amp;&amp; str.length() &gt; 5) {\n    System.out.println(str.toUpperCase());\n}<\/code><\/pre>\n<p>\u8fd9\u4e9b\u662fJDK 15\u7684\u4e3b\u8981\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff0c\u4f46\u4e0d\u9650\u4e8e\u6b64\u3002\u8be6\u7ec6\u7684\u5347\u7ea7\u5185\u5bb9\u53ef\u4ee5\u53c2\u8003\u5b98\u65b9\u6587\u6863\u3002<\/p>\n<h4>JDK 16\uff082021\u5e743\u670816\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u5f15\u5165\u4e86 Records \u7684\u589e\u5f3a\u7248\u672c\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728 Records \u4e2d\u4f7f\u7528\u6784\u9020\u51fd\u6570\u548c\u9759\u6001\u65b9\u6cd5\u3002<\/li>\n<li>\u5f15\u5165\u4e86 Pattern Matching for instanceof \u7684\u589e\u5f3a\u7248\u672c\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5728 switch \u8868\u8fbe\u5f0f\u4e2d\u4f7f\u7528\u6a21\u5f0f\u5339\u914d\u3002<\/li>\n<li>\u5f15\u5165\u4e86 Vector API\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u4f7f\u7528\u5411\u91cf\u8fd0\u7b97\u4f18\u5316\u6027\u80fd\u3002<\/li>\n<\/ul>\n<p>\u4e0b\u9762\u662fJDK 16\u7684\u4e3b\u8981\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>Records\uff08\u8bb0\u5f55\u7c7b\u578b\uff09\u589e\u5f3a\uff1a\u5728JDK 14\u4e2d\u5f15\u5165\u7684\u8bb0\u5f55\u7c7b\u578b\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\uff0c\u53ef\u4ee5\u4f7f\u7528\u66f4\u7075\u6d3b\u7684\u8bed\u6cd5\u6765\u5b9a\u4e49\u8bb0\u5f55\u7c7b\u578b\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">public record Person(String name, int age) {\n    public Person {\n        if (age &lt; 0) {\n            throw new IllegalArgumentException(&quot;Invalid age: &quot; + age);\n        }\n    }\n}<\/code><\/pre>\n<ol start=\"2\">\n<li>Pattern Matching for instanceof\uff08instanceof\u6a21\u5f0f\u5339\u914d\uff09\u589e\u5f3a\uff1a\u5728JDK 15\u4e2d\u5f15\u5165\u7684instanceof\u6a21\u5f0f\u5339\u914d\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\uff0c\u652f\u6301\u5728lambda\u8868\u8fbe\u5f0f\u548c\u533f\u540d\u7c7b\u4e2d\u4f7f\u7528\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">list.forEach(obj -&gt; {\n    if (obj instanceof String str &amp;&amp; str.length() &gt; 5) {\n        System.out.println(str.toUpperCase());\n    }\n});<\/code><\/pre>\n<ol start=\"3\">\n<li>Sealed Classes\uff08\u5c01\u95ed\u7c7b\uff09\u589e\u5f3a\uff1a\u5728JDK 15\u4e2d\u5f15\u5165\u7684\u5c01\u95ed\u7c7b\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\uff0c\u652f\u6301\u4f7f\u7528permits\u8bed\u53e5\u6765\u58f0\u660e\u5141\u8bb8\u7684\u5b50\u7c7b\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">public abstract sealed class Shape permits Circle, Rectangle {\n    \/\/ \u7c7b\u5b9a\u4e49\n}\n\npublic final class Circle extends Shape {\n    \/\/ \u5b50\u7c7b\u5b9a\u4e49\n}\n\npublic final class Rectangle extends Shape {\n    \/\/ \u5b50\u7c7b\u5b9a\u4e49\n}<\/code><\/pre>\n<ol start=\"4\">\n<li>Vector API\uff1a\u63d0\u4f9b\u4e86\u4e00\u7ec4\u65b0\u7684API\uff0c\u53ef\u4ee5\u5728\u5411\u91cf\u5316\u8ba1\u7b97\u4e2d\u63d0\u9ad8\u6027\u80fd\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">import jdk.incubator.vector.*;\n\nVectorSpecies&lt;Integer&gt; species = VectorSpecies.of(int.class, VectorShape.S_256_BIT);\nint[] arr1 = new int[256], arr2 = new int[256];\nIntVector vec1 = IntVector.fromArray(species, arr1, 0);\nIntVector vec2 = IntVector.fromArray(species, arr2, 0);\nIntVector vec3 = vec1.add(vec2);\nvec3.intoArray(arr1, 0);<\/code><\/pre>\n<ol start=\"5\">\n<li>Packaging Tool\uff08\u6253\u5305\u5de5\u5177\uff09\u589e\u5f3a\uff1a\u5728JDK 14\u4e2d\u5f15\u5165\u7684\u6253\u5305\u5de5\u5177\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\uff0c\u652f\u6301\u5728\u6253\u5305\u8fc7\u7a0b\u4e2d\u6dfb\u52a0\u9644\u52a0\u6a21\u5757\u548c\u8d44\u6e90\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-shell\">jpackage --name MyApp --input target\/myapp-1.0.jar --main-jar myapp-1.0.jar --type dmg --add-modules java.sql --add-resources src\/main\/resources<\/code><\/pre>\n<p>\u8fd9\u4e9b\u662fJDK 16\u7684\u4e3b\u8981\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff0c\u4f46\u4e0d\u9650\u4e8e\u6b64\u3002\u8be6\u7ec6\u7684\u5347\u7ea7\u5185\u5bb9\u53ef\u4ee5\u53c2\u8003\u5b98\u65b9\u6587\u6863\u3002<\/p>\n<h4>JDK 17\uff082021\u5e749\u670814\u65e5\u53d1\u5e03\uff09<\/h4>\n<ul>\n<li>\u5f15\u5165\u4e86 Sealed Classes \u7684\u589e\u5f3a\u7248\u672c\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u5c06\u63a5\u53e3\u58f0\u660e\u4e3a\u5bc6\u5c01\u63a5\u53e3\u3002<\/li>\n<li>\u5f15\u5165\u4e86\u65e0\u610f\u4e49\u7684 NullPointerException\uff0c\u7528\u4e8e\u66f4\u597d\u5730\u8bca\u65ad NullPointerException \u7684\u6765\u6e90\u3002<\/li>\n<li>\u5f15\u5165\u4e86\u5f31\u5bc6\u94a5\u7684\u8b66\u544a\uff0c\u7528\u4e8e\u8bca\u65ad\u4f7f\u7528\u5f31\u5bc6\u94a5\u7684\u4ee3\u7801\u3002<\/li>\n<\/ul>\n<p>\u4e0b\u9762\u662fJDK 17\u7684\u4e3b\u8981\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff1a<\/p>\n<ol>\n<li>\u589e\u5f3a\u7684Switch\u8868\u8fbe\u5f0f\uff1a\u5728JDK 12\u4e2d\u5f15\u5165\u7684Switch\u8868\u8fbe\u5f0f\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\uff0c\u53ef\u4ee5\u652f\u6301\u66f4\u591a\u7684\u8bed\u6cd5\uff0c\u4f8b\u5982\u652f\u6301\u4f7f\u7528\u591a\u4e2a\u9017\u53f7\u5206\u9694\u7684\u503c\u548c\u7bad\u5934\u8bed\u6cd5\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">String result = switch (day) {\n    case MONDAY, FRIDAY, SUNDAY -&gt; &quot;No&quot;;\n    case TUESDAY                -&gt; &quot;Maybe&quot;;\n    case THURSDAY, SATURDAY     -&gt; &quot;Yes&quot;;\n    case WEDNESDAY              -&gt; &quot;Depends&quot;;\n    default                    -&gt; throw new IllegalArgumentException(&quot;Invalid day: &quot; + day);\n};<\/code><\/pre>\n<ol start=\"2\">\n<li>\u7c7b\u578b\u6a21\u5f0f\u5339\u914d\uff1a\u5728JDK 16\u4e2d\u5f15\u5165\u7684\u6a21\u5f0f\u5339\u914d\u529f\u80fd\u5f97\u5230\u4e86\u6539\u8fdb\uff0c\u53ef\u4ee5\u652f\u6301\u7c7b\u578b\u6a21\u5f0f\u5339\u914d\uff0c\u7528\u4e8e\u5728\u6a21\u5f0f\u5339\u914d\u4e2d\u5339\u914d\u5bf9\u8c61\u7c7b\u578b\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">if (obj instanceof String str) {\n    System.out.println(&quot;The length of the string is &quot; + str.length());\n} else if (obj instanceof List list &amp;&amp; !list.isEmpty()) {\n    System.out.println(&quot;The first element of the list is &quot; + list.get(0));\n}<\/code><\/pre>\n<ol start=\"3\">\n<li>\u5783\u573e\u6536\u96c6\u5668ZGC\u6539\u8fdb\uff1aZGC\u5783\u573e\u6536\u96c6\u5668\u5f97\u5230\u4e86\u6539\u8fdb\uff0c\u53ef\u4ee5\u5728Windows\u548cmacOS\u4e0a\u4f7f\u7528\uff0c\u5e76\u4e14\u652f\u6301\u4f7f\u7528\u900f\u660eHuge Pages\u3002<\/li>\n<\/ol>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-shell\">java -XX:+UseZGC -Xmx8g MyApp<\/code><\/pre>\n<ol start=\"4\">\n<li>\u6539\u8fdb\u7684\u5b89\u5168\u6027\uff1aJava SE 17\u5f15\u5165\u4e86\u8bb8\u591a\u5b89\u5168\u6027\u6539\u8fdb\uff0c\u4f8b\u5982\uff1a\u7981\u7528\u4e0d\u5b89\u5168\u7684RSA\u5bc6\u94a5\u3001\u9650\u5236HTTP\u548cSockets\u7684\u4f7f\u7528\u3001\u7981\u6b62\u4f7f\u7528\u4e0d\u5b89\u5168\u7684TLS\u7248\u672c\u7b49\u3002<\/li>\n<li>\u5176\u4ed6\u6539\u8fdb\uff1a\u8fd8\u6709\u4e00\u4e9b\u5176\u4ed6\u6539\u8fdb\uff0c\u4f8b\u5982\u652f\u6301\u5728Java\u7a0b\u5e8f\u4e2d\u4f7f\u7528\u5d4c\u5165\u5f0fElasticsearch\u3001\u652f\u6301\u4f7f\u7528Records\u4f5c\u4e3aSwitch\u8868\u8fbe\u5f0f\u7684\u7ed3\u679c\u7c7b\u578b\u3001\u63d0\u4f9b\u65b0\u7684HttpClient API\u7b49\u3002<\/li>\n<\/ol>\n<p>\u8fd9\u4e9b\u662fJDK 17\u7684\u4e3b\u8981\u5347\u7ea7\u5185\u5bb9\u548c\u793a\u4f8b\uff0c\u4f46\u4e0d\u9650\u4e8e\u6b64\u3002\u8be6\u7ec6\u7684\u5347\u7ea7\u5185\u5bb9\u53ef\u4ee5\u53c2\u8003\u5b98\u65b9\u6587\u6863\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ChatGPT\u6700\u8fd1\u633a\u706b\uff0c\u6bd4\u8f83\u6709\u610f\u601d\u7684\u662f\u76f8\u540c\u7684\u95ee\u9898\uff0c\u6bcf\u6b21\u5f97\u5230\u7684\u7b54\u6848\u51e0\u4e4e\u90fd\u4e0d\u4e00\u6837\uff0c\u603b\u4f1a\u6709\u4e9b\u533a\u522b\uff0c\u800c\u4e14ChatGPT [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[107,14],"tags":[96,95],"_links":{"self":[{"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/posts\/446"}],"collection":[{"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fugary.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=446"}],"version-history":[{"count":3,"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/posts\/446\/revisions"}],"predecessor-version":[{"id":452,"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/posts\/446\/revisions\/452"}],"wp:attachment":[{"href":"https:\/\/fugary.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fugary.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fugary.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}