Java - 各版本特性,JDK1.5 - 9

来源:互联网 发布:2x2的矩阵怎么乘法 编辑:程序博客网 时间:2024/06/06 02:19

1.5

  1. 自动装箱与拆箱:
  2. 枚举(常用来设计单例模式)
  3. 静态导入
  4. 可变参数
  5. 内省

1.6

  1. Web服务元数据
  2. 脚本语言支持
  3. JTable的排序和过滤
  4. 更简单,更强大的JAX-WS
  5. 轻量级Http Server
  6. 嵌入式数据库 Derby

1.7

  1. switch中可以使用字串了
  2. 运用List tempList = new ArrayList<>(); 即泛型实例化类型自动推断
  3. 语法上支持集合,而不一定是数组
  4. 新增一些取环境信息的工具方法
  5. Boolean类型反转,空指针安全,参与位运算
  6. 两个char间的equals
  7. 安全的加减乘除
  8. map集合支持并发请求,且可以写成 Map map = {name:”xxx”,age:18};

1.8

  1. 允许在接口中有默认方法实现
  2. Lambda表达式
  3. 函数式接口
  4. 方法和构造函数引用
  5. Lambda的范围
  6. 内置函数式接口
  7. Streams
  8. Parallel Streams
  9. Map
  10. 时间日期API
  11. Annotations

1.9

  1. Jigsaw 项目;模块化源码
  2. 简化进程API
  3. 轻量级 JSON API
  4. 钱和货币的API
  5. 改善锁争用机制
  6. 代码分段缓存
  7. 智能Java编译, 第二阶段
  8. HTTP 2.0客户端

9. Kulla计划: Java的REPL实现


JDK1.5新特性:

1. 自动装箱与拆箱:

Integer iObj = 3;System.out.println(iObj + 12);   Integer i1 = 137(-128--127范围时,为true);   Integer i2 = 137(-128--127范围时,为true);   System.out.println(i1 == i2); //false,但是括号中时却返回ture,原因是Integer采用的是享元模式   Integer i3 = Integer.valueOf(213);   Integer i4 = Integer.valueOf(213);   System.out.println(i3==i4);//同上,另一种包装形式 ```###2. 枚举(常用来设计单例模式)

public class EnumTest {
public static void main(String[] args) {
WeekDay1 weekDay = WeekDay1.MON;
System.out.println(weekDay.nextDay());
WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2);
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(WeekDay.valueOf(“SUN”).toString());
System.out.println(WeekDay.values().length);
new Date(300){};
}
public enum WeekDay{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println(“first”);}
private WeekDay(int day){System.out.println(“second”);}
}

public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time = time;}
}
}“`

3.静态导入

import static java.lang.Math.*;public class StaticImport {public static void main(String[] args){   int x = 1;   try {    x++;   } finally {    System.out.println("template");   }   System.out.println(x);   System.out.println(max(3, 6));   System.out.println(abs(3 - 6));}}```###4.可变参数

public class VarableParameter {

public static void main(String[] args) {

System.out.println(add(2,3));
System.out.println(add(2,3,5));
}

public static int add(int x,int… args){
int sum = x;

for(int arg : args){
sum += arg;
}
return sum;
}
}“`

5. 内省

ReflectPoint pt1 = new ReflectPoint(3,5);BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());   PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();   Object retVal = null;   for(PropertyDescriptor pd : pds){     Method methodGetX = pd.getReadMethod();     retVal = methodGetX.invoke(pt1);   }

jdk1.6新特性:

1.Web服务元数据

Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆将名字也重构为Java EE, Java EE(当前版本为5.0)将元数据纳入很多规范当中,这其中就包括Web Services的相关规范, 加入元数据之后的Web Services服务器端编程模型就跟上面看到的C#片断差不多了, 这显然比以前的JAX-RPC编程模型简单(当然, Axis的编程模型也很简单).这里要谈的Web服务元数据(JSR 181)只是Java Web 服务规范中的一个,它跟Common Annotations, JAXB2, StAX, SAAJ和JAX-WS等共同构成Java EE 5的Web Services技术堆栈.

2.脚本语言支持

JDK6增加了对脚本语言的支持(JSR 223), 原理上是将脚本语言编译成bytecode,这样脚本语言也能享用Java平台的诸多优势,包括可移植性,安全等,另外,由于现在是编译成 bytecode后再执行,所以比原来边解释边执行效率要高很多。加入对脚本语言的支持后,对Java语言也提供了以下好处。
- 许多脚本语言都有动态特性,比如,你不需要用一个变量之前先声明它,你可以用一个变量存放完全不同类型的对象,你不需要做强制类型转换,因为转换都是自动的。现在Java语言也可以通过对脚本语言的支持间接获得这种灵活性。
- 可以用脚本语言快速开发产品原型,因为现在可以Edit-Run,而无需Edit-Compile-Run,当然,因为Java有非常好的IDE支持,我 们完全可以在IDE里面编辑源文件,然后点击运行(隐含编译),以此达到快速开发原型的目的,所以这点好处基本上可以忽略。
- 通过引入脚本语言可以轻松实现Java应用程序的扩展和自定义,我们可以把原来分布在在Java应用程序中的配置逻辑,数学表达式和业务规则提取出来,转用JavaScript来处理。

Sun的JDK6实现包含了一个基于Mozilla Rhino的 脚本语言引擎,支持JavaScript,这并不是说明JDK6只支持JavaScript,任何第三方都可以自己实现一个JSR-223兼容的脚本引擎 使得JDK6支持别的脚本语言,比如,你想让JDK6支持Ruby,那你可以自己按照JSR 223 的规范实现一个Ruby的脚本引擎类,具体一点,你需要实现javax.script.ScriptEngine(简单起见,可以继承 javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory两个接口。 当然,在你实现自己的脚本语言引擎之前,先到scripting.dev.java.net project 这里看看是不是有人已经帮你做了工作,这样你就可以直接拿来用就行。

Scripting API

Scripting API是用于在Java里面编写脚本语言程序的API, 在Javax.script中可以找到Scripting API,我们就是用这个API来编写JavaScript程序,这个包里面有一个ScriptEngineManager类,它是使用Scripting API的入口,ScriptEngineManager可以通过jar服务发现(service discovery)机制寻找合适的脚本引擎类(ScriptEngine),使用Scripting API的最简单方式只需下面三步
1、创建一个ScriptEngineManager对象
2、通过ScriptEngineManager获得ScriptEngine对象
3、用ScriptEngine的eval方法执行脚本

3.JTable的排序和过滤

原来的JTable基本上是只能显示数据,在JDK6新增了对JTable的排序和过滤功能,下面代码演示了这两个功能

public class JTableTester {     static String data[][] = {         {"China","Beijing","Chinese"},         {"America","Washington","English"},         {"Korea","Seoul","Korean"},         {"Japan","Tokyo","Japanese"},         {"France","Paris","French"},         {"England","London","English"},         {"Germany","Berlin","German"},     };     static String titles[] = {"Country","Capital","Language"};     public static void main(String[] args) {                 DefaultTableModel m = new DefaultTableModel(data,titles);         JTable t = new JTable(m);         final TableRowSorter sorter = new TableRowSorter(m);          t.setRowSorter(sorter); //为JTable设置排序器         JScrollPane sPane = new JScrollPane();         sPane.setViewportView(t);         JPanel p = new JPanel();         p.setLayout(new BoxLayout(p,BoxLayout.X_AXIS));         JLabel l = new JLabel("Criteria:");         final JTextField tf = new JTextField();         JButton b = new JButton("Do Filter");         p.add(l);         p.add(tf);         p.add(b);         b.addActionListener(new ActionListener() {             public void actionPerformed(ActionEvent e) {                 if(tf.getText().length()==0){                     sorter.setRowFilter(null);                 }else{                     sorter.setRowFilter(RowFilter.regexFilter(tf.getText()));//为JTable设置基于正则表达式的过滤条件                 }             }         });         JFrame f = new JFrame("JTable Sorting and Filtering");         f.getContentPane().add(sPane,BorderLayout.CENTER);                 f.getContentPane().add(p,BorderLayout.SOUTH);         f.setSize(400,300);         f.setVisible(true);     }} ```运行上面程序,单击JTable的某一个title,这个title对应的列就会按照升序/降序重新排列;在下面的Criteria文本框中输入"ese",点击"Do Filter"按钮,JTable将只显示带有"ese"字符串的行,也就是China和Japan两行,如果文本框里面什么都没有,点击"Do Filter"按钮,这时JTable会显示所有的行。###4.更简单,更强大的JAX-WSJAX-WS2.0的来历--------------------------------------------------------------------------------JAX-WS(JSR-224) 是Java Architecture for XML Web Services的缩写,简单说就是一种用Java和XML开发Web Services应用程序的框架, 目前版本是2.0, 它是JAX-RPC 1.1的后续版本, J2EE 1.4带的就是JAX-RPC1.1, 而Java EE 5里面包括了JAX-WS 2.0,但为了向后兼容,仍然支持JAX-RPC. 现在,SUN又把JAX-WS直接放到了Java SE 6里面,由于JAX-WS会用到Common Annotation(JSR 250),Java Web Services Metadata(JSR 181), JAXB2(JSR 222), StAX(JSR 173), 所以SUN也必须把后几个原属于Java EE范畴的Components下放到Java SE, 现在我们可以清楚地理解了为什么Sun要把这些看似跟Java SE没有关系的Components放进来,终极目的就是要在Java SE里面支持Web Services.JAX-WS2.0的架构--------------------------------------------------------------------------------JAX-WS不是一个孤立的框架,它依赖于众多其他的规范,本质上它由以下几部分组成1.用来开发Web Services的Java API2.用来处理Marshal/Unmarshal的XML Binding机制,JAX-WS2.0用JAXB2来处理Java Object与XML之间的映射,Marshalling就是把Java Object映射到XML,Unmarshalling则是把XML映射到Java Object.之所以要做Java Object与XML的映射,是因为最终作为方法参数和返回值的Java Object要通过网络传输协议(一般是SOAP)传送,这就要求必须对Java Object做类似序列化和反序列化的工作,在SOAP中就是要用XML来表示Java object的内部状态3.众多元数据(Annotations)会被JAX-WS用来描述Web Services的相关类,包括Common Annotations, Web Services Metadata, JAXB2的元数据和JAX-WS2.0规范自己的元数据.4.Annotation Processing Tool(APT) 是JAX-WS重要的组成部分,由于JAX-WS2.0规范用到很多元数据,所以需要APT来处理众多的Annotations. 在<JDK_HOME>/bin下有两个命令wsgen和wsimport,就是用到APT和Compiler API来处理碰到的Annotations,wsgen可以为Web Services Provider产生并编译必要的帮助类和相关支持文件,wsimport以WSDL作为输入为Web Service Consumer产生并编译必要的帮助类和相关支持文件.5.JAX-WS还包括JAX-WS Runtime与应用服务器和工具之间的契约关系###5:轻量级Http ServerJDK6提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API 来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里, 我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给 HttpHandler实现类的回调方法.下面代码演示了怎样创建自己的Http Server

public class HTTPServerAPITester {
public static void main(String[] args) {
try {
HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);//设置HttpServer的端口为8888
hs.createContext(“/chinajash”, new MyHandler());//用MyHandler类内处理到/chinajash的请求
hs.setExecutor(null); // creates a default executor
hs.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}

class MyHandler implements HttpHandler {
public void handle(HttpExchange t) throws IOException {
InputStream is = t.getRequestBody();
String response = “

Happy New Year 2007!–Chinajash

“;
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}

运行程序后,在浏览器内输入http://localhost:8888/xx,浏览器输出###6.嵌入式数据库 DerbyDerby是IBM送给开源社区的又一个礼物,是一个pure java的数据库,现在已经被列入到java1.6中。不知道对于大数据量的性能如何,但传说中启动derby只会给JVM添加2M的内存,对那些小数据库应用,比如像用access那种应该是挺有诱惑力的。另外,麻雀虽小,五脏俱全,功能要比access多得多咯,包括事务处理,并发,触发器都有,管理又简单,因此自己用来做点工具正好合适。##jdk1.7新特性:###1,switch中可以使用字串了

String s = “test”;
switch (s) {
case “test” :
System.out.println(“test”);
case “test1” :
System.out.println(“test1”);
break ;
default :
System.out.println(“break”);
break ;
}

###2.运用List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断###3.语法上支持集合,而不一定是数组final List<Integer> piDigits = [ 1,2,3,4,5,8 ];   ###4.新增一些取环境信息的工具方法

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

###5.Boolean类型反转,空指针安全,参与位运算

Boolean Booleans.negate(Boolean booleanObj)
True => False , False => True, Null => Null
boolean Booleans.and(boolean[] array)
boolean Booleans.or(boolean[] array)
boolean Booleans.xor(boolean[] array)
boolean Booleans.and(Boolean[] array)
boolean Booleans.or(Boolean[] array)
boolean Booleans.xor(Boolean[] array)

###6.两个char间的equals 

boolean Character.equalsIgnoreCase(char ch1, char ch2)

###7.安全的加减乘除 

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)
“`

8.map集合支持并发请求,且可以写成 Map map = {name:”xxx”,age:18};

jdk1.8新特性:

  1. 允许在接口中有默认方法实现
  2. Lambda表达式
  3. 函数式接口
  4. 方法和构造函数引用
  5. Lambda的范围
  6. 内置函数式接口
  7. Streams
  8. Parallel Streams
  9. Map
  10. 时间日期API
  11. Annotations

jdk1.9新特性:

  1. Jigsaw 项目;模块化源码
  2. 简化进程API
  3. 轻量级 JSON API
  4. 钱和货币的API
  5. 改善锁争用机制
  6. 代码分段缓存
  7. 智能Java编译, 第二阶段
  8. HTTP 2.0客户端
0 0
原创粉丝点击