- switch
Java 7 中新增长了对String的支持,除此以外还支持int、char、byte、short及其封装类Integer、Character、Byte、Short。对于基本类型的支持咱们很容易理解,可是String类型使用了不一样的判断方式,首先使用String的哈希值判断,而后使用equals方法判断(排除哈希值冲突),举例说明: switch (str.hashCode()) {
case 97:
if (str.equals("a")) {
break;
}
case 98:
if (str.equals("b")) {
break;
}
}
switch要求case的值不能出现重复及null。有一种特殊状况:使用含义相同的String及Unicode会不会致使编译器没法识别错误?例如使用:男与\u7537: switch (str) {
case "男":
break;
case "\u7537":
break;
}
最新版的Java 7中已经能够识别该错误。
- 数值分割
通常咱们使用长整型或者浮点类型的常量时,常常会遇到数字位数数错的问题,Java7现已支持使用下划线做为数字的分割符,编译器在遇到数值中的下划线时会直接忽略掉。 long l = 100_111l;
float f = 100_111.222_333f;
- 异常
Java7支持在一次捕捉中捕捉不一样类型的异常,例如: try {
if (id == null)
throw new AccessDeniedException("path");
else
throw new FileNotFoundException();
} catch (AccessDeniedException | FileNotFoundException e) {
//xxx
}
另外对于须要从新封装异常场景,Java7也支持将原始异常addSuppressed到抛出的异常中: try {
if (id == null)
throw new AccessDeniedException("path");
else
throw new FileNotFoundException();
} catch (AccessDeniedException | FileNotFoundException e) {
Exception e1= new RuntimeException();
e1.addSuppressed(e);
throw e1;
}
- try-with-resource
这种处理异常的方式在须要关闭资源的场景中特别有用,好比数据库链接、文件输入输出流。能够将须要关闭的资源放入到try管理的块中,无论是try中发生异常仍是catch中发生异常资源管理器都会关闭打开的资源,至关于替代了finally的做用,可是这种方式更加优雅。特别须要注意的是:管理的资源须要实现java.lang.AutoCloseable接口: try (FileInputStream fin = new FileInputStream("")) {
fin.read();
} catch (IOException e) {
//异常处理
}
- 变长参数
Java5中引入了变长参数的概念:public void setNames(String... names)。变长参数的是以数组的方式存放的,这样就带来一个问题:若是我使用的是泛型类型的参数则会带来警告信息:public void setNames(T... names)Java7以前通常使用unchecked来忽略这个警告信息,Java7引入了@SafeVarargs来抑制这个警告,这样就不用在每次调用该方法时使用unchecked忽略警告。
- 脚本支持
随着编程语言的发展,脚本语言以其简便、灵活的特性愈来愈受欢迎。多语言开发也成为不少大型系统的选择项之一。Java7中加强了对脚本语言的支持。
一段脚本的执行须要脚本引擎来解释处理,java中能够经过脚本引擎的注册机制来找到合适的执行者,而对于执行过程当中产生的数据交互问题则能够经过javax.script.Bindings(参数及返回值绑定)接口来解决。脚本引擎的具体实现类会实现javax.script.ScriptEngine(脚本引擎的根类)接口,并持有javax.script.ScriptContext(执行上下文)对象,其中javax.script.ScriptContext则声明了setBindings方法。
而对于方法级别的调用则能够经过javax.script.Invocable接口来实现。
另外,对于某些类型的脚本能够经过预编译的方式提升调用的速度(javax.script.CompiledScript)。
- NIO
NIO并不是Java7才引入的特性,这里只是DING一下。NIO的优点主要集中在异步IO上面,须要了解的知识点包括:Channel(通道)、Buffer(缓冲区)、Selector(选择器)。经过下面的图能够简单理解NIO与IO的不一样: Stream Thread
|<--------------------------|read <-----
|send---------------------->|process |
| |loop----------->
Stream Buffer Thread
|<------------------|--------------------|read <-----
|send-------------->|buffer |do otherthing |
| |ready-------------->|process |
| |loop----------->
区别在Stream send数据的过程Thread是否在傻傻的等待。
固然实际状况比这个更加复杂,能够参考这篇文章:Java NIO
- JNI
- 虚拟机 - 对象引用
- 虚拟机 - 内存
- 虚拟机 - 类加载
- 虚拟机 - 对象声明周期
- 多线程 - volatile
- 多线程 - synchronized
- 多线程 - fork/join
- 多线程 - ThreadLocal
- 安全 - 加解密、签名
- 安全 - HTTPS/SSL2.0
- Lambada
- 函数式编程