从Java SE 9 +的主要版本开始,每个新的6个月的JDK发布意味着,编程语言和虚拟机正在快速前进,以应对新技术创新的速率。自9以来的每一个版本,到Java SE 12,都包含了一系列更改、更多的库添加、新的语言特性以及JDK清理过程的更改。下面重点关注JDK11,12中,新的类、安全特性、HTTP Client和每个开发人员都应该知道的非编译代码启动技术.
下面是最重要的更新。用两个主要部分构建了本文:
- 所有开发人员都能看到的特性(这些特性非常有用,你会想知道怎么用它们编码)
- 其他一切(JDK底层的更新)
一、新功能
把Java SE 11和12中的新特性分为两类:API和方法,以及语言特征。如没专门标注只适用于jdk12,下面更新适用于jdk11.
API和方法主要包含以下五大块更新:
字符串家族类
IO/NIO类
Streams和Optional类
实用程序类
安全相关类更改
1. 字符串族类
java.lang.character字符
character类有一个新方法:StringtoString(int);。它是字符串类中现有方法的重载,但它采用int-unicode而不是char。
java.lang.charsequence字符序列
charsequence类有一个新方法:int compare(charsequence,charsequence);。它按字典方式比较两个CharSequence实例,如果第一个序列在字典方式上分别小于、等于或大于第二个序列,则返回负值、零或正值。
java.lang.StringBuffer和StringBuilder
java.lang.StringBuffer和StringBuilder类有一个新方法:compareto();。它的行为与CharSequence的上一个compare()方法完全相同,但分别以StringBuffer/StringBuilder作为参数。
java.text.NumberFormat格式
NumberFormat,它增加了对以压缩形式格式化数字的支持。
压缩数字格式是指以短格式或人可读的形式表示数字。例如,在en-us语言环境中,1000可以格式化为“1K”,1000000可以格式化为“1M”,这取决于所使用的样式(由NumberFormat.style指定)。它在Unicode本地数据标记语言规范中定义。
实例:
NumberFormat
.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT)
.format(10000)
结果为: "10K"
java.lang.String
这个类是JDK11中新API最重要的亮点之一。这里有几个新的方法在编程中很有用:
String repeat(int);
"no ".repeat(14).trim().concat(", Batman!")
$1 ==> "no nonononononononononononono, Batman!"
boolean isBlank();
String strip();
类似于trim(),但是可以清除一些特殊的空格,比如:一个特殊的Unicode空格字符结束。
Character.isWhitespace('\u2005')
$6 ==> true
Stream lines():
字段串有换行符分隔的话,可以返回一个字符串流,如:
"\nOne\nTwo\nThree\nFour".lines().forEach(System.out::println)
One
Two
Three
Four
2. IO/NIO类
添加到处理文件和任输入/输出通道类中的新方法:
java.io.ByteArrayOutputStream
java.io.FileReader/java.io.FileWriter
java.io.InputStream/OutputStream/Reader/Writer
java.nio.ByteBuffer/CharBuffer/DoubleBuffer/LongBuffer/ShortBuffer
java.nio.channels.SelectionKey
java.nio.channels.Selector
java.nio.file.Path
java.nio.file.Files
java.io.ByteArrayOutputStream
java.io.bytearrayOutputStream有一个新方法void writeBytes(byte[]),它一次将参数的所有字节写入输出流。
java.io.FileReader and java.io.FileWriter
java.io.filereader类有两个新的构造函数,java.io.filewriter有四个新的构造函数,允许指定字符集。
java.io.InputStream/OutputStream/Reader/Writer
每个java.io.inputstream/outputstream/reader/writer类都有一个新方法,分别是inputstreamNullOutputstream()、outputstreamNullOutputstream()、readerNullReader()和writerNullWriter();它不读取或写入字节。
当您第一次看到这些方法时,您可能会想知道它们的用途是什么?您可以将它们想象为/dev/null,用于丢弃不需要的输出,或者提供始终返回零字节的输入。
java.nio.ByteBuffer/CharBuffer/DoubleBuffer/LongBuffer/ShortBuffer
java.nio.bytebuffer/charbuffer/doublebuffer/longbuffer/shortbuffer类现在有一个mismatch()方法,用于查找并返回此缓冲区与给定缓冲区之间第一个不匹配的相对index。
java.nio.channels.SelectionKey
java.nio.channels.selectionkey类有两个新方法:interestOpsAnd(int)和interestOpsOr(int);。第一个方法原子地将此Key的注册集设置为现有注册集和给定值的位交集,而第二个方法原子地将此键的注册集设置为现有注册集和给定值的位并集。
待续...
总结
从Java SE 11开始,在Java历史上第一次,您可以直接执行包含Java代码的脚本而不需要编译。Java 11源执行特性使得可以在Java中编写脚本并直接从命令行执行脚本。
JDK11是JDK的最新LTS版本(由Oracle定义,其他人都遵循)。尽管没有大量以开发人员为中心的特性,但在JVM中还有很多正在深入研究的特性,可能为将来更突出的特性奠定了基础。
欢迎关注公众号:“架构一线”,定期分享一些实战心得,互联网前沿技术等.