java10 新特性

简介: java10 新特性

Java 10 新特性

2018年3月21日,Oracle官方宣布Java10正式发布。


需要注意的是 Java 9 和 Java 10 都不是 LTS (Long-Term-Support) 版本。和过去的 Java 大版本升级不同,这两个只有半年左右的开发和维护期。而的 Java 11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本。


JDK10一共定义了109个新特性,其中包含12个JEP(对于程序员来讲真正的新特性其实就一个),还有一些新API和JVM规范以及JAVA语言规范上的改动。


JDK10的12个JEP(JDK Enhancement Proposal特性加强提议)参阅官方文档:JDK 10


286: Local-Variable Type Inference 局部变量类型推断


296: Consolidate the JDK Forest into a Single Repository JDK库的合并


304: Garbage-Collector Interface 统一的垃圾回收接口


307: Parallel Full GC for G1 为G1提供并行的Full GC


310: Application Class-Data Sharing 应用程序类数据(AppCDS)共享


312: Thread-Local Handshakes ThreadLocal握手交互


313: Remove the Native-Header Generation Tool (javah) 移除JDK中附带的javah工具


314: Additional Unicode Language-Tag Extensions 使用附加的Unicode语言标记扩展


316: Heap Allocation on Alternative Memory Devices 能将堆内存占用分配给用户指定 的备用内存设备


317: Experimental Java-Based JIT Compiler 使用基于Java的JIT编译器


319: Root Certificates 根证书 322: Time-Based Release Versioning 基于时间的发布版本

产生背景

开发者经常抱怨Java中引用代码的程度。局部变量的显示类型声明常常被认为是不必须的,给一个好听的名字经常可以很清楚的表达出下面应该怎样继续。

好处:

减少了啰嗦和形式的代码,避免了信息冗余,而且对齐了变量名,更容易阅读!

举例如下:

场景一:类实例化时 作为 Java开发者,在声明一个变量时,我们总是习惯了敲打两次变量

               类型,第 一次用于声明变量类型,第二次用于构造器。

               LinkedHashSet set = new LinkedHashSet<>();

场景二:返回值类型含复杂泛型结构 变量的声明类型书写复杂且较长,尤其是加上泛型的

               使用 Iterator<Map.Entry> iterator = set.iterator();

场景三: 我们也经常声明一种变量,它只会被使用一次,而且是用在下一行代码中, 比如:

URL url = new URL("http://www.atguigu.com");
URLConnection connection = url.openConnection();
Reader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));

尽管 IDE可以帮我们自动完成这些代码,但当变量总是跳来跳去的时候,可读 性还是会受到影响,因为变量类型的名称由各种不同长度的字符组成。而且,有时候开发人员会尽力避免声明中间变量,因为太多的类型声明只会分散注意力,不会带来额外的好处

适用于以下情况:

//1.局部变量的初始化
var list = new ArrayList<>();
//2.增强for循环中的索引
for(var v : list) {
System.out.println(v);
}
//3.传统for循环中
for(var i = 0;i < 100;i++) {
System.out.println(i);
}

在局部变量中使用时,如下情况不适用:

不适用以下的结构中:

情况1:没有初始化的局部变量声明

情况2:方法的返回类型

情况3:方法的参数类型

情况4:构造器的参数类型

情况5:属性

情况6:catch块

工作原理

在处理 var时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行 推断,作为左边变量的类型,然后将该类型写入字节码当中。

注 意

var不是一个关键字 你不需要担心变量名或方法名会与 var发生冲突,因为 var实际上并不是一个关键字, 而是一个类型名,只有在编译器需要知道类型的地方才需要用到它。除此之外,它 就是一个普通合法的标识符。也就是说,除了不能用它作为类名,其他的都可以,但极少人会用它作为类名

这不是JavaScript 首先我要说明的是,var并不会改变Java是一门静态类型语言的事实。编译器负责推 断出类型,并把结果写入字节码文件,就好像是开发人员自己敲入类型一样。 下面是使用 IntelliJ(实际上是 Fernflower的反编译器)反编译器反编译出的代码:

var url = new URL("http://www.atguigu.com");

var connection = url.openConnection();

var reader = new BufferedReader(

                       new InputStreamReader(connection.getInputStream()));

URL url = new URL("http://www.atguigu.com");

URLConnection connection = url.openConnection();

BufferedReader reader = new BufferedReader(

new InputStreamReader(connection.getInputStream()));

从代码来看,就好像之前已经声明了这些类型一样。事实上,这一特性只发 生在编译阶段,与运行时无关,所以对运行时的性能不会产生任何影响。所 以请放心,这不是 JavaScript。

集合新增创建不可变集合的方法


自 Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了 of (jdk9新增)


copyOf (jdk10新增)方法,它们两个都用来创建不可变的集合,来看下它们的 使用和区别。

//示例1:
var list1 = List.of("Java", "Python", "C");
var copy1 = List.copyOf(list1);
System.out.println(list1 == copy1); // true
//示例2:
var list2 = new ArrayList<String>();
var copy2 = List.copyOf(list2);
System.out.println(list2 == copy2); // false
//示例1和2代码基本一致,为什么一个为true,一个为false?


示例1   从 源 码 分 析 , 可 以 看 出 copyOf 方 法 会 先 判 断 来 源 集 合 是 不 是

AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创 建一个新的集合。


示例2     因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,

所以 copyOf 方法又创建了一个新的实例,所以为false。


注意:使用of和copyOf创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常


上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有。


本章笔记是观看尚硅谷的java10特性的视频总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正


目录
相关文章
|
8天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
6天前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第17天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁。Stream API是一种用于处理集合的新工具,它提供了一种高效且易于使用的方式来处理数据。通过结合使用这两个特性,我们可以编写出更加简洁、高效的Java代码。
16 0
|
6天前
|
存储 安全 Java
Java中的这些String特性可能需要了解下
Java中的String特性你知道哪些?虽然String很常见,通过源码可以看到String的值传递、字符串表和不可变性。本文基于JDK17说明。
14 1
|
1天前
|
Java 编译器 C语言
java类和对象的基础特性-2
java类和对象的基础特性
6 0
|
2天前
|
分布式计算 Java 程序员
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第21天】本文主要介绍了Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8引入的一种新的编程方式,它允许我们将函数作为参数传递给其他方法。而Stream API则是一种新的数据处理方式,它允许我们以声明式的方式处理数据,使得代码更加简洁易读。
|
2天前
|
并行计算 Java 大数据
Java 8新特性解析及应用
【5月更文挑战第21天】本文将深入探讨Java 8的新特性,包括Lambda表达式、Stream API、Optional类以及新的日期时间API。我们将详细解析这些特性的使用方法和应用场景,帮助读者更好地理解和应用Java 8的新特性。
|
3天前
|
Java API
Java 8新特性之Lambda表达式
【5月更文挑战第20天】本文将介绍Java 8中的一个重要特性——Lambda表达式。Lambda表达式是Java 8引入的一种新的编程语法,它允许我们将函数作为参数传递给方法,从而实现更加简洁、灵活的代码。本文将从Lambda表达式的基本概念、语法、使用方法以及优缺点等方面进行详细介绍,帮助读者更好地理解和应用Lambda表达式。
|
7天前
|
存储 安全 Java
Java 18新特性
【5月更文挑战第16天】Java 18于2022年3月发布,包含多项新特性和改进,如文件系统链接、文本块、表达式求值API、`ForkJoinPool`优化、`Optional`新方法等。亮点还包括预览特性:Record Pattern Matching for Switch和增强的开关表达式。此外,还有日期时间API扩展、Vector API的进一步孵化、默认UTF-8字符集的研究以及对Security Manager的弃用等。这些更新旨在提升开发效率、性能和安全性。
24 0
|
8天前
|
Java API
Java 8新特性之Lambda表达式与Stream API实践指南
【5月更文挑战第15天】 随着Java语言的不断发展,Java 8作为一个重要的版本,引入了许多令人兴奋的新特性。其中,Lambda表达式和Stream API是Java 8最受关注的两个特性。本文将深入探讨Lambda表达式的基本概念、语法和使用场景,以及如何结合Stream API实现更加简洁、高效的代码编写。通过实例演示,帮助读者快速掌握这两个新特性,提高Java编程能力。
|
8天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
45 2