前置文章回顾:
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().count();
返回的是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源程序。
如下位置
jdk11就有的新特性
使用java直接执行java文件的约束
①会以第一个类作为主方法的入口,也就是说第一个类要有main方法
②不可以使用外部文件定义的.java
源文件定义的类
透过本质,猜测使用的是jshell执行源文件,相当于将源文件的代码读取出来放到jshell
执行
新特性四:Epsilon垃圾收集器(不回收内存,只分配内存
)
Epsilon
只进行内存分配但不实现回收的GC
,当堆内存被用完,JVM就会退出。
Epsilon
有什么作用?
- 做性能测试 (可以过滤GC引起的性能假象,默认的GC会自带回收垃圾!)
- 内存压力测试 ()
新特性五:ZGC垃圾收集器(STW延迟的时间<=10ms
)
- ZGC处理的位数时
64 bit= 8 byte
,之前的GC是62 bit =4 byte
- 吞吐量影响率小于15%
- 因为ZGC多了
4byte
长度空间,指令就会更多,后面版本的ZGC有更多的功能