深刻理解Java 7(笔记)

  1. 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中已经能够识别该错误。
  2. 数值分割
    通常咱们使用长整型或者浮点类型的常量时,常常会遇到数字位数数错的问题,Java7现已支持使用下划线做为数字的分割符,编译器在遇到数值中的下划线时会直接忽略掉。
    long l = 100_111l;
     float f = 100_111.222_333f;
  3. 异常
    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;
         }
  4. try-with-resource
    这种处理异常的方式在须要关闭资源的场景中特别有用,好比数据库链接、文件输入输出流。能够将须要关闭的资源放入到try管理的块中,无论是try中发生异常仍是catch中发生异常资源管理器都会关闭打开的资源,至关于替代了finally的做用,可是这种方式更加优雅。特别须要注意的是:管理的资源须要实现java.lang.AutoCloseable接口:
    try (FileInputStream fin = new FileInputStream("")) {
             fin.read();
         } catch (IOException e) {
             //异常处理
         }
  5. 变长参数
    Java5中引入了变长参数的概念:public void setNames(String... names)。变长参数的是以数组的方式存放的,这样就带来一个问题:若是我使用的是泛型类型的参数则会带来警告信息:public void setNames(T... names)Java7以前通常使用unchecked来忽略这个警告信息,Java7引入了@SafeVarargs来抑制这个警告,这样就不用在每次调用该方法时使用unchecked忽略警告。
  6. 脚本支持
    随着编程语言的发展,脚本语言以其简便、灵活的特性愈来愈受欢迎。多语言开发也成为不少大型系统的选择项之一。Java7中加强了对脚本语言的支持。
    一段脚本的执行须要脚本引擎来解释处理,java中能够经过脚本引擎的注册机制来找到合适的执行者,而对于执行过程当中产生的数据交互问题则能够经过javax.script.Bindings(参数及返回值绑定)接口来解决。脚本引擎的具体实现类会实现javax.script.ScriptEngine(脚本引擎的根类)接口,并持有javax.script.ScriptContext(执行上下文)对象,其中javax.script.ScriptContext则声明了setBindings方法。
    而对于方法级别的调用则能够经过javax.script.Invocable接口来实现。
    另外,对于某些类型的脚本能够经过预编译的方式提升调用的速度(javax.script.CompiledScript)。
  7. 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
  8. JNI
  9. 虚拟机 - 对象引用
  10. 虚拟机 - 内存
  11. 虚拟机 - 类加载
  12. 虚拟机 - 对象声明周期
  13. 多线程 - volatile
  14. 多线程 - synchronized
  15. 多线程 - fork/join
  16. 多线程 - ThreadLocal
  17. 安全 - 加解密、签名
  18. 安全 - HTTPS/SSL2.0
  19. Lambada
  20. 函数式编程
相关文章
相关标签/搜索