Java 新特性总结

本文详细总结了Java从5到10的主要新特性,包括泛型、枚举、自动装箱拆箱、可变参数、注解、新迭代语句、静态导入、线程模型与并发库的改进,以及后续版本中的Lambda表达式、接口默认方法、方法引用、重复注解、类型推断等。此外,还介绍了Java9的模块化、JShell工具、HTTP2客户端、改进的Javadoc、多版本兼容JAR、私有接口方法和Stream API的增强。Java10的局部变量推断、JDK代码仓库整合、统一的垃圾回收接口、并行垃圾回收器G1以及线程局部管控等特性也被详细探讨。
摘要由CSDN通过智能技术生成

Java 新特性总结

总结的这些新特性,都是自己觉得在开发中实际用得上的。 简单概括下就是:

  • JAVA1.3:普通的原始的JAVA,基本语法相信大家都见过了
  • JAVA1.4:assert关键字
  • JAVA5:枚举类型、泛型、自动拆装箱
  • JAVA6: @Override注解
  • JAVA7: <>符号、ARM支持、支持多catch
  • JAVA8:Lamda表达式,类型注解等
  • JAVA9: 模块化、接口中的私有方法等
  • JAVA10: 局部变量推断、整个JDK代码仓库、统一的垃圾回收接口、并行垃圾回收器G1、线程局部管控

Java5 新特性总结

泛型 Generics

引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处。Parameterized Type作为参数和返回值,Generic是vararg、annotation、enumeration、collection的基石。

泛型可以带来如下的好处总结如下:

  1. 类型安全:抛弃List、Map,使用List、Map给它们添加元素或者使用Iterator遍历时,编译期就可以给你检查出类型错误
  2. 方法参数和返回值加上了Type: 抛弃List、Map,使用List、Map
  3. 不需要类型转换:List list=new ArrayList();
  4. 类型通配符“?”: 假设一个打印List中元素的方法printList,我们希望任何类型T的List都可以被打印

枚举类型

引入了枚举类型

自动装箱拆箱(自动类型包装和解包)autoboxing & unboxing

简单的说是类型自动转换。自动装包:基本类型自动转为包装类(int ——Integer)自动拆包:包装类自动转为基本类型(Integer——int)

可变参数varargs(varargs number of arguments)

参数类型相同时,把重载函数合并到一起了。如:

public void test(object... objs){
    for(Object obj:objs){
        System.out.println(obj);
    }
}

Annotations(重要) 它是java中的metadata(注释)

注解在JAVA5中就引入了。这是非常重要的特性。现在注解的应用已经随处可见。不过JAVA5的注解还不成熟,没法自定义注解。

新的迭代语句

for(int n:numbers){
//process
}

静态导入(import static )

导入静态对象,可以省略些代码。不过这个也不常用。

import static java.lang.System.out;//导入java.lang包下的System类的静态方法out;
public class HelloWorld{
    public static void main(String[] args){
        out.print("Hello World!");//既是在这里不用再写成System.out.println("Hello World!")了,因为已经导入了这个静态方法out。
    }
}

新的格式化方法java.util.Formatter)

formatter.format("Remaining account balance: $%.2f", balance);

新的线程模型和并发库Thread Framework(重要)

最主要的就是引入了java.util.concurrent包,这个都是需要重点掌握的。

HashMap的替代者ConcurrentHashMap和ArrayList的替代者CopyOnWriteArrayList在大并发量读取时采用java.util.concurrent包里的一些类会让大家满意BlockingQueue、Callable、Executor、Semaphore

Java6 新特性总结

Web Services

优先支持编写 XML web service 客户端程序。你可以用过简单的annotaion将你的API发布成.NET交互的web services. Mustang 添加了新的解析和 XML 在 Java object-mapping APIs中, 之前只在Java EE平台实现或者Java Web Services Pack中提供.

Scripting

现在你可以在Java源代码中混入JavaScript了,这对开发原型很有有用,你也可以插入自己的脚本引擎。

JDBC4.0

JAVA6将联合绑定 Java DB (Apache Derby). JDBC 4.0 增加了许多特性例如支持XML作为SQL数据类型,更好的集成Binary Large OBjects (BLOBs) 和 Character Large OBjects (CLOBs) .

UI优化

  1. GUI 开发者可以有更多的技巧来使用 SwingWorker utility ,以帮助GUI应用中的多线程。, JTable 分类和过滤,以及添加splash闪屏。
  2. Swing拥有更好的 look-and-feel , LCD 文本呈现, 整体GUI性能的提升。Java应用程序可以和本地平台更好的集成,例如访问平台的系统托盘和开始菜单。Mustang将Java插件技术和Java Web Start引擎统一了起来。

监控管理增强

添加更多的诊断信息,绑定了不是很知名的 memory-heap 分析工具Jhat 来查看内核导出。

编译API

compiler API提供编程访问javac,可以实现进程内编译,动态产生Java代码

自定义注解

Java tool和framework 提供商可以定义自己的 annotations ,并且内核支持自定义annotation的插件和执行处理器

安全性

XML-数字签名(XML-DSIG) APIs 用于创建和操纵数字签名); 新的方法来访问本地平台的安全服务,例如本地Microsoft Windows for secure authentication and communicationnative 的Public Key Infrastructure (PKI) 和 cryptographic services, Java Generic Security Services (Java GSS) 和 Kerberos services for authentication, 以及访问 LDAP servers 来认证用户.

Java7 新特性总结

switch中使用String

java7以前在switch中只能使用number或enum,现在可以使用string了。

示例:

String s = "a";
switch (s) {
    case "a":
        System.out.println("is a");
        break;
    case "b":
        System.out.println("is b");
        break;
    default:
        System.out.println("is c");
        break;
}

异常处理

  • Throwable类增加addSuppressed方法和getSuppressed方法,支持原始异常中加入被抑制的异常。
  • 异常抑制:在try和finally中同时抛出异常时,finally中抛出的异常会在异常栈中向上传递,而try中产生的原始异常会消失。
  • 在Java7之前的版本,可以将原始异常保存,在finally中产生异常时抛出原始异常:
//java 7 以前
public void read(String filename) throws BaseException {  
    FileInputStream input = null;  
    IOException readException = null;  
    try {  
        input = new FileInputStream(filename);  
    } catch (IOException ex) {  
        readException = ex;   //保存原始异常  
    } finally {  
        if (input != null) {  
            try {  
                input.close();  
            } catch (IOException ex) {  
                if (readException == null) {  
                    readException = ex;  
                }  
            }  
        }  
        if (readException != null) {  
            throw new BaseException(readException);  
        }  
    }  
}

//在Java7中的版本,可以使用addSuppressed方法记录被抑制的异常:
public void read(String filename) throws IOException {  
    FileInputStream input = null;  
    IOException readException = null;  
    try {  
        input = new FileInputStream(filename);  
    } catch (IOException ex) {  
        readException = ex;  
    } finally {  
        if (input != null) {  
            try {  
                input.close();  
            } catch (IOException ex) {  
                if (readException != null) {    //此处的区别  
                    readException.addSuppressed(ex);  
                }  
                else {  
                    readException = ex;  
                }  
            }  
        }  
        if (readException != null) {  
            throw readException;  
        }  
    }  
}  

try-with-resources

java7以前对某些资源的操作是需要手动关闭,如InputStream,Writes,Sockets,Sql等,需要在finally中进行关闭资源的操作,现在不需要使用finally来保证打开的流被正确关闭,现在是自动完成的,会自动释放资源,确保每一个资源在处理完成后都会关闭,就不需要我们代码去close();

  • 在采用try-with-resources方式后,不需要再次声明流的关闭。
  • 可以使用try-with-resources的资源有:任何实现了java.lang.AutoCloseable接口和java.io.Closeable接口的对象。为了支持这个行为,所有可关闭的类将被修改为可以实现一个Closable(可关闭的)接口。
public interface Closeable extends AutoCloseable{}
public abstract class Reader implements Readable, Closeable{}

如果在try语句中写入了没有实现该接口的类,会提示:

The resource type File does not implement java.lang.AutoCloseable

示例:

//java 7 以前
OutputStream fos = null;
try {
    fos = new FileOutputStream("D:/file");
} finally {
    fos.close();
}
//java 7 以后
try(OutputStream fos = new FileOutputStream("D:/file");){
    // 不需要再次指明fos.close();
}
//try子句中可以管理多个资源
public void copyFile(String fromPath, String toPath) throws IOException {  
try ( InputStream input = new FileInputStream(fromPath);  
    OutputStream output = new FileOutputStream(toPath) ) {  
    byte[] buffer = new byte[8192];  
    int len = -1;  
    while( (len=input.read(buffer))!=-1 ) {  
        output.write(buffer, 0, len);  
        }  
    }
}  

捕获多个异常

java7以前在一个方法抛出多个异常时,只能一个个的catch,这样代码会有多个catch,显得很不友好,现在只需一个catch语句,多个异常类型用"|"隔开。 示例:

//java 7 以前
try {
    result = field.get(obj);
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}
//java 7 以后
try {
    result = field.get(obj);
} catch (IllegalArgumentException | IllegalAccessException e) {
    e.printStackTrace();
}

泛型实例化类型自动推断

运用泛型实例化类型自动推断,对通用实例创建(diamond)的type引用进行了改进 示例:

//java 7 以前
List<String> list = new ArrayList<String>();
//java 7 以后
List<String> list = new ArrayList<>();

增加二进制表示

Java7前支持十进制(123)、八进制(0123)、十六进制(0X12AB)

Java7增加二进制表示(0B11110001、0b11110001) 示例:

int binary = 0b0001_1001;
System.out.println("binary is :"+binary);
                binary is :25

数字中可添加分隔符

Java7中支持在数字中间增加'_'作为分隔符,分隔长int以及long(也支持double,float),显示更直观,如(12_123_456)。

下划线只能在数字中间,编译时编译器自动删除数字中的下划线。

示例:

int intOne = 1_000_000;
long longOne = 1_000_000;
double doubleOne = 1_000_000;
float floatOne = 1_000_000;

变长参数方法的优化

参数类型相同时,把重载函数合并到一起了 使用可变参数时,提升编译器的警告和错误信息

public int sum(int... args) {  
    int result = 0;  
    for (int value : args) {  
        result += value;  
    }  
    return result;  
}  

集合类的语法支持

//java 7 以前
List<String> list = new ArrayList<String>();
         list.add("item");
         String item = list.get(0);

         Set<String> set = new HashSet<String>();
         set.add("item");
         Map<String, Integer> map = new HashMap<String, Integer>();
         map.put("key", 1);
         int value = map.get("key");
//java 7 以后
List<String> list = ["item"];
         String item = list[0];

         Set<String> set = {"item"};

         Map<String, Integer> map = {"key" : 1};
         int value = map["key"];         

自动资源管理

Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,Sql classes等。这个新的语言特性允许try语句本身申请更多的资源,这些资源作用于try代码块,并自动关闭。

//java 7 以前
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
    } finally {
        br.close();
}
//java 7 以后
try (BufferedReader br = new BufferedReader(new FileReader(path)) {
    return br.readLine();
}

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

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

Java8 新特性总结

Java8 新增了非常多的特性,我们主要讨论以下几个:

  1. Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
  2. 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
  3. 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
  4. 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
  5. Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
  6. Date Time API − 加强对日期与时间的处理。
  7. Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
  8. Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

Lambda表达式和函数式接口

Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念。很多JVM平台上的语言(Groovy、Scala等)从诞生之日就支持Lambda表达式,但是Java开发者没有选择,只能使用匿名内部类代替Lambda表达式。

Lambda的设计耗费了很多时间和很大的社区力量,最终找到一种折中的实现方案,可以实现简洁而紧凑的语言结构。最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:

Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

在上面这个代码中的参数e的类型是由编译器推理得出的,你也可以显式指定该参数的类型,例如:

Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );

如果Lambda表达式需要更复杂的语句块,则可以使用花括号将该语句块括起来,类似于Java中的函数体,例如:

Arrays.asList( "a", 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_19900687

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值