JDK 5~8的特性对比

原文请参考:https://bbs.csdn.net/topics/392062347

jdk5新特性

1、自动装箱和拆箱
2、枚举
3、静态导入
4、可变参数
5、內省
   是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性那么,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter,setter方法,通过这些API可以使你不需要了解这个规则,这些API存放于包java.beans中。
   一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。
6、泛型
7、For-Each循环

jdk6新特性

1、Desktop类和SystemTray类
   AWT新增加了两个雷:Desktop,SystemTray。
   Desktop可以用来打开系统默认浏览器指定的URL,打开系统默认邮件客户端给指定的邮件账号发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开txt文件),用系统默认的打印机打印文档
   SystemTray可以用来在系统托盘区创建一个托盘程序
2、使用JAXB2来实现对象与XML之间的映射
   也就是对象与XML之间的映射(OXM),也可以通过XMLBeans和Castor等来实现同样的功能。
3、StAX
   StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让 程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件 然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符; 
            SAX也是基于事件处理xml文档,但却 是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM 采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
4、使用Compiler API
            使用JDK6的Compiler API去动态的编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码。
5、轻量级Http Server API
6、插入式注解处理API
7、用Console开发控制台程序
8、对脚本语言的支持如:ruby,groovy,javascript
9、Common Annotations

jdk7新特性

1、switch中可以使用字符串
2、泛型的自动判断
3、自定义自动关闭类(实现AutoCloseable接口)
4、新增一些取环境信息的工具方法(System中的方法)
5、Boolean类型反转,空指针安全,参数与位运算
6、两个char间的equals
7、安全的加减乘除

另外:

1、对Java集合(Collections)的增强支持
   List<String> list=["item"]; //向List集合中添加元素
   String item=list[0]; //从List集合中获取元素
   Set<String> set={"item"}; //向Set集合对象中添加元
   Map<String,Integer> map={"key":1}; //向Map集合中添加对象
   int value=map["key"]; //从Map集合中获取对象
   但是经过自己测试,按照上面的使用方法,并不能创建集合。
2、int支持二进制数据
3、在try catch异常捕捉中,一个catch可以写多个异常类型
Connection conn = null;
try {
    Class.forName("com.mysql.jdbc.Driver");
    conn = DriverManager.getConnection("","","");
} catch(ClassNotFoundException|SQLException ex) {
    ex.printStackTrace();
}
4、try catch中资源定义好之后try catch自动关闭
try (BufferedReader in  = new BufferedReader(new FileReader("in.txt"));
     BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"))) {
int charRead;
while ((charRead = in.read()) != -1) {
        System.out.printf("%c ", (char)charRead);
        out.write(charRead);
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

jdk8新特性

1、接口的默认方法

Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法,示例如下:
public interface Formula {
    double calculate(int a);
    default double sqrt(int a) {
return Math.sqrt(a);
    }
}
Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。
    Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
        }
    };
    System.out.println(formula.calculate(100));  // 100.0
    System.out.println(formula.sqrt(16));  // 4.0
文中的formula被实现为一个匿名类的实例,该代码非常
2、Lambda表达式
List<String> names = Arrays.asList("tom","jace","mike");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
    }
});
只需要给静态方法Collections.sort传入一个List对象以及一个比较器来指定顺序排列。通常做法都是创建一个匿名的比较器对象,然后将其传递给sort方法。
在Java 8中提供了更简洁的语法,lambda表达式:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
还可以更简洁:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
去掉大括号以及return关键字
Collections.sort(names, (a,b) -> b.compareTo(a));
Java编译器可以自动推导出参数类型,所以可以不用再写一次类型。
3、函数式接口
Lambda表达式是如何在java的类型系统中表示的呢?
每一个lambda表达式都对应着一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以也可以给自己的函数式接口添加默认方法。
我们可以将lambda表达式当做一个抽象方法的接口类型,确保自己的接口一定达到这个要求,你只需要给你的接口添加@FunctionalInterface注解,编译器如果发现标注了这个注解的接口有多于一个抽象方法的时候就会报错。也就是说@ FunctionalInterface注解标注的接口只能有一个抽象方法。
例如:
@FunctionalInterface
public interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);
以上代码不需要@FunctionalInterface注解也是正确的。
4、方法与构造函数引用
上面的代码也可以通过静态方法引用来表示:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);
Java8允许使用::关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:
public class Person {
    String firstName;
    String lastName;
    Person() {
    }
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
    }
}
指定一个用来创建Person对象的对象工厂接口:
public interface PersonFactory<P extends Person> {
P create(String fisrtName, String lastName);
}
创建Person对象
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter","Parker”);
我们只需要使用Person::new 来获取Person类构造函数的引用,Java编译器就会自动根据PersonFactory.create方法的签名来选择合适的构造函数。
5、Lambda作用域
在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
6、访问局部变量
我们可以直接在lambda表达式中访问外层的局部变量
final int num = 1;
Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num);
stringConverter.convert(2);
但是和匿名对象不同的是,这里的变量num可以不用声明为final,该代码同样正确。
7、访问对象字段与静态变量
和本地不良不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的:
static int outerStaticNum;
int outerNum;
public void testScopes() {
    Converter stringConverter1 = (from) -> {
        outerNum = 23;
        return String.valueOf(from);
    };
    Converter stringConverter2 = (from) -> {
        outerStaticNum = 72;
        return String.valueOf(from);
    };
}
8、访问接口的默认方法
9、Date API
10、Annotation注解

原文地址:https://www.cnblogs.com/zzp-biog/p/9744940.html

时间: 2024-08-01 08:09:43

JDK 5~8的特性对比的相关文章

atitit.ntfs&#160;ext&#160;文件系统新特性对比

atitit.ntfs ext 文件系统新特性对比 1. 现代文件系统应该有的特性2 1.1. 恢复Log2 1.2. 压缩2 1.3. Meta ext2 1.4. Fulltext?search  全文2 1.5. Copy 校验2 1.6. 稀疏文件,这是UNIX类和NTFS等文件系统的一个特性.2 2. Ext2 特性3 2.1. EXT2第二代扩展文件系统(英语:second extended filesystem,缩写为 ext2)3 3. Ext3 特性4 3.1. · 日志4 3

Atitit.jdk&#160;java8的语法特性详解&#160;attilax&#160;总结

Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不是客户代码.例如:1 2.2. Stream 流失接口 管道(pipelines)模式2 2.3. 方法引用(Method reference)2 2.4.  默认方法(Default method)2 2.5. 生成器函数(Generator function)2 2.6. 新加入的Nashorn

JDK 1.5 新特性

前言:为什么会出现新特性呢?   新的技术的出现就是为了解决老的问题,Java语言随着自身的不断发展,对那些不利于提高开发率的技术进行了改进. 1.静态导入 静态导入可以导入静态方法,这样就不必写类名而可以直接省略类名调用静态方法了. 语法:import static 包名.类名.静态方法; 也可以直接导入某个类中的所以静态方法. 语法:import static 包名.类名.*; Java 5.0 代码示例: 1 package com.tolvgx.day01; 2 import stati

JDK各版本新特性总结

JDK各版本新特性总结 JDK 1.7 新特性  1.switch中可以使用string字符串了 2.<>的运用, List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断 3.语法上支持集合,而不一定是数组 final List<Integer> piDigits = [ 1,2,3,4,5,8 ]; 对Java集合(Collections)的增强支持,摒弃了Java集合接口的实现类,如:ArrayLi

MySQL Cluster, Fabric, Cobar 三大集群特性对比

MySQL有众多集群方案,大多数公司用到的都是主从.读写分离.galera这类多主方案,非常适合于中小企业.对于大企业我们需要分表分库,我之前写了3篇关于有分表分库功能的MySQL集群方案Fabric, Cobar, MySQL Cluster,使用这些方案能够简化分表分库的逻辑,加快开发速度.只看这3篇零散的文章还不能够很好的为自己公司应该使用那种方案做出选择,我们这里对这3种方案作了详细的对比,他们各有优缺点,希望能够对您的选择有所帮助.特性对比情况请看下面的表格:

java入门概念个人理解之集合类特性对比列表

类集合框架有很多文章都列出了继承关系图,但是我没有找到更清晰的特性对比图,我这里根据使用选择条件总结对比罗列一下它们之间的一些特点.

JDK 5 ~ 10 新特性倾情整理!

JDK 5 ~ 10 新特性倾情整理! 最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了. 为了大家对JDK有一个全面的了解,下面我为大家整理了JDK5~10的所有关键新特性! JDK5新特性 自动装箱与拆箱 枚举 静态导入 可变参数(Varargs) 内省(introspector) 泛型(Generic) For-Each循环 JDK6新特性 Desktop类和SystemTray类 使用JAXB2来

Android 三大图片缓存原理、特性对比

这是我在 MDCC 上分享的内容(略微改动),也是源码解析第一期发布时介绍的源码解析后续会慢慢做的事. 从总体设计和原理上对几个图片缓存进行对比,没用到他们的朋友也可以了解他们在某些特性上的实现. 上篇关于选择开源项目的好处及如何选择开源项目可见:开源项目使用及选型. 一. 四大图片缓存基本信息 Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用. Picasso 是 Square 开源的项目,且他的主导者是 JakeWharton,所以广为人知. Glide

JDK各版本新特性!

1.JDK1.5 新特性 1.自动装箱与拆箱:自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中.自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方法.自动装箱,只需将该值赋给一个类型包装器引用,java会自动创建一个对象.自动拆箱,只需将该对象值赋给一个基本类型即可.java——类的包装器类型包装器有:Double,Float,Long,Integer,Short,Char