java10-11新特性—-大总结–建议收藏、点赞、关注 三连

时间:2020-9-1 作者:admin


前置文章回顾:

java8新特性—大总结–建议收藏、点赞、加关注!!!
java9新特性—-大总结–建议收藏、点赞、关注 三连


java 9 和 java 10两个版本的生命周期很短
java 10是2018年3月发布的,才经过6个月java11就发布了
2014年发布的java 8,2018年9月发布java 11


java11是一个LTS版本(Long-term support)因此也是一个很重要的版本。

新特性一:类型推断var

var的主要作用是可以使用在lambda表达式上,当然也可以是用在局部变量中。

主要使用在lambda表达式上通过注解可以校验类型是否符合注解规则

Consumer<String> consumer= (@Deprecated var a)->a.toUpperCase();
consumer.accept("abcdef");

下面是错误的用法,会报错
因为注解需要有一个类型,相当于底层给你转换了一下。

Consumer<String> consumer= (@Deprecated a)->a.toUpperCase();//错误的写法
consumer.accept("abcdef");

新特性二:新增字符串方法

源码:
isBlank()判断字符串是否全为空白(空格、tab、换行等)

public boolean isBlank() {
    return indexOfNonWhitespace() == length();
}

strip()去除字符串首尾的空白,与trim()不同的是,trim()只能去除ASCII码小于32的字符,这种方式有明显的缺点(例如中文全角空格就不能去除),而strip()可以去除所有语言中的空白字符,因此建议使用strip()字符代替原先的trim()
源码:

public String strip() {
    String ret = isLatin1() ? StringLatin1.strip(value)
                            : StringUTF16.strip(value);
    return ret == null ? this : ret;
}

stripLeading()去除首部的空白,和strip()一样可以去除中文的空白
源码:

public String stripLeading() {
    String ret = isLatin1() ? StringLatin1.stripLeading(value)
                            : StringUTF16.stripLeading(value);
    return ret == null ? this : ret;
}

stripTrailing()去除尾部的空白,和前面一样的设计可以去除任意语言的空白
源码:

public String stripTrailing() {
    String ret = isLatin1() ? StringLatin1.stripTrailing(value)
                            : StringUTF16.stripTrailing(value);
    return ret == null ? this : ret;
}

repeat()复制字符串,可以将字符串复制,例如"java".repeat(3);得到的是"javajavajava"字符串
源码:

public String repeat(int count) {
    if (count < 0) {
        throw new IllegalArgumentException("count is negative: " + count);
    }
    if (count == 1) {
        return this;
    }
    final int len = value.length;
    if (len == 0 || count == 0) {
        return "";
    }
    if (len == 1) {
        final byte[] single = new byte[count];
        Arrays.fill(single, value[0]);
        return new String(single, coder);
    }
    if (Integer.MAX_VALUE / count < len) {
        throw new OutOfMemoryError("Repeating " + len + " bytes String " + count +
                " times will produce a String exceeding maximum size.");
    }
    final int limit = len * count;
    final byte[] multiple = new byte[limit];
    System.arraycopy(value, 0, multiple, 0, len);
    int copied = len;
    for (; copied < limit - copied; copied <<= 1) {
        System.arraycopy(multiple, 0, multiple, copied, copied);
    }
    System.arraycopy(multiple, 0, multiple, copied, limit - copied);
    return new String(multiple, coder);
}

lines()行数统计,注意这里返回的是一个流,因此之前java8中的Stream操作你懂的!骚操作。

行数统计案例①:"A\nB\nC\n".lines().cpunt();返回的是3
源码:

public Stream<String> lines() {
    return isLatin1() ? StringLatin1.lines(value) : StringUTF16.lines(value);
}

lines案例②:利用了java9中的try()流会自动关闭,并且通过获取流,在控制台中打印了文件内容

try(FileInputStream fis=new FileInputStream("文件路径")){
    byte[] buffer=new byte[fis.available()];
    fis.read(buffer);
    String s = new String(buffer);
    s.lines().forEach(System.out::println);//调用字符串新增的方法,使用Stream流进行打印字符串
} catch (IOException e) {
    e.printStackTrace();
}

新特性三:可以直接通过java执行.java文件不需要javac编译

jdk11可以不需要javac编译java文件然后再通过java命令执行,可以直接java命令执行java源程序。
如下位置
java10-11新特性----大总结--建议收藏、点赞、关注 三连
jdk11就有的新特性
java10-11新特性----大总结--建议收藏、点赞、关注 三连
使用java直接执行java文件的约束
①会以第一个类作为主方法的入口,也就是说第一个类要有main方法
②不可以使用外部文件定义的.java源文件定义的类


透过本质,猜测使用的是jshell执行源文件,相当于将源文件的代码读取出来放到jshell执行


新特性四:Epsilon垃圾收集器(不回收内存,只分配内存)

Epsilon只进行内存分配但不实现回收的GC,当堆内存被用完,JVM就会退出。

Epsilon有什么作用?

  1. 做性能测试 (可以过滤GC引起的性能假象,默认的GC会自带回收垃圾!)
  2. 内存压力测试 ()

新特性五:ZGC垃圾收集器(STW延迟的时间<=10ms)

  • ZGC处理的位数时64 bit= 8 byte,之前的GC是62 bit =4 byte
  • 吞吐量影响率小于15%
  • 因为ZGC多了4byte长度空间,指令就会更多,后面版本的ZGC有更多的功能
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。