Java JDK 1.5 1.6 1.7 新特性整理
Java JDK 1.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
- 关于线程并发库的内容还有很多(很重要),这里就不一一列举了,感兴趣的朋友可以查看一下帮助文档。
Java JDK 1.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。
JDK 1.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.全新的集合声明以及获取集合中的值的方式
- JDK1.7以前声明集合的方式
- List<String> strs = new ArrayList<String>();
- Map<String,String> map = new HashMap<String,String>();
- strs.add("abc");
- strs.get(index);
- map.put("key","全新集合");
- map.get(key);
- JDK1.7以后
- List<String> list = [item1,item2,item3];
- String item1 = list[0];
- String item2 = list[1];
- String item3 = list[2];
- Map<String,String> map = {key:value,key:value}
- String mapValue = map[key];
- 这样的定义是不是非常方便?肯定的!(有点象JSON)呵呵
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)
参考:https://www.cnblogs.com/tony-yang-flutter/p/3503935.html
Java JDK 1.5 1.6 1.7 新特性整理的更多相关文章
- Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码
美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩 ...
- Java 11正式发布,这几个逆天新特性教你写出更牛逼的代码
就在前段时间,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用! 这无疑对我们来说是一大好的消息.作为一名java开发者来说,虽然又要去学习和了解java11 ...
- Java JDK1.5、1.6、1.7新特性整理(转)
原文链接:http://www.cnblogs.com/tony-yang-flutter/p/3503935.html 一.Java JDK1.5的新特性 1.泛型: List<String& ...
- Java JDK1.5、1.6、1.7新特性整理
转载请注明出处:http://www.cnblogs.com/tony-yang-flutter 一.Java JDK1.5的新特性 1.泛型: List<String> strs = n ...
- java基础(1)-比较jdk5,jdk6,jdk7的新特性
jdk8已经出来好长时间了,这里自己学习时简单总结的jdk5,jdk6和jdk7的新特性:本文提纲: 一.jdk5的新特性 二.jdk6的新特性 三.jdk7的新特性 一.jdk5的新特性 首先简单介 ...
- Java基础学习总结(55)——java8新特性:stream
java作为开发语言中的元老已经度过了很多年,最新的java8为我们带来了一些新特性,这些特性可以在以后的工作中为我们的开发提供更多的便捷,现在就让我们看看最新的函数式编程风格怎么在实际的开发中使用. ...
- JDK 7中的文件操作的新特性
文件系统综述 一个文件系统在某种媒介(通常是一个或多个硬盘)上存储和组织文件.如今的大多数文件系统都是以树状结构来存储文件.在树的顶端是一个或多个根节点,在根节点一下,是文件和目录(在Windows系 ...
- 说出 JDK 1.7 中的三个新特性?
虽然 JDK 1.7 不像 JDK 5 和 8 一样的大版本,但是,还是有很多新的特性, 如 try-with-resource 语句,这样你在使用流或者资源的时候,就不需要手动关 闭,Java 会自 ...
- 用ScriptEngine在java中和javascript交互的例子(JDK6新特性)
package demo7; import java.util.Arrays; import java.util.List; import javax.script.Invocable; import ...
随机推荐
- Gin_入门
1. 创建路由 1.1 Restful风格的API gin支持Restful风格的API 即Representational State Transfer的缩写.直接翻译的意思是"表现层状态 ...
- 文艺平衡树 lg3391(splay维护区间入门)
splay是支持区间操作的,先做这道题入个门 大多数操作都和普通splay一样,就不多解释了,只解释一下不大一样的操作 #include<bits/stdc++.h> using name ...
- 【牛客小白月赛21】NC201605 Bits
[牛客小白月赛21]NC201605 Bits 题目链接 题目描述 Nancy喜欢做游戏! 汉诺塔是一个神奇的游戏,神奇在哪里呢? 给出3根柱子,最开始时n个盘子按照大小被置于最左的柱子. 如果盘子数 ...
- jquery如何将信息遍历到界面上
1.使用的时候一定要导入juqery库 1.1 这里放置一个cdn的库 <script src="https://cdn.staticfile.org/jquery/1.10.2/jq ...
- jquery easyui combogrid Uncaught TypeError:Cannot read property
================================ ©Copyright 蕃薯耀 2020-01-07 https://www.cnblogs.com/fanshuyao/ 一.问题描述 ...
- Is It Good To Use LED Wall Light In Household Space?
Wall lamps are mostly used for local lighting, can play a very decorative effect, improve the visual ...
- 【js】子菜单吸顶(滚动到一定距离 容器置顶)附 无间断置顶 避免闪动
思考逻辑:当向上滚动的高度>= 观察容器距离顶部高度 即可触发吸顶 以下代码在vue工程,作参考 handleScroll () { const scrollTop = window.pageY ...
- intellij手动创建Mybatis遇到java.io.IOException: Could not find resource mybatis.xml
将配置文件夹设置成resources即可
- python接口自动化测试 - requests库的post请求进行文件上传
前言 如果需要发送文件到服务器,比如上传图片.视频等,就需要发送二进制数据. 一般上传文件使用的都是 Content-Type: multipart/form-data; 数据类型,可以发送文件,也可 ...
- php对字符串的操作3之 字符类型转换详解
所有的数据输出到屏幕上,实际上被隐式的转换成了字符型,首先了解下各种数据类型的字符串表示 <?php echo 300,'<hr>'; echo true,'<hr>'; ...