JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK10特性讲解】

news2024/11/17 11:27:47

JDK各个版本特性讲解-JDK10特性

lecture:波哥

image.png

一、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/

image.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程序员,在声明一个变量时,我们一般都是书写两次变量类型,第一次用于声明变量类型,第二次用于构造器

List<String> list =new ArrayList<>();

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

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

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

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

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

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

image.png

2. 不能使用类型推断的场景

  在有些情况下我们是不能使用类型推断的。具体有如下的场景

2.1 变量的声明

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

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

image.png

2.2 初始值null

  初始值为null的情况也是不行的。因为同样没有办法推断

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

image.png

2.3 lambda表达式

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

image.png

2.4 方法引用

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

image.png

2.5 为数组静态初始化

        //动态初始化数据可以进行类型推断
        var arr =new String[10];
        //静态初始化数组不可以使用类型推断
        var arr2 = {"a12","222","333","444","555"};

image.png

2.6 成员变量不能使用

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

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

image.png

2.7 其他不可以的场景

// 情况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做类名呢?

  1. 这毕竟不是JavaScript

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

三、API层次的变化

1. 集合的copyOf方法

 在JDK10中给集合新增了一个copyOf方法。用来创建只读集合

        // JAVA9中新增创建只读的方法
        var strings1 = List.of("Python", "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.coloradmin.cn/o/70621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cyanine5.5 Tyramide,Cy5.5 Tyramide,花青素Cy5.5 酪酰胺菁染料供应

试剂英文名称&#xff1a;Cyanine5.5 Tyramide&#xff0c;Cy5.5 Tyramide 试剂中文名称&#xff1a;花青素Cy5.5 酪酰胺 Item no&#xff1a;Y-R-3588 Formula&#xff1a;C48H52CIN3O2 MW&#xff1a;738.4 Purity&#xff1a;95% Storage&#xff1a;-20℃可长期保存&…

arthas在线监控和debug

文章目录一. arthas-tunnel-server1.1 制作镜像1.2 k8s部署arthas-tunnel-server1.3 docker-compose部署1.4 Redis缓存二. 源码本地启动2.1 启动后端2.2. 启动前端2.3 启动客户端官方文档 https://arthas.aliyun.com/doc/tunnel.html一. arthas-tunnel-server 1.1 制作镜像 D…

3年以上Android开发者,关于学习 Compose,我的经验总结和建议

缘起 又到一年快结束的日子了 这一年里经历了裁员&#xff0c;跳槽&#xff0c;跑路&#xff0c;也当过面试官面试一些同学。 经历过攻守的角色转换后&#xff0c;沉下心&#xff0c;回顾过往&#xff0c;不由得发出感叹&#xff0c;今年卷的不行。 无论是裁员还是跳槽&…

10 个你应该知道的强大的JavaScript代码片段

JavaScript 现在非常流行&#xff0c;尤其是在 Web 开发中。随着新的 ECMAScript 版本&#xff0c;JavaScript 语法有了很大的改进。因此&#xff0c;JavaScript语言现在具有许多强大且有趣的功能&#xff0c;我们可以作为开发人员在代码中使用它们。 另一件好事是&#xff0c…

跨域解决方法

1.JSONP 前端通过script标签的src属性将回调函数传给服务器&#xff0c;服务器拿到回调函数后&#xff0c;会将数据作为回调函数的参数并将该回调函数返回&#xff0c;前端这边拿到回调函数执行&#xff0c;就可以获取服务端的数据 非直接方式获取数据 并且只支持get&#xf…

PostgreSQL数据库存储结构

PostgreSQL数据库集簇是——多个数据库的集合。 初始化库集簇&#xff1a;INITDB –D $PGDATA来完成。&#xff08;相当于oracle数据库dbca建库&#xff09; pg_ctl -d $PGDATA可以启动数据库 对象标识符&#xff08;OID&#xff09;来对整个数据集簇中唯一的标识数据库对象&a…

一个支持 CRUD 快速开发的 Web 框架,用着太爽

RUD 可谓是程序员又爱又恨的操作了。 爱&#xff0c;大部分的业务基本上都是增删改查的变种&#xff0c;基于增删改查可以实现大部分的业务。 恨&#xff0c;是因为普通的增删改查页面开发占据了大量的时间&#xff0c;非常无聊&#xff0c;同时又不会有技术上的提升。 如何能…

week14|week15 查阅文章总结

带宽的概念 信道容量 参数估计 朴素贝叶斯 数学建模 关联规则 聚类 github http 奈氏准则和香农定理 计算机控制 带宽的概念:带宽的两种概念__Charles_Chen的博客-CSDN博客_带宽的两种含义 信道容量:

【计算机视觉】关键考点

计算机标定 计算机标定的流程&#xff1f; 1.求解内参矩阵和外参矩阵的积H 当一张图片上的标定板角点数量等于4时&#xff0c;即可求得该图片对应的矩阵H 。当一张图片上的标定板角点数量大于4时&#xff0c;利用最小二乘法回归最佳的矩阵H 。 最小二乘法:简单地说就是通过n…

浅谈JVM及原理

JVM一直是java知识里面进阶阶段的重要部分&#xff0c;如果希望在java领域研究的更深入&#xff0c;则JVM则是如论如何也避开不了的话题&#xff0c;本系列试图通过简洁易读的方式&#xff0c;讲解JVM必要的知识点。 运行流程 我们都知道java一直宣传的口号是&#xff1a;一次编…

【SSM项目案例】数据库增删改查-完整代码

一、搭建环境 1&#xff09;spring环境搭建 2&#xff09;spring整合springmvc框架 目的&#xff1a;在controller中能成功调用service对象的方法 在项目启动时&#xff0c;加载applicationContext.xml的配置文件&#xff0c;在web.xml中进行配置 在controller中注入servic…

星巴克激战瑞幸:“咖啡老三们”的危险时刻

老大和老二“打架”&#xff0c;老三却“伤”得不轻。 在国内品牌界&#xff0c;经常出现这种颇有意思的商业现象。凉茶界里的加多宝和王老吉相互厮杀&#xff0c;排在后面的和其正声势渐弱。可口可乐和百事可乐不断较量&#xff0c;结果非常可乐消失了。 眼下在国内的咖啡圈…

这可能是全网最详细的python安装教程(windows)

python安装是学习pyhon第一步&#xff0c;很多刚入门小白不清楚如何安装python&#xff0c;今天我来带大家完成python安装与配置&#xff0c;跟着我一步步来&#xff0c;很简单&#xff0c;你肯定能完成。 第一部分&#xff1a;python安装 &#xff08;一&#xff09;准备工作…

CocosCreator3.4.2源码渲染流程解读

首先上一张脑图镇楼&#xff0c;有些流程还有待后续补充&#xff0c;但是整个刷新过程差不多都完成了。 在上一个xmind文件地址https://download.csdn.net/download/m0_37609239/87254684 接下来就正式开始讲代码&#xff1a; 每帧刷新渲染还是从mainloop开始讲&#xff0c;前面…

华为机试 - 对称美学

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 对称就是最大的美学&#xff0c;现有一道关于对称字符串的美学。已知&#xff1a; 第1个字符串&#xff1a;R第2个字符串&#xff1a;BR第3个字符串&#xff1a;RBBR第4个字符串&#xff1a;BRRBRBBR…

达标的字符串

1、题目 给定一个数 NNN&#xff0c;想象只由 0 和 1 两种字符组成的所欲长度为 NNN 的字符串。 如果某个字符串&#xff0c;任何 0 字符的左边都有 1 紧挨着&#xff0c;认为这个字符串达标。 返回有多少达标的字符串。 2、思路 前几项推导&#xff1a; 两种解法&#x…

【滤波专题-第6篇】小波阈值去噪方法看这一篇就明白了~(附MATLAB实现)

小波阈值去噪的算法是近些年比较流行的一种滤波方法&#xff0c;由于其阈值函数有着众多的改进方式和改进空间&#xff0c;改进阈值函数也往往可以作为创新点和亮点写到论文中&#xff0c;所以对于正在搞相关研究的同学们写论文是比较友好的&#xff08;轻松水论文方式1&#x…

【高并发】超卖一人一单问题

一、超卖问题 1. 超卖场景 高并发场景下用户下单&#xff0c;存在如下所示的超卖问题&#xff0c;其产生的主要原因是一个线程刚读出库存值&#xff0c;还没进行修改时&#xff0c;另一个线程也读出来该库存值&#xff0c;从而导致这两个线程在进行下单时&#xff0c;对同一个…

【无人机】基于Matlab实现四旋翼无人机几何跟踪控制

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …