JDK 7
泛型类型推断
什么是类型推断
JDK 7 以前的泛型使用:
Map<String, String> myMap = new HashMap<String, String>();
在变量声明和赋值时,两侧都要加上泛型类型。
JDK 7 以后:
Map<String, String> myMap = new HashMap<>();
编译器会根据变量声明时的泛型类型自动推断出实例化时的泛型类型。
Switch语句支持String
之前为什么不支持?Switch语句实现原理?支持String的实现原理?
Switch语句实现原理
支持String的实现原理
编译后还是使用switch(int)结构来实现,将String的比较转换成hashCode和equals方法的比较。利用String的hashCode方法,返回的int值进行判断。
注意:String的hashCode方法可能有哈希冲突,所以每个case条件还加了equals判断,避免哈希冲突。
invokedynamic指令
通过invokedynamic指令生成目标对象
ForkJoinTask
Fork/Join利用多线程技术去执行大任务,将任务拆分成小任务执行。
任务:
通过继承RecursiveTask
或RecursiveAction
来实现任务。
RecursiveTask
:compute方法执行任务,有返回值RecursiveAction
:compute方法执行任务,无返回值
执行:
通过ForkJoinPool
线程池执行任务:Fork创建子线程,子线程将父线程任务进行分片,每个子线程都从父线程分配一定工作量。子线程任务执行完成后,通过Join方法将计算结果返回给父线程。
定义了 volatile int status 四个状态变量
- NORMAL -1
- CANCELLED -2
- EXCEPTIONAL -3
- SIGNAL 1
为什么定义了4个与exceptionTable相关的变量?
两个核心方法fork和join方法。
invokeAll
fork
添加任务pushTask
join
获取结果getRawResult
ForkJoinPool
执行ForkJoinTask任务的线程池,就任务提交到这个线程池中,调用invoke方法执行。实现了工作窃取。
核心invoke方法<T> T invoke(ForkJoinTask<T> task)
还有一个RecursiveTask继承了ForkJoinTask
核心compute方法,模板模式由具体子类实现compute逻辑,将任务进行拆分。