- switch
Java 7 中新增加了对String的支持,除此之外还支持int、char、byte、short及其封装类Integer、Character、Byte、Short。对于基本类型的支持我们很容易理解,但是String类型使用了不同的判断方式,首先使用String的哈希值判断,然后使用equals方法判断(排除哈希值冲突),举例说明:
switch要求case的值不能出现重复及null。有一种特殊情况:使用含义相同的String及Unicode会不会导致编译器无法识别错误?例如使用:男与\u7537:switch (str.hashCode()) { case 97: if (str.equals("a")) { break; } case 98: if (str.equals("b")) { break; } }
最新版的Java 7中已经可以识别该错误。switch (str) { case "男": break; case "\u7537": break; }
- 数值分割
一般我们使用长整型或者浮点类型的常量时,经常会遇到数字位数数错的问题,Java7现已支持使用下划线作为数字的分割符,编译器在遇到数值中的下划线时会直接忽略掉。long l = 100_111l; float f = 100_111.222_333f;
- 异常
Java7支持在一次捕捉中捕捉不同类型的异常,例如:
另外对于需要重新封装异常场景,Java7也支持将原始异常addSuppressed到抛出的异常中:try { if (id == null) throw new AccessDeniedException("path"); else throw new FileNotFoundException(); } catch (AccessDeniedException | FileNotFoundException e) { //xxx }
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 send数据的过程Thread是否在傻傻的等待。Stream Buffer Thread |<------------------|--------------------|read <----- |send-------------->|buffer |do otherthing | | |ready-------------->|process | | |loop----------->
当然实际情况比这个更加复杂,可以参考这篇文章:Java NIO - JNI
- 虚拟机 - 对象引用
- 虚拟机 - 内存
- 虚拟机 - 类加载
- 虚拟机 - 对象声明周期
- 多线程 - volatile
- 多线程 - synchronized
- 多线程 - fork/join
- 多线程 - ThreadLocal
- 安全 - 加解密、签名
- 安全 - HTTPS/SSL2.0
- Lambada
- 函数式编程
转载于:https://my.oschina.net/chris2009/blog/650025