深入理解Java 7(笔记)
2016-03-30 00:00
417 查看
switch
Java 7 中新增加了对String的支持,除此之外还支持int、char、byte、short及其封装类Integer、Character、Byte、Short。对于基本类型的支持我们很容易理解,但是String类型使用了不同的判断方式,首先使用String的哈希值判断,然后使用equals方法判断(排除哈希值冲突),举例说明:
数值分割
一般我们使用长整型或者浮点类型的常量时,经常会遇到数字位数数错的问题,Java7现已支持使用下划线作为数字的分割符,编译器在遇到数值中的下划线时会直接忽略掉。
异常
Java7支持在一次捕捉中捕捉不同类型的异常,例如:
try-with-resource
这种处理异常的方式在需要关闭资源的场景中特别有用,比如数据库连接、文件输入输出流。可以将需要关闭的资源放入到try管理的块中,不管是try中发生异常还是catch中发生异常资源管理器都会关闭打开的资源,相当于替代了finally的作用,但是这种方式更加优雅。特别需要注意的是:管理的资源需要实现java.lang.AutoCloseable接口:
变长参数
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的不同:
当然实际情况比这个更加复杂,可以参考这篇文章:Java NIO
JNI
虚拟机 - 对象引用
虚拟机 - 内存
虚拟机 - 类加载
虚拟机 - 对象声明周期
多线程 - volatile
多线程 - synchronized
多线程 - fork/join
多线程 - ThreadLocal
安全 - 加解密、签名
安全 - HTTPS/SSL2.0
Lambada
函数式编程
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
函数式编程
相关文章推荐
- java 异常处理
- Spring4+hibernate4+多数据源动态datasource+异构数据库
- SSM框架(spring+springmvc+mybatis)整合
- Eclipse使用问题
- Java加密和解密
- Spring4 + SpringMVC4 + Hibernate4 框架的整合
- eclipse各种配置
- 在其他电脑上拷贝的eclipse,无法打开,显示找不到Javaw.exe
- beanutils工具类将字符串转换成Date(java.util.Date)数据类型的方法
- MyEclipse安装JRebel插件实现热部署
- RXJava异步代码
- The 10 Most Important Security Controls Missing in
- Java基础系列8:Java的序列化与反序列化(修)
- java赋值运算符,算数运算符
- Spring IoC之 基于 Annotation 的配置实现
- Spring IoC之<context:annotation-config/>
- IDEA社区版、maven、jetty开发Java Web项目
- Java、Web工程师发展——路在何方?
- Myeclipse项目加入maven支持
- Eclipse4.2界面难看,启动速度,修改方法