Java JDK1.5、1.6、1.7新特性整理_java

一、Java JDK1.5的新特性

1.泛型:  

List<String> strs = new ArrayList<String>();//给集合指定存入类型,上面这个集合在存入数据的时候必须存入String类型的数据,否则编译器会报错

2.for-each

例如上面这个集合我们可以通过for-each遍历,这样更加简单清晰

for(String s : strs){
System.out.println(s);
}

注意:使用for-each遍历集合时,要遍历的集合必须实现了Iterator接口

3.自动拆箱和装箱功能 

复制代码 代码如下:

什么意思呢?
    JDK1.5为每一个基本数据类型定义了一个封装类。使java中的基本数据类型也有自己的对象
    例如:int -->Integer,
    double --> Double,
    long --> Long,
    char --> Character,
    float --> Float,
    boolean --> Boolean,
    short --> Short,
    byte -- > Byte
    自动装包:将基本类型转换成为对象,例如:int --> Integer
    自动拆包:将对象转换成为基本数据类型,例如:Integer --> int
    对于JDK1.5之前集合总不能存放基本数据类型的问题,现在也能够解决。

4.枚举:

枚举是JDK1.5推出的一个比较中要的特性。其关键字为enum
例如:定义代表交通灯的枚举

  public enum MyEnum{
    RED,GREEN,YELLOW
  }

5.可变参数

什么意思呢?先举个例子:在JDK1.5以前,当我们要为一个方法传递多个类型相同的参数时,我们有两种方法解决,1.直接传递一个数组过去,2.有多少个参数就传递多少个参数。
    例如:

  public void printColor(String red,String green,String yellow){

  }

    或者

public void printColor(String[] colors){

}

    这样编写方法参数虽然能够实现我们想要的效果,但是,这样是不是有点麻烦呢?再者,如果参数个数不确定,我们怎么办呢?Java JDK1.5为我们提供的可变参数就能够完美的解决这个问题
    例如:

public void printColor(String... colors){

  }

    可以这样定义,什么意思呢?如果参数的类型相同,那么可以使用“类型+三个点,后面跟一个参数名称”的形式。这样的好处就是,只要参数类型相同,无论传递几个参数都没有限制
    注意:可变参数必须是参数列表的最后一项(该特性对对象和基本数据类型都适用)

6.静态导入

  优点:使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
  缺点:过度使用会降低代码的可读性
 
7.线程并发库

  线程并发库是Java1.5提出的关于多线程处理的高级功能,所在包:java.util.concurrent
    包括
    1.线程互斥
        工具类描述:Lock,RedWriteLock
    2.线程通信
        描述:Condition
    3.线程池
        ExecutorService
    3.同步队列
        ArrayBlockingQueue
    4.同步集合
        ConcurrentHashMap,CopyOnWriteArrayList
    5.线程同步工具
        Semaphore

关于线程并发库的内容还有很多(很重要),这里就不一一列举了,感兴趣的朋友可以查看一下帮助文档。

二、JDK1.6新特性

1.Desktop类和SystemTray类

  前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序。
 

2.使用JAXB2来实现对象与XML之间的映射

  JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。
  我们把对象与关系数据库之间的映射称为ORM,其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping)。原来JAXB是Java EE的一部分,在JDK1.6中,SUN将其放到了Java SE中,这也是SUN的一贯做法。JDK1.6中自带的这个JAXB版本是2.0,比起1.0(JSR 31)来,JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。实际上,在Java EE 5.0中,EJB和Web Services也通过Annotation来简化开发工作。另外,JAXB2在底层是用StAX(JSR 173)来处理XML文档。
    除了JAXB之外,我们还可以通过XMLBeans和Castor等来实现同样的功能。
 

3.理解StAX

  StAX(JSR 173)是JDK1.6.0中除了DOM和SAX之外的又一种处理XML文档的API。
  StAX 的来历:在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和SAX(Simple API for XML)。
  由于JDK1.6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本)。JDK1.6里面JAXP的版本就是1.4。StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
 

4.使用Compiler API

  现在我 们可以用JDK1.6 的Compiler API(JSR 199)去动态编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。
  这个特性对于某些需要用到动态编译的应用程序相当有用,比如JSP Web Server,当我们手动修改JSP后,是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler        API来实现动态编译JSP文件,当然,现在的JSP Web Server也是支持JSP热部署的,现在的JSP Web Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码,这        种方式需要我们产生另一个进程去做编译工作,不够优雅而且容易使代码依赖与特定的操作系统;Compiler API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平        台的。
 

5.轻量级Http Server API

  JDK1.6 提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法。
 

6.插入式注解处理API(Pluggable Annotation Processing API)

  插入式注解处理API(JSR 269)提供一套标准API来处理Annotations(JSR 175)
  实际上JSR 269不仅仅用来处理Annotation,我觉得更强大的功能是它建立了Java 语言本身的一个模型,它把method,package,constructor,type,variable, enum,annotation等Java语言元素映射为Types和Elements(两者有什么区别?),从而将Java语言的语义映射成为对象,我们可以在javax.lang.model包下面可以看到这些类。 所以我们可以利用JSR 269提供的API来构建一个功能丰富的元编程(metaprogramming)环境。JSR 269用Annotation Processor在编译期间而不是运行期间处理Annotation,Annotation Processor相当于编译器的一个插件,所以称为插入式注解处理.如果Annotation Processor处理Annotation时(执行process方法)产生了新的Java代码,编译器会再调用一次Annotation Processor,如果第二次处理还有新代码产生,就会接着调用Annotation Processor,直到没有新代码产生为止.每执行一次process()方法被称为一个"round",这样整个Annotation processing过程可以看作是一个round的序列。
  JSR 269主要被设计成为针对Tools或者容器的API. 举个例子,我们想建立一套基于Annotation的单元测试框架(如TestNG),在测试类里面用Annotation来标识测试期间需要执行的测试方法
 

7.用Console开发控制台程序

  JDK1.6中提供了java.io.Console 类专用来访问基于字符的控制台设备。你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳。但我们不总是能得到可用的Console,一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用。如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例。
 

8.对脚本语言的支持

如: ruby,groovy,javascript。
 
9.Common Annotations

  Common annotations原本是Java EE 5.0(JSR 244)规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中。
  随着Annotation元数据功能(JSR 175)加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web Services)都会用Annotation部分代替XML文件来配置运行参数(或者说是支持声明式编程,如EJB的声明式事务),如果这些技术为通用目的都单独定义了自己的otations,显然有点重复建设,所以,为其他相关的Java技术定义一套公共的Annotation是有价值的,可以避免重复建设的同时,也保证Java SE和Java EE 各种技术的一致性。

  下面列举出Common Annotations 1.0里面的10个Annotations Common Annotations Annotation Retention Target Description Generated SourceANNOTATION_TYPE,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE 用于标注生成的源代码Resource Runtime TYPE,METHOD,FIELD用于标注所依赖的资源,容器据此注入外部资源依赖,有基于字段的注入和基于setter方法的注入两种方式 Resources Runtime TYPE同时标注多个外部依赖,容器会把所有这些外部依赖注入PostConstructRuntime METHOD标注当容器注入所有依赖之后运行的方法,用来进行依赖注入后的初始化工作,只有一个方法可以标注为PostConstruct PreDestroy Runtime METHOD当对象实例将要被从容器当中删掉之前,要执行的回调方法要标注为PreDestroy RunAs Runtime TYPE用于标注用什么安全角色来执行被标注类的方法,这个安全角色必须和Container的Security角色一致的。RolesAllowed Runtime TYPE,METHOD用于标注允许执行被标注类或方法的安全角色,这个安全角色必须和Container的Security角色一致的 PermitAll Runtime TYPE,METHOD允许所有角色执行被标注的类或方法DenyAll Runtime TYPE,METHOD不允许任何角色执行被标注的类或方法,表明该类或方法不能在Java EE容器里面运行DeclareRoles Runtime TYPE用来定义可以被应用程序检验的安全角色,通常用isUserInRole来检验安全角色。

  注意:

  1.RolesAllowed,PermitAll,DenyAll不能同时应用到一个类或方法上标注在方法上的RolesAllowed,PermitAll,DenyAll会覆盖标注在类上的    RolesAllowed,PermitAll,DenyAllRunAs,RolesAllowed,PermitAll,DenyAll和DeclareRoles还没有加到Java SE 6.0上来 处理以上Annotations的工作是由Java EE容器来做,Java SE6.0只是包含了上面表格的前五种Annotations的定义类,并没有包含处理这些Annotations的引擎,这个工作可以由Pluggable Annotation Processing API(JSR 269)来做。
 
相对于1.6的新特性,1.7的新特性更加令我们心动,因为它是我们期待已久的而且看得见摸得着的。

三、JDK1.7的新特性

1.二进制面值

  在java7里,整形(byte,short,int,long)类型的值可以用二进制类型来表示了,在使用二进制的值时,需要在前面加上ob或oB,例如:

  int a =0b01111_00000_11111_00000_10101_01010_10;
  short b = (short)0b01100_00000_11111_0;
  byte c = (byte)0B0000_0001; 

2.数字变量对下滑线的支持

  JDK1.7可以在数值类型的变量里添加下滑线。
    但是有几个地方是不能添加的
    1.数字的开头和结尾
    2.小数点前后
    3. F或者L前
    例如:
    int num = 1234_5678_9;
    float num2 = 222_33F;
    long num3 = 123_000_111L;

3.switch对String的支持

  之前就一直有一个打问号?为什么C#可以Java却不行呢?哈,不过还有JDK1.7以后Java也可以了
    例如:

String status = "orderState";
  switch (status) {
    case "ordercancel":
      System.out.println("订单取消");
      break;
    case "orderSuccess":
      System.out.println("预订成功");
      break;
    default:
      System.out.println("状态未知");
  } 

4.try-with-resource

  try-with-resources 是一个定义了一个或多个资源的try 声明,这个资源是指程序处理完它之后需要关闭它的对象。try-with-resources 确保每一个资源在处理完成后都会被关闭。
    可以使用try-with-resources的资源有:
    任何实现了java.lang.AutoCloseable 接口java.io.Closeable 接口的对象。
    例如:

public static String readFirstLineFromFile(String path) throws IOException {  

    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
      return br.readLine();
    }
  }

   
    在java 7 以及以后的版本里,BufferedReader实现了java.lang.AutoCloseable接口。
    由于BufferedReader定义在try-with-resources 声明里,无论try语句正常还是异常的结束,它都会自动的关掉。而在java7以前,你需要使用finally块来关掉这个对象。

5.捕获多种异常并用改进后的类型检查来重新抛出异常

 例如:

 public static void first(){
 try {
  BufferedReader reader = new BufferedReader(new FileReader(""));
  Connection con = null;
  Statement stmt = con.createStatement();
 } catch (IOException | SQLException e) {
  //捕获多个异常,e就是final类型的
  e.printStackTrace();
  }
 } 

 优点:用一个catch处理多个异常,比用多个catch每个处理一个异常生成的字节码要更小更高效。

6.创建泛型时类型推断

  只要编译器可以从上下文中推断出类型参数,你就可以用一对空着的尖括号<>来代替泛型参数。这对括号私下被称为菱形(diamond)。 在Java SE 7之前,你声明泛型对象时要这样
    List<String> list = new ArrayList<String>();
    而在Java SE7以后,你可以这样
    List<String> list = new ArrayList<>();
    因为编译器可以从前面(List)推断出推断出类型参数,所以后面的ArrayList之后可以不用写泛型参数了,只用一对空着的尖括号就行。当然,你必须带着”菱形”<>,否则会有警告的。
    Java SE7 只支持有限的类型推断:只有构造器的参数化类型在上下文中被显著的声明了,你才可以使用类型推断,否则不行。 

  List<String> list = new ArrayList<>();
  list.add("A");
  //这个不行
  list.addAll(new ArrayList<>());
  // 这个可以
  List<? extends String> list2 = new ArrayList<>();
  list.addAll(list2);

7.(无)

8.新增一些取环境信息的工具方法

例如:

  File System.getUserHomeDir() // 当前用户目录
  File System.getUserDir() // 启动java进程时所在的目录5
  File System.getJavaIoTempDir() // IO临时文件夹
  File System.getJavaHomeDir() // JRE的安装目录

9.安全的加减乘除

例如:

  int Math.safeToInt(long value)
  int Math.safeNegate(int value)
  long Math.safeSubtract(long value1, int value2)
  long Math.safeSubtract(long value1, long value2)
  int Math.safeMultiply(int value1, int value2)
  long Math.safeMultiply(long value1, int value2)
  long Math.safeMultiply(long value1, long value2)
  long Math.safeNegate(long value)
  int Math.safeAdd(int value1, int value2)
  long Math.safeAdd(long value1, int value2)
  long Math.safeAdd(long value1, long value2)
  int Math.safeSubtract(int value1, int value2)

好吧,到目前为止就整理这么多。以后看到了,我会再添加上去的。
要注意的是:在不确定你之前的jdk版本时新的特性不要使用,不然的话就有可能出现这样或者那样的问题。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索jdk1.5
, JDK1.7
JDK1.6
jdk1.5新特性、jdk1.6新特性、jdk1.5的新特性、jdk1.5和1.6的区别、jdk1.5 1.6区别,以便于您获取更多的相关知识。

时间: 2024-08-30 11:15:14

Java JDK1.5、1.6、1.7新特性整理_java的相关文章

Java9的一些新特性介绍_java

被接受的特性1. Jigsaw 项目;模块化源码 Jigsaw项目是为了模块化Java代码.将JRE分成可相互协作的组件,这也是Java 9 众多特色种的一个.JEP是迈向Jigsaw四步中的第一步,它不会改变JRE和JDK的真实结构.JEP是为了模块化JDK源代码,让编译系统能够模块编译并在构建时检查模块边界.这个项目原本是随Java 8发布的,但由于推迟,所以将把它加到Java 9. 一旦它完成,它可能允许根据一个项目需求自定义组件从而减少rt.jar的大小.在JDK 7 和JDK 8的rt

J2SE 1.5版本的新特性一览_Java编程

文章来源:互联网 作者:supertoto(翻译)/CSDN.Net 到了2003的年末,J2SE1.5的beta版本就将发布了.这次发布和现在已经发布的J2SE1.4的两个更新1.4.1和1.4.2都如2003年的JavaOne大会预期的发布.如果你没有参加这次大会,或者想重新回顾一下,那么下面就是这次大会的简要内容. J2SE 1.4.1 and 1.4.2 Releases 当1.4.1(开发代号"Hopper")在2002年9月发布以及它的后续版本1.4.2(开发代号"

Java 二维码,QR码,J4L-QRCode 的资料整理_java

  开源码 Java 解码器 (编码解码)下载:http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip Java QR Code Open Source Decoder (只有编码)下载:http://www.java4less.com/qrcoded.zip J4L-QRCode 1.0 - Java component to create QR Code barcodes http://www.mayacode.com

java8新特性整理

java9快来了,必须得梳理一下java8了. 官方文档:http://docs.oracle.com/javase/specs/jls/se8/html/index.html 一.接口的默认方法和静态方法 接口里也可以写方法体了,实现该接口的类不再强制实现该方法,只需要在方法签名增加default签名并实现方法体,如: 接口: public interface Compute { default Integer add(Integer x,Integer y) { return x+y; }

Java中StringBuilder字符串类型的操作方法及API整理_java

0.StringBuilder类型简介StringBuilder类型是一个可变的字符串类型,StringBuilder类型的API与StringBuffer类型的API基本一致,唯一的区别是StringBuilder的使用假设在单一线程中,换句话说,StringBuilder是线程不安全的.StringBuilder在实例化的时候,通常也会默认设定一个容量大小,一般为字符串参数的长度+16.StringBuilder是继承AbstractStringBuilder这个抽象类的,而这个抽象类的内部

Java SE 6 新特性: HTTP 增强

2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Mustang 在性能方面有了不错的提升.与 Tiger 在 API 库方面的大幅度加强相比,虽然 Mustang 在 API 库方面的新特性显得不太多,但是也提供了许多实用和方便的功能:在脚本,WebService,XML,编译器 API,数据库,JMX,网络和 Instrumentation 方面都有不错

Java 8新特性 内建函数式接口详解_java

Java 8新特性内建函数式接口 在之前的一片博文 Lambda 表达式,提到过Java 8提供的函数式接口.在此文中,将介绍一下Java 8四个最基本的函数式接口 对于方法的引用,严格来讲都需要定义一个接口.不管我们如何操作实际上有可能操作的接口只有四种. Java 8 提供了函数式接口包java.util.function.*,在该包下有许多Java 8内建的函数式接口.不过基本上分为四种基本的: 功能型接口 (Function) 将 T 作为输入,返回 R 作为输出,他还包含了和其他函数组

【译】Java 8的新特性—终极版

文/杜琪(简书作者) 原文链接:http://www.jianshu.com/p/5b800057f2d8 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". 声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己翻译了一版(写作驱动学习,加深印象),有些地方参考了该同学的. Java 8 前言: Java 8 已经发布很久了,很

JDK1.5新特性一览

"JDK1.5"(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 .使用这些特性有助于我们编写更加清晰,精悍,安全的代码. 下面我们简单介绍一下这些新特性. 1.泛型(Generic) C++通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能.一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换.猛虎引入了泛型,它允许指