您的位置:首页 > 编程语言 > Java开发

深入理解Java 7(笔记)

2016-03-30 00:00 417 查看
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接口来实现。
另外,对于某些类型的脚本可以通过预编译的方
7fe8
式提高调用的速度(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

函数式编程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: