JAVA10新特性

news/2024/7/23 19:27:42 标签: jvm, java, 开发语言

JAVA10新特性

概述

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

JAVA9和java10 都不是 LTS (Long-Term-Support)版本.和过去的JAVA大版本升级不同,这两个只有半年左右的开发和维护时间. 而JAVA11 也是就是18.9,才是JAVA之后的第一个长期支持版本

JAVA10 一共定义了109个新特性,其中包含JEP,对程序员来说,真正的新特性也就一个,还有一些新的API和JVM规范以及JAVA语言规范上的改动.

JAVA10 的12个JEP (JDK Enhancement Proposal特性加强协议) ,可参阅官方文档 http://openjdk.java.net/projects/jdk/10/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DfLUaMIc-1683361813385)(C:/Users/asus/Desktop/JDK各版本新特性课程资料/JDK各版本新特性.assets/1630388526815.png)]

286: 局部变量类型推断

296: JDK库合并

304: 统一的垃圾回收接口

307:为G1提供并行的Full GC

310:应用程序类数据共享

312: ThreadLocal握手交互

313: 移除JDK中附带的javah工具

314: 使用附加的Unicode语言标记拓展

316:能将对内存占用分配给用户指定的备用内存设备

317:使用基于JAVA的JIT编译器

319: 根证书

322:基于时间的发布版本

一 语法层次的变化

1_局部变量的类型推断

局部变量的显示类型声明,常常认为是不必须的,给一个好听的名字经常可以很清楚的表达出下面应该怎样继续.减少了啰嗦和形式的代码,避免了信息的冗余,而且对齐了变量名,容易阅读

作为JAVA程序员,在声明一个变量时,我们一般都是书写两次变量类型,第一次用于声明变量类型,第二次用于构造器

java">ArrayList<String> list =new ArrayList<>();

变量的声明类型书写复杂且较长,尤其是加上泛型的使用

java">Iterator<Map.Entry<Integer,Student>> iterator=set.iterator();

我们也经常声明一种变量,它只被使用一次,并且是在下一行代码中

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

总之: 变量标识符(变量名)就可以让我清楚的知道变量如何使用,没必要前面加上一大串的类型声明

局部变量推断有点类似JavaScript中的弱变量类型的写法,通过后面的数据来推断前面的数据类型,数据类型的声明统一为var

java">public void test1(){
    // 局部变量,根据所赋的值,推断变量的类型
    var num =10;
    var arrayList =new ArrayList<String>();
    // 遍历操作
    for(var i : arrayList){
        System.out.println(i);
        System.out.println(i.getClass());
    }
    // 普通的遍历操作
    for(int i =0;i<100;i++){
        System.out.println(i);
    }
    // 推断类型的遍历操作
    for(var i =0;i<100;i++){
        System.out.println(i);
    }
    
}

什么情况下不能使用类型推断

1 变量的声明不能使用类型推断,因为无法推断

java">// 根据右边的数据推断类型,不赋值压根没给推断的机会,这是错的
var name;

2 初始值为null

java">        // null值无法推断数据类型,这是不能使用类型推断
        var str =null;

3 lambda表达式

java">        // 这是OK的
        Supplier<Double> supplier=()-> Math.random();
        // 这是不OK的 lambda表达式需要显式数据类型,不然无法明确是哪个接口
        var supplier2=()->Math.random();

4 方法引用

java">        // 这是可以的进行方法引用的
        Consumer<String> consumer=System.out::println;
        // 这是不可以的,无法明确接口类型
        var consumer2=System.out::println;

5 为数组静态初始化

java">        //动态初始化数据可以进行类型推断
        var arr =new String[10];
        //静态初始化数组不可以使用类型推断 
        var arr2 ={"asdf","qwer","zxcv","tyui","ghjk"};

6 类型推断仅仅是局部变量,成员变量不可以使用类型推断

java">public class Test1 {
    // 成员变量不能使用类型推断
    var name="小明";
    public void testMethod1(){
        // 局部变量可以使用类型推断
        var localname="小明";
    }
}

7 其他不可以推断的情况

java">// 情况1 没有初始化的局部变量声明
var s; var x=null;
// 情况2 方法的返回值类型
public var test1()
// 情况3 方法的参数类型
public void test2(var a,var b)
// 情况4 构造器的参数类型
public Person(var name,var age)
// 情况5 属性
class Person{
    var name;
}
// 情况6 catch块
try{
}catch(var e){
}

以下两点需要注意

1 var不是一个关键字

我们无需担心变量名或者方法名会与var发生冲突,因为var实际上不是一个关键字,而是一个类型名,只有在编译器需要知道类型的地方法才会用到它.除此之外,他就是一个普通的合法标识符.也就是说,除了不能用它做类名,其他都可以.但是又有哪个傻瓜非要用var做类名呢?

2 这毕竟不是JavaScript

var并不会改变java是一门静态语言的事实,编译器负责推断出类型,并把结果写入字节码,也就是说,数据类型还是在字节码中的,java还是属于强类型的编程语言,开发人员没有明确写出来而已.而JavaScript是弱类型解释型的脚本语言,和这里的类型推断是两回事.

二 API层次的变化

1_集合中新增copyOf创建只读集合

java">        // JAVA9中新增创建只读的方法
        var strings1 = List.of("MCA", "JAVA", "Golang");
        // JAVA10中新增的创建只读集合的方法
        var strings2 = List.copyOf(strings1);
        // 判断两个集合在内存上是否是同一个,结果为true
        System.out.println(strings1==strings2);

        // 创建一个普通集合
        var strings3=new ArrayList<String>();
        // 通过copyOf方法创建一个只读集合
        var strings4 = List.copyOf(strings3);
        // 判断两个集合在内存上是否是同一个,结果为false
        System.out.println(strings3==strings4);

结论:copyOf方法的作用通过一个集合返回的是一个只读集合,如果参数本来就是只读集合,那么返回的就是参数,如果参数不是只读集合,就再创造一个只读集合返回


http://www.niftyadmin.cn/n/296326.html

相关文章

SpringBoot整合Echarts实现用户人数和性别展示

一、背景 在Web应用开发中&#xff0c;经常需要使用图表来展示数据&#xff0c;而Echarts是一个非常优秀的图表库。SpringBoot是一个非常流行的Java Web框架&#xff0c;它可以快速搭建Web应用。本文将介绍如何使用SpringBoot集成Echarts&#xff0c;实现展示用户人数和性别的…

力扣刷题Day12_2

144.二叉树的前序遍历 测试代码main() class TreeNode:def __init__(self, valNone, leftNone, rightNone):self.val valself.left leftself.right rightfrom typing import Listclass Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:s Solution…

IBMMQ 下载地址 -- 安装

https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/ 这里给出IBM MQ在CentOS上安装的详细步骤&#xff1a; 1. 首先&#xff0c;下载IBM MQ软件包。你需要到IBM网站上注册并且登录&#xff0c;然后下载IBM MQ的安装包。需要下载的文件有两个&…

Vben Admin 自学记录 —— Modal弹窗组件的基本使用及练习(持续更新中...)

Modal 弹窗 对 antv 的 modal 组件进行封装&#xff0c;扩展拖拽&#xff0c;全屏&#xff0c;自适应高度等功能。 Modal相关使用及概念 练习 —— 在之前table基础上&#xff0c;添加编辑功能&#xff0c;点击编辑按钮&#xff0c;弹出弹窗显示单条表格数据&#xff0c;数据…

css3 flex弹性布局详解

css3 flex弹性布局详解 一、flexbox弹性盒子 2009年&#xff0c;W3C 提出了一种新的方案----Flex 布局&#xff0c;可以简便、完整、响应式地实现各种页面布局。目前&#xff0c;它已经得到了所有浏览器的支持&#xff0c;这意味着&#xff0c;现在就能很安全地使用这项功能。…

ffmpeg mp4 AES-128加密 ts 分片处理

1-1 加密分割 目标&#xff1a; 将一个mp4视频文件切割为多个ts片段&#xff0c;并在切割过程中对每一个片段使用 AES-128 加密&#xff0c;最后生成一个m3u8的视频索引文件&#xff1b; step1&#xff1a; 加密需要的材料 如果要加密&#xff0c;首先准备好一下两个东西&…

FreeRTOS 内存管理

文章目录 一、FreeRTOS 内存管理简介二、 内存碎片三、heap_1 内存分配方法1. 分配方法简介2. 内存申请函数详解3. 内存释放函数详解 四、heap_2 内存分配方法1. 分配方法简介2. 内存块详解3. 内存堆初始化函数详解4. 内存块插入函数详解5. 内存申请函数详解6. 内存释放函数详解…

执行网格中有特定数量节点的传感器网络部署(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​无线传感器网络是通过大量分布的传感器节点作为终端来协同感知和自主地监测外部世界,以多跳、自组织或协作的方式进行通信和…