整理Java5以上各版本特性集合

  用到了就写,没用到不写……

Java5

静态导入

  静态导入用于简化程序对类静态属性和方法的调用。

语法:

1
import static packageName.ClassName.methodName|attributeName|*;

示例:

1
2
3
4
5
6
7
8
9
10
11
package test;

import static java.util.Arrays.sort;

public class Test {
public static void main(String[] args) {
int[] arr = {2,0,1,8,0,7,0,8};
//直接使用静态导入的方法,无需使用Arrays.
sort(arr);
}
}

自动装箱拆箱

自动装箱

Integer i = 100;
相当于编译器自动为您作以下的语法编译: Integer i = Integer.valueOf(100);

需要注意的是Integer的valueOf方法,以下是JDK1.8中的源码

1
2
3
4
5
6
//其中int low = -128, int high默认是127
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象(并不是新建对象),即:

1
2
3
4
5
6
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
System.out.print(a == b);//true
System.out.print(c == d);//false

自动拆箱

1
2
3
4
5
Integer i = 2018;//装箱
int t = i;//拆箱,实际上执行了 int t = i.intValue();

//在进行操作符运算时,也可以进行拆箱
System.out.print(i++);

原生类型 包装类型
boolean Boolean
char Character
byte Byte
short Short
int Integer
float Float
long Long
double double

###

增强for循环

可变参数

枚举类

反射

加载类

解析类

利用Constructor创建对象

利用Method执行方法

反射字段

内省Introspector

泛型

泛型的使用

自定义泛型

自定义泛型方法

自定义泛型类

Java6

轻量级Http Server

Compiler API

插入式注解处理API

Common Annotations

脚本语言支持(Scripting)

Java7

二进制字面量

数字字面量可以出现下划线

switch 语句可用 String

泛型实例的创建可以通过类型推断来简化

Try块自动化资源管理

  在try语句中申请资源,实现资源的自动释放; 资源类必须实现java.lang.AutoCloseable接口
无需在finally块关闭资源。

1
2
3
4
5
6
try(FileReader fileReader = new FileReader("test.txt")) {
int x = fileReader.read();
System.out.println((char) x);
}catch (IOException e) {
e.printStackTrace();
}

资源按照初始化的相反顺序关闭

Multi-Catch(多catch捕捉)

  在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常
在Java7之前,捕捉多种异常的方式:

1
2
3
4
5
6
7
8
9
10
catch (IOException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
catch (SQLException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}catch (Exception ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}

在Java7之后,可以使用管道符“ | ”分割的方式,在一个catch块中捕捉多个异常。

1
2
3
4
catch(IOException | SQLException | Exception ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}

Java8

Lambda表达式与函数式接口

接口的默认方法和静态方法

方法引用

重复注解

拓宽注解的应用场景

Optional

Stream API

Date/Time API(JSR 310)

Nashorn JavaScript引擎

并发性

使用Metaspace(JEP 122)代替持久代(PermGen space)

JDK 8 HotSpot JVM现在使用本机内存来表示类元数据,称为Metaspace; 类似于Oracle JRockit和IBM JVM。好消息是它不再意味着java.lang.OutOfMemoryError:PermGen空间问题,你不再需要调整和监控这个内存空间
Metaspace官方说明

Java9

模块化系统–Jigsaw 项目

Linking

当你使用具有显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块现在将声明其对其他应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为什么不使用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这可以通过 Java 9 中的新的 jlink 工具实现。你可以创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载 JDK 安装版本。

JShell : 交互式 Java REPL

改进的 Stream API

私有接口方法

HTTP/2

响应式流

Java10

局部变量类型推断

线程本地握手

备用内存设备上的堆分配

GC改进和内存管理

zcolder wechat
写得不好?加我QQ开始喷我!