本文主要整理自己觉得相对比较重要的一些版本区别。
1.自动装箱与拆箱:原始类型与对应的包装类不用显式转换
ArrayList list=new ArrayList()----------->ArrayList<Integer>list=new ArrayList<Integer>();
2.静态导入:通过使用 import static,就可以不用指定 Constants 类名而直接使用静态成员,包括静态方法。
Math.sqrt();----------->sqrt();
3.For-Each循环:For-Each循环得加入简化了集合的遍历。
for(i=0;i{......}----------->for(int i:a){......}
4.泛型:可以指定集合的元素类型。
ArrayList list=new ArrayList()----------->ArrayList<Integer>list=new ArrayList<Integer>();
5.变长参数:有任意个参数,看作数组。
int sum(int ...intlist)
1.使用Compiler API
2.轻量级Http Server API
1.switch中可以使用字符串
String s = ...
switch(s) {
case "quux":
processQuux(s);
// fall-through
case "foo":
case "bar":
processFooOrBar(s);
break;
case "baz":
processBaz(s);
// fall-through
default:
processDefault(s);
break;
}
- 对集合类的语言支持:Java将包含对创建集合类的第一类语言支持。这意味着集合类的创建可以像Ruby和Perl那样了(下面的这些集合是不可变的)。
原本需要这样:
List list = new ArrayList();
list.add("item");
String item = list.get(0);
Set set = new HashSet();
set.add("item");
Map map = new HashMap();
map.put("key", 1);
int value = map.get("key");
现在你可以这样:
List list = ["item"];
String item = list[0];
Set set = {"item"};
Map map = {"key" : 1};
int value = map["key"];
1.HashMap中的红黑树:HashMap中链长度大于8时采取红黑树的结构存储。
红黑树,除了添加的情况外,其他时候效率高于链表结构。
2.ConcurrentHashMap:底层采用node数组+链表+红黑树的存储结构,通过CAS算法(乐观锁机制)+synchronized来保证并发安全的实现。
put()方法过程:
1) 根据key的hash值数组中相应位置的Node还未初始化,则通过CAS插入相应的数据;
2) 如果相应位置的Node不为空,且当前该节点不处于移动状态,则对该节点加synchronized锁,如果该节点的hash不小于0,则遍历链表更新节点或插入新节点;
3) 如果该节点是TreeBin类型的节点,说明是红黑树结构,则通过putTreeVal方法往红黑树中插入节点;
3.接口中可以有默认方法与静态方法,也就是接口中可以有实现方法
默认方法中的default不可省略,子类重写时候,必须去掉default修饰符
4.Lambda表达式:lambda表达式的使用简化了代码。
1.在1.8的基础上又增加了私有方法和私有静态方法(1.8首次计划实现接口的私有方法,却是在1.9中实现)。
2.模块化系统:模块化是一个很通用的概念。在软件中,模块化可以运用到编写和实现一个程序和计算系统,他们都是作为独立的模块,而不是作为一个单一的和完整的设计。
3.JShell–Java 9 REPL:REPL是一种快速运行语句的命令行工具。
4.集合工厂方法:1.9引入了一些有用的工厂方法来创建不可修改的集合。
5.G1是Java 9中的默认GC
1.局部变量类型推断:局部变量类型推断将引入"var"关键字,也就是你可以随意定义变量而不必指定变量的类型.
原本需要这样:
List list = new ArrayList ();
Stream stream = getStream();
现在你可以这样:
var list = new ArrayList ();
var stream = getStream();
说到类型推断,从JDK 5引进泛型,到JDK 7的"<>"操作符允许不绑定类型而初始化List,再到JDK 8的Lambda表达式,再到现在JDK 10的局部变量类型推断,Java类型推断正大刀阔斧的向前发展。
2.GC改进和内存管理
JDK 10中有2个JEP专门用于改进当前的垃圾收集元素。
第一个垃圾收集器接口是(JEP 304),它将引入一个纯净的垃圾收集器接口,以帮助改进不同垃圾收集器的源代码隔离。
预定用于Java 10的第二个JEP是针对G1的并行完全GC(JEP 307),其重点在于通过完全GC并行来改善G1最坏情况的等待时间。G1是Java 9中的默认GC,并且此JEP的目标是使G1平行。
3.线程本地握手(JEP 312)
JDK 10将引入一种在线程上执行回调的新方法,因此这将会很方便能停止单个线程而不是停止全部线程或者一个都不停。
4.备用内存设备上的堆分配(JEP 316)
允许HotSpot VM在备用内存设备上分配Java对象堆内存,该内存设备将由用户指定。
5.其他Unicode语言 - 标记扩展(JEP 314)
目标是增强java.util.Locale及其相关的API,以便实现语言标记语法的其他Unicode扩展(BCP 47)。
6.基于Java的实验性JIT编译器
Oracle希望将其Java JIT编译器Graal用作Linux / x64平台上的实验性JIT编译器。
7.根证书(JEP 319)
这个的目标是在Oracle的Java SE中开源根证书。
8.根证书颁发认证(CA)
这将使OpenJDK对开发人员更具吸引力,它还旨在减少OpenJDK和Oracle JDK构建之间的差异。
9.将JDK生态整合单个存储库(JEP 296)
此JEP的主要目标是执行一些内存管理,并将JDK生态的众多存储库组合到一个存储库中。
10.删除工具javah(JEP 313)
从JDK中移除了javah工具,这个很简单并且很重要。