精华内容
下载资源
问答
  • jdk10和jdk8共存和快速切换

    千次阅读 热门讨论 2019-08-22 21:20:27
    jdk10和jdk8共存和快速切换 某次空闲时间我我把jdk升级到了10(原先版本是8),后来因为项目需求,要用到jdk8,但是我又不想卸载掉10,于是想到了jdk共存,按照百度经验操作,发现不管怎么样都是jdk10 原因如下 首先...

    jdk10和jdk8共存和快速切换

    某次空闲时间我我把jdk升级到了10(原先版本是8),后来因为项目需求,要用到jdk8,但是我又不想卸载掉10,于是想到了jdk共存,按照百度经验操作,发现不管怎么样都是jdk10
    原因如下
    首先,jdk10和以往jdk不一样,他会自动在 C:\Program Files (x86)\Common Files\Oracle\Java\javapath 或者在C:\ProgramData\Oracle\Java\javapath 目录下面生成三个文件
    在这里插入图片描述
    这三个文件的优先级比较高,会使java -version和javac -version一直显示jdk10
    第一步删掉这三个文件
    第二步配置正确环境变量
    首先设置两个总变量 JAVA_HOMEJAVA_HOME_JRE
    为什么这么设置,通常配置方法是在系统变量里设置一个变量JAVA_HOME值为jdk安装路径例如( C:\Program Files\Java\jdk-10.0.2)配置 classpath值为 (.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar)(括号里面的都要)
    然后配置 path 值为 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
    但是这么配置的话对于jdk10而言不可以,在cmd里面javac没有反应,因为在jdk10的安装目录里面没有jre文件夹,jdk8可以
    (最新的jdk安装本身不带jre 需要手动生成 以管理员身份打开cmd

    cd  C:\Program Files\Java\jdk-11.0.1
    
    bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre
    
    这样就会生成jre
    )
    

    在这里插入图片描述

    针对以上不同设置两个总变量
    然后设置分变量截图如下(变量有点多,但是为了以后方便)
    在这里插入图片描述
    然后在path里添加两条 %JAVA_HOME%\bin%JAVA_HOME_JRE%\bin
    在这里插入图片描述
    classpath依旧为 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

    在这里插入图片描述
    到了这里就配置好了
    只要修改 JAVA_HOMEJAVA_HOME_JRE的值就随意切换版本了
    让我们来试试
    在这里插入图片描述
    先在版本是jdk8
    在cmd里面试试
    在这里插入图片描述
    在这里插入图片描述
    重点来了
    查看版本
    在这里插入图片描述
    切换版本试一试
    在这里插入图片描述
    切换完以后一定要按两次确定
    然后重启命令行
    在这里插入图片描述

    展开全文
  • https://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html  2、下载以后直接安装就行了 jdk是java的开发包,其中包括jre;jre仅仅是java的运行时环境;而JDK包括了同版本的JRE,...

    1、先去官网下载JDK

    https://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html

     2、下载以后直接安装就行了

    jdk是java的开发包,其中包括jre;jre仅仅是java的运行时环境;而JDK包括了同版本的JRE,此外还包括有编译器和其它工具

    3、环境变量配置

        环境变量的配置,是为了让电脑找到相应的运行文件,打开DOS命令窗口,电脑是先在当前目录找,找不到然后去系统配置的环境变量里找

    3.1先找到安装jdk的目录

    3.2进入bin目录复制这个路径

           3.3在我的电脑中打开属性

     

     刚刚复制的路径粘贴在那里

     

     完成之后一直点确定就行了

     

    3、关于JDK与JRE的认识

    关于jdk和jre

    大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做。因为这样更能帮助大家弄清楚它们的区别:

    Jre 是java runtime environment, 是java程序的运行环境。既然是运行,当然要包含jvm,也就是大家熟悉的虚拟机啦,还有所有java类库的class文件,都在lib目录下打包成了jar。大家可以自己验证。至于在windows上的虚拟机是哪个文件呢?学过MFC的都知道什么是dll文件吧,那么大家看看jre/bin/client里面是不是有一个jvm.dll呢?那就是虚拟机。

    Jdk 是java development kit,是java的开发工具包,里面包含了各种类库和工具。当然也包括了另外一个Jre. 那么为什么要包括另外一个Jre呢?而且jdk/jre/bin同时有client和server两个文件夹下都包含一个jvm.dll。说明是有两个虚拟机的。这一点不知道大家是否注意到了呢?

    相信大家都知道jdk的bin下有各种java程序需要用到的命令,与jre的bin目录最明显的区别就是jdk下才有javac,这一点很好理解,因为 jre只是一个运行环境而已。与开发无关,正因为如此,具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的 jvm, 而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。

    记得在环境变量path中设置jdk/bin路径麽?这应该是大家学习Java的第一步吧,老师会告诉大家不设置的话javac和java是用不了的。确实jdk/bin目录下包含了所有的命令。可是有没有人想过我们用的java命令并不是 jdk/bin目录下的而是jre/bin目录下的呢?不信可以做一个实验,大家可以把jdk/bin目录下的java.exe剪切到别的地方再运行 java程序,发现了什么?一切OK!

    那么有人会问了?我明明没有设置jre/bin目录到环境变量中啊?

    试想一下如果java为了提供给大多数人使用,他们是不需要jdk做开发的,只需要jre能让java程序跑起来就可以了,那么每个客户还需要手动去设置环境变量多麻烦啊?所以安装jre的时候安装程序自动帮你把jre的java.exe添加到了系统变量中,验证的方法很简单,大家看到了系统环境变量的 path最前面有“%SystemRoot%system32;%SystemRoot%;”这样的配置,那么再去Windows/system32下面去看看吧,发现了什么?有一个java.exe。

    如果强行能够把jdk/bin挪到system32变量前面,当然也可以迫使使用jdk/jre里面的java,不过除非有必要,我不建议大家这么做。使用单独的jre跑java程序也算是客户环境下的一种测试。

    ———————————————————————————————————————————


    通俗点来说: jdk是java的开发包,其中包括jre;jre仅仅是java的运行时环境;而JDK包括了同版本的JRE,此外还包括有编译器和其它工具

        JDK是java开发工具包(java Development Kit)的缩写。它是一种构建在java平台上发布的应用程序、apple和组件的开发环境。JDK是一切java应用程序的基础,所有的java应用程序是构建在这个之上的。它是一组API,也可以说是一些java Class。要成为一个Java程序员,JDK是必不可少的最基本的工具。

        JRE是Java运行环境(Java Runtime Enviroment)的缩写。它基本上就和Java虚拟机是同一个概念。一般来说,在谈论一个具体的产品的时候,可以说“JRE”,而说到理论中的一个模型的时候,我们常用的是“Java虚拟机”。要使用Java程序,JRE是必不可少的环境。

    如果机子里安装了多个版本的jdk,如下:

    BEA Weblogic Server 7.0 自带一套 JDK1.3.1_02
    下载了一套最新的JDK1.4.1_02
    JBuilder9自带一套JKD1.4.1_02
    Oracle8.1.7自带一套JRE1.1.7
    Ration Rose自带一套JDK1.3
    DreamWeaver自带一套JDK1.3

          6套JRE,每套JRE都被各自安装到不同的目录,不会互相影响。当在控制台执行java.exe,操作系统寻找JRE的方式如下:

    先找当前目录下有没有JRE
    再找父目录下有没有JRE
    接着在PATH路径中找JRE(一般运行时从path中查找,按照path设置前后顺序,以前面为准)
    注册表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的键值指向哪个JRE(一般XP下是这个:C:\Program Files\Java\jre6)

          最常用的是在PATH路径中找JRE,一般情况下,自己的程序运行之前都会先在批处理文件里面临时设置PATH,把自己用的JRE放到PATH路径最前面,所以肯定会运行自己带的JRE,不会造成版本混乱。

    ——————————————————————————————————————————————
    JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
    JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。
    如果安装了JDK,会发同你的电脑有两套JRE,一套位于 \jre 另外一套位于 C:\Program Files\Java\jre1.5.0_15 目录下,后面这套比前面那套少了Server端的Java虚拟机,不过直接将前面那套的Server端Java虚拟机复制过来就行了。而且在安装JDK可以选择是否安装这个位于 C:\Program Files\Java 目录下的JRE。如果你只安装JRE,而不是JDK,那么只会在 C:\Program Files\Java 目录下安装唯一的一套JRE。
    JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。所以当你装完JDK后,如果分别在硬盘上的两个不同地方安装了两套JRE,那么你可以想象你的电脑有两台虚拟的Java PC机,都具有运行Java程序的功能。所以我们可以说,只要你的电脑安装了JRE,就可以正确运行Java应用程序。
    1、为什么Sun要让JDK安装两套相同的JRE?
    这是因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在 \lib\tools.jar 里。从下面例子可以看出,先将tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 这个意思是说,你输入javac.exe与输入 java -cp c:\jdk\lib\tools.jar com.sun.tools.javac.Main 是一样的,会得到相同的结果。从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。而且可以发现\lib目录下的程序都很小,不大于2 9K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行,所以位于C:\Program Files\Java目录下的那套JRE就是用来运行一般Java程序用的。
    2、如果一台电脑安装两套以上的JRE,谁来决定呢?
    这个重大任务就落在java.exe身上。Java.exe的工作就是找到合适的JRE来运行Java程序。 Java.exe依照底下的顺序来查找JRE:自己的目录下有没有JRE;父目录有没有JRE;查询注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。

    ADD:(小小结)
    1.JVM -- java virtual machineJVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。2.JRE -- java runtime environmentJRE是指java运行环境。光有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就可以运行你写程序了。(jre里有运行.class的java.exe)3.JDK -- java development kitJDK是java开发工具包,基本上每个学java的人都会先在机器上装一个JDK,那他都包含哪几部分呢?让我们看一下JDK的安装目录。在目录下面有六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的是以下四个文件夹:bin、include、lib、 jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE包含JVM。bin:最主要的是编译器(javac.exe)include:java和JVM交互用的头文件lib:类库jre:java运行环境(注意:这里的bin、lib文件夹和jre里的bin、lib是不同的)总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。
    eclipse、idea等其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你选中jre路径就ok了。

    jre与jdk转自http://ihyperwin.iteye.com/blog/1513754

    展开全文
  • jdk9、jdk10、jdk11、jdk12、jdk13新特性

    万次阅读 多人点赞 2019-10-28 09:03:22
    我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的所有新特性,因此9和10估计就直接被废弃啦。...

    我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的所有新特性,因此9和10估计就直接被废弃啦。不过9、10、11、12面向开发者的新特性其实并不是很多,大部分都是一些优化、收集器加强以及增加了一些新功能等等

    而我们开发人员最为关注的肯定是对我们搬砖有用的特性,虽然可能还用不太上,但这边还是先记录一下从jdk9-12的新特性:

     

    jdk9新特性


    1、集合加强

    jdk9为所有集合(List/Set/Map)都增加了of和copyOf方法,用来创建不可变集合,即一旦创建就无法再执行添加、删除、替换、排序等操作,否则将报java.lang.UnsupportedOperationException异常。一般在特定场景下用还是可以的,不过如果引用了guava库的话推荐还是使用guava把hhhh,例子如下:

        List strs = List.of("Hello", "World");
     
        List strsCopy = List. copyOf(strs);
     
        Set strs = Set.of("Hello", "World");
     
        Map maps = Map.of("Hello", 1, "World", 2);


    2、私有接口方法

    jdk8提供了接口的默认方法(default)和静态方法,打破了之前接口只能定义方法而不能存在行为。jdk9则是允许接口定义私有方法,私有方法可以作为通用方法放在默认方法中调用,不过实际中并无多大用处,至少对我来说。

    3、垃圾收集机制

    jdk9把G1作为默认的垃圾收集器实现,替换了jdk7和jdk8的默认垃圾收集器实现:Parallel Scavenge(新生代)+Parallel Old(老年代)。

    4、I/O流加强

    java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据:

    readAllBytes:读取 InputStream 中的所有剩余字节

    readNBytes: 从 InputStream 中读取指定数量的字节到数组中

    transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中 

    5、JShell工具

    jdk9引入了jshell这个交互性工具,让Java也可以像脚本语言一样来运行,可以从控制台启动 jshell ,在 jshell 中直接输入表达式并查看其执行结果。当需要测试一个方法的运行效果,或是快速的对表达式进行求值时,jshell 都非常实用。举个例子:

     

    jdk10新特性


    1、局部变量类型推断

    局部变量类型推断可以说是jdk10中最值得注意的特性,这是Java语言开发人员为了简化Java应用程序的编写而采取的又一步,举个例子:

    原先我们需要这么定义一个list

    List<String> list = new ArrayList<>();
    使用局部类型推断var关键词定义

    var list = new ArrayList<String>();
    不过局部变量类型推断仅仅适用在:

    有初始化值的局部变量

    增强 for 循环中的索引

    传统 for 循环中声明的局部变量

    Oracle 的 Java 团队申明,以下不支持局部变量类型推断:

    方法参数

    构造函数参数

    方法返回类型

    字段

    catch 代码块(或任何其他类型的变量声明)

    2、线程本地握手

    jdk10将引入一种在线程上执行回调的新方法,因此这将会很方便能停止单个线程而不是停止全部线程或者一个都不停。说实话并不是很懂是什么意思...

    3、GC改进和内存管理

    jdk10中有2个JEP专门用于改进当前的垃圾收集元素。

    第一个垃圾收集器接口是(JEP 304),它将引入一个纯净的垃圾收集器接口,以帮助改进不同垃圾收集器的源代码隔离。

    预定用于Java 10的第二个JEP是针对G1的并行完全GC(JEP 307),其重点在于通过完全GC并行来改善G1最坏情况的等待时间。G1是Java 9中的默认GC,并且此JEP的目标是使G1平行。

     

    jdk11新特性


    1、字符串加强

    // 判断字符串是否为空白
    " ".isBlank(); // true
    // 去除首尾空格
    " Javastack ".strip(); // "Javastack"
    // 去除尾部空格 
    " Javastack ".stripTrailing(); 
    // 去除首部空格 
    " Javastack ".stripLeading(); // "Javastack "
    // 复制字符串
    "Java".repeat(3); // "JavaJavaJava"
    // 行数统计
    "A\nB\nC".lines().count(); // 3


    2、HttClient Api

    这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在java.net包中找到这个 Api

    3、用于 Lambda 参数的局部变量语法

    用于 Lambda 参数的局部变量语法简单来说就是支持类型推导:

    var x = new A();
     
    for (var x : xs) { ... }
     
    try (var x = ...) { ... } catch ...


    4、ZGC

    从JDK 9开始,JDK使用G1作为默认的垃圾回收器。G1可以说是GC的一个里程碑,G1之前的GC回收,还是基于固定的内存区域,而G1采用了一种“细粒度”的内存管理策略,不在固定的区分内存区域属于surviors、eden、old,而我们不需要再去对于年轻代使用一种回收策略,老年代使用一种回收策略,取而代之的是一种整体的内存回收策略。这种回收策略在我们当下cpu、内存、服务规模都越来越大的情况下提供了更好的表现,而这一代ZGC更是有了突破性的进步。

    从原理上来理解,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行,一般而言,主要有如下几种方式优化"Stop the world":

    使用多个线程同时回收(并行回收)
    回收过程分为多次停顿(增量回收)
    在程序运行期间回收,不需要停顿或只停顿很短时间(并发回收)
    只回收内存而不整理内存
    ZGC主要采用的是并发回收的策略,相较于G1 ZGC最主要的提升是使用Load Barrier技术实现,引用R大对于ZGC的评价:

    与标记对象的传统算法相比,ZGC在指针上做标记,在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的Stop The World。

     

    jdk12新特性


    1、Switch Expressions

    这是一个为开发者准备的特性,我们可以利用具体代码快速了解一下,下面是传统 statement 形式的 switch 语法:

    switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
    System.out.println(6);
    break;
    case TUESDAY:
    System.out.println(7);
    break;
    case THURSDAY:
    case SATURDAY:
    System.out.println(8);
    break;
    case WEDNESDAY:
    System.out.println(9);
    break;
    }
    如果有编码经验,你一定知道,switch 语句如果漏写了一个 break,那么逻辑往往就跑偏了,这种方式既繁琐,又容易出错。如果换成 switch 表达式,Pattern Matching 机制能够自然地保证只有单一路径会被执行,请看下面的代码示例:

    switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY -> System.out.println(7);
    case THURSDAY, SATURDAY -> System.out.println(8);
    case WEDNESDAY -> System.out.println(9);
    }
    更进一步,下面的表达式,为我们提供了优雅地表达特定场合计算逻辑的方式

    int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
    };
    Switch Expressions 或者说起相关的 Pattern Matching 特性,为我们提供了勾勒出了 Java 语法进化的一个趋势,将开发者从复杂繁琐的低层次抽象中逐渐解放出来,以更高层次更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。

    2、Shenandoah GC

    新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200 MB 还是 200 GB,都将具有相同的暂停时间。


    JDK13新特性

    JDK13于9月17日正式发布。目前该版本包含的特性已经全部固定,主要包含以下五个:
    在这里插入图片描述

    下面来逐一介绍下这五个重要的特性。

    Dynamic CDS Archives

    这一特性是在JEP310:Application Class-Data Sharing基础上扩展而来的,Dynamic CDS Archives中的CDS指的就是Class-Data Sharing。

    那么,这个JEP310是个啥东西呢?

    我们知道在同一个物理机/虚拟机上启动多个JVM时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内存占用是比较高的。所以Java团队引入了CDS的概念,通过把一些核心类在每个JVM间共享,每个JVM只需要装载自己的应用类,启动时间减少了,另外核心类是共享的,所以JVM的内存占用也减少了。

    CDS 只能作用于 Boot Class Loader 加载的类,不能作用于 App Class Loader 或者自定义的 Class Loader 加载的类。

    在 Java 10 中,则将 CDS 扩展为 AppCDS,顾名思义,AppCDS 不止能够作用于 Boot Class Loader了,App Class Loader 和自定义的 Class Loader 也都能够起作用,大大加大了 CDS 的适用范围。也就说开发自定义的类也可以装载给多个JVM共享了。

    Java 10中包含的JEP310的通过跨不同Java进程共享公共类元数据来减少了内存占用和改进了启动时间。

    但是,JEP310中,使用AppCDS的过程还是比较复杂的,需要有三个步骤:
    在这里插入图片描述
    这一次的JDK 13中的JEP 350 ,在JEP310的基础上,又做了一些扩展。允许在Java应用程序执行结束时动态归档类,归档类将包括默认的基础层 CDS(class data-sharing)存档中不存在的所有已加载的应用程序类和库类。

    也就是说,在Java 13中再使用AppCDS的时候,就不在需要这么复杂了。

    ZGC: Uncommit Unused Memory

    在讨论这个问题之前,想先问一个问题,JVM的GC释放的内存会还给操作系统吗?

    GC后的内存如何处置,其实是取决于不同的垃圾回收器的。因为把内存还给OS,意味着要调整JVM的堆大小,这个过程是比较耗费资源的。

    在JDK 11中,Java引入了ZGC,这是一款可伸缩的低延迟垃圾收集器,但是当时只是实验性的。并且,ZGC释放的内存是不会还给操作系统的。

    在这里插入图片描述

    而在Java 13中,JEP 351再次对ZGC做了增强,本次 ZGC 可以将未使用的堆内存返回给操作系统。之所以引入这个特性,是因为如今有很多场景中内存是比较昂贵的资源,在以下情况中,将内存还给操作系统还是很有必要的:

    1、那些需要根据使用量付费的容器

    2、应用程序可能长时间处于空闲状态并与许多其他应用程序共享或竞争资源的环境。

    3、应用程序在执行期间可能有非常不同的堆空间需求。例如,启动期间所需的堆可能大于稍后在稳定状态执行期间所需的堆。

    Reimplement the Legacy Socket API

    使用易于维护和调试的更简单、更现代的实现替换 java.net.Socket 和 java.net.ServerSocket API。

    java.net.Socket和java.net.ServerSocket的实现非常古老,这个JEP为它们引入了一个现代的实现。现代实现是Java 13中的默认实现,但是旧的实现还没有删除,可以通过设置系统属性jdk.net.usePlainSocketImpl来使用它们。

    运行一个实例化Socket和ServerSocket的类将显示这个调试输出。这是默认的(新的).

    在这里插入图片描述
    上面输出的sun.nio.ch.NioSocketImpl就是新提供的实现。

    如果使用旧的实现也是可以的(指定参数jdk.net.usePlainSocketImpl):

    在这里插入图片描述
    上面的结果中,旧的实现java.net.PlainSocketImpl被用到了。

    Switch Expressions (Preview)

    在JDK 12中引入了Switch表达式作为预览特性。JEP 354修改了这个特性,它引入了yield语句,用于返回值。这意味着,switch表达式(返回值)应该使用yield, switch语句(不返回值)应该使用break。

    在以前,我们想要在switch中返回内容,还是比较麻烦的,一般语法如下:

    在这里插入图片描述
    在JDK13中使用以下语法:

    在这里插入图片描述
    或者
    在这里插入图片描述
    在这之后,switch中就多了一个关键字用于跳出switch块了,那就是yield,他用于返回一个值。和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。

    Text Blocks (Preview)

    在JDK 12中引入了Raw String Literals特性,但在发布之前就放弃了。这个JEP在引入多行字符串文字(text block)在意义上是类似的。

    text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。

    我们以前从外部copy一段文本串到Java中,会被自动转义,如有一段以下字符串:

    在这里插入图片描述
    将其复制到Java的字符串中,会展示成以下内容:

    在这里插入图片描述

    使用“”“作为文本块的开始符合结束符,在其中就可以放置多行的字符串,不需要进行任何转义。看起来就十分清爽了。

    如常见的SQL语句:

    在这里插入图片描述
    看起来就比较直观,清爽了。

     

    JDK13中包含的5个特性,能够改变开发者的编码风格的主要有Text Blocks和Switch Expressions两个新特性,但是这两个特性还处于预览阶段。

    而且,JDK13并不是LTS(长期支持)版本,如果你正在使用Java 8(LTS)或者Java 11(LTS),暂时可以不必升级到Java 13.

    展开全文
  • jdk8,jdk10,jdk12新特性

    千次阅读 2019-05-26 21:58:28
    jdk8: 1.Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法 2. Lambda 表达式:(例如: (x, y) -> { return x + y; } ;λ表达式有三部分组成...jdk10: 1....

    jdk8:

    1.Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法
    2. Lambda 表达式:(例如: (x, y) -> { return x + y; } ;λ表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。)
    3. hashmap和currenthashmap的红黑树以及cas

    jdk10:

    1.局部变量类型推断:var
    2. 线程本地握手
    JDK 10将引入一种在线程上执行回调的新方法,因此这将会很方便能停止单个线程而不是停止全部线程或者一个都不停。
    3. 备用内存设备上的堆分配
    允许HotSpot VM在备用内存设备上分配Java对象堆内存,该内存设备将由用户指定。
    5. 其他Unicode语言 - 标记扩展
    目标是增强java.util.Locale及其相关的API,以便实现语言标记语法的其他Unicode扩展(BCP 47)。
    6. 基于Java的实验性JIT编译器
    Oracle希望将其Java JIT编译器Graal用作Linux / x64平台上的实验性JIT编译器。
    7. 根证书
    这个的目标是在Oracle的Java SE中开源根证书。
    8. 根证书颁发认证
    这将使OpenJDK对开发人员更具吸引力,它还旨在减少OpenJDK和Oracle JDK构建之间的差异。
    9. 将JDK生态整合单个存储库
    此JEP的主要目标是执行一些内存管理,并将JDK生态的众多存储库组合到一个存储库中。
    10. 删除工具javah
    从JDK中移除了javah工具,这个很简单并且很重要。

    jdk12:

    1.新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。
    2.扩展了 switch 语句,使其不仅可以作为语句,还可以作为表达式
    3.针对 64 位平台,使用默认类列表增强 JDK 构建过程以生成类数据共享档。
    4.如果 G1 Mixed GC 存在超出暂停目标的可能性,则使其可中止。
    5.增强 G1 GC,在空闲时自动将 Java 堆内存返回给操作系统。

    展开全文
  • 笔者就以JDK10作为介绍,其他正常的JDK版本的配置也是一样的。这里使用JDK10 只是为了作一个通用的示范,使得大家举一反三。后面会贴出其他版本的配置信息。供大家拷贝粘贴。知道大家开发项目就是为了快速解决问题。 ...
  • JDK环境变量的两种配置方法——以JDK8和JDK10为例 相信很多刚接触java的小伙伴肯定会遇到很多棘手的问题,本文就JDK的安装、环境变量的配置以及常遇到的问题做了一个系统的全面的介绍,当然也方便自己失忆以后的...
  • 笔者就以JDK10作为介绍,其他正常的JDK版本的配置也是一样的。这里使用JDK10 只是为了作一个通用的示范,使得大家举一反三。后面会贴出其他版本的配置信息。供大家拷贝粘贴。知道大家开发项目就是为了快速解决问题。 ...
  • 这两天看到JDK10的发布,感觉Oracle的发布周期缩短了这么久,JDK9何去何留?经查Oracle的发布周期缩短,即以后每半年一个版本即目前2018年3月份,JDK10,2018年9月份,可能会有新的版本,有很高概率是JDK11,并且,...
  • jdk10安装及环境变量配置

    千次阅读 2018-04-05 17:31:44
    下载安装jdk10 首先,你需要安装jdk10,如果已经安装,请看下一步。 官网下载: http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html 下载完成后双击exe文件开始安装; ...
  • 我是jdk10的环境,先安装jdk1.8。 修改javahome不细说了。 关键是找到C:\Program Files (x86)\Common Files\Oracle\Java\javapath下面的三个文件java.exe javaw.exe javaws.exe,替换文件在jdk1.8的bin目录下面的 ...
  • 安装Android SDK时无法识别JDK 10

    千次阅读 2018-07-01 11:14:32
    解决方法一:将jdk 10换成jdk 1.8,问题解决;解决方法二:保留jdk 10,还在尝试。
  • 这Maven 教程:IDEA开发环境中maven 项目配置JDK9,JDK10,JDK11,JDK12..等EA版本的配置方法 系列教程一 这里我们思考我们上一个配置方式的问题。 首先我们需要修改JAVA_HOME配置,有些人会说,可以不用。但是...
  • JDK10安装与配置

    千次阅读 2018-03-23 17:30:36
    JDK10安装教程1.下载jdk10搜索jdk官网(网址)选择JAVASE Downloads DOWNLOAD2.点击同意 选择window下载3.配置环境变量3.1按官方文档环境变量配置:发现环境变量变得精减许多3.2点击我的电脑 属性 3.2点击 高级系统...
  • 在我们还在用jdk7的时候,jdk一言不合的就已经升级到jdk13了,还有一些年代久远的祖传项目甚至还在用jdk5,jdk6的,所以我决定是时候写一点文章来专门的总结一下jdk升级后的特性,来方便大家要不要使用新版本的jdk,...
  • jdk10缺少javah编译jni

    千次阅读 2018-08-09 00:26:03
    jdk10删除javah组件如何编译jni的问题,在jdk9时javac便提供了编译java native方法自动生成头文件的功能,用以代替javah。在jdk10中javah工具被移除。 详细信息可以查看javac的命令帮助,windows下使用java /? ...
  • publicinterface MyInterface { voidnormalInterfaceMethod(); default void interfaceMethodWithDefault() { init(); } default void anotherDefaultMethod() { init(); } This method is not part of the ...
  • jdk10想要降到jdk1.8,降级失败

    千次阅读 2019-07-18 14:12:10
    之前jdk使用的是jdk10.0,之后想要降级到jdk1.8. 修改了JAVA_HOME等环境变量,但是使用java -version显示的依旧是jdk10.0. 在这种情况下需要找到C:\Program Files (x86)\Common Files\Oracle\Java\javapath这个...
  • 相信大家都有用JDBC连接数据库操作吧,这样来的更直观,在jdk1.9以前ext是非常实用的我们通常连接数据库Sqlserver需要下载两个驱动包,将这两个包放在jre\lib\ext目录下,这样才引入了这个包,但是在jdk1.9以后你会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,498,988
精华内容 599,595
关键字:

jdk10