Java 9 - 18 各个版本新特性总结

news2024/12/27 13:23:05

【 Java 9 - 18 各个版本新特性总结,B站视频介绍】https://www.bilibili.com/video/BV1PT411P7Wn?vd_source=5a3a58ca0e99223ffb58cddf2f3a7282

一、模块化引入

        模块是 Java 9 中新增的一个组件,可以简单理解为是package的上级容器,是多个package的集合,一个jar可以有多个module,一个module可以有多个package。从代码结构上看:jar > module > package > class, interface

        Java 9 的模块通过 requires 和 exports 关键字,对自身所依赖(requires)的模块和自身暴露(exports)出去的内容(package)进行了声明。本模块只能使用其他模块暴露(exports)出来的内容(package),其他模块也只能使用本模块暴露(exports)出去的内容(package)。

二、String 底层存储结构变化

        对字符串采用更节省空间的内部表达,以提高字符串的内部表示中使用代替编码。

        在 Java8 中String的是实现是将字符存储在一个char类型的数组中,而char类型是由两个字节组成。但是Java官方人员根据上万个应用程序的heap dump信息进行了分析,大多数String对象仅包含Latin-1字符。此类字符只需要一个字节的存储空间,因此String对象内部char中的一半空间其实是未使用的。并且字符串都是用String Pool 来存储的,String Pool 通常使用了 JVM 的 heap 内存空间,Heap 内存空间又是 JVM 垃圾清理程序活动的地方。这样做不仅仅可以提高内存空间的使用率并且还能减少JVM垃圾清理的工作量。

        简单来讲就是:Java8 之前 String 的底层结构类型都是 char[] ,在 Java9 替换成 byte[] 这样就能更节省空间和提高性能。

        之所以替换是因为 之前一直是最小单位是一个char,用到两个byte,但是 Java8 是基于latin1的,而这个latin1编码可以用一个byte标识,所以当你数据明明可以用到一个byte的时候,我们用到了一个最小单位chat两个byte,就多出了一个byte的空间。所以Java9 在这一方面进行了更新,现在的Java9 是基于ISO/latin1/Utf-16  ,latin1和ISO用一个byte标识,UTF-16用两个byte标识,Java9 会自动识别用哪个编码,当数据用到1byte,就会使用iSO或者latin1 ,当空间数据满足2byte的时候,自动使用utf-16,节省了很多空间。

        同理,StringBuilder StringBuffer也更换了底层数据结构。

三、多版本兼容Jar

        多版本JAR(MR JAR)可能包含同一类的多个变体,每个变体都针对特定的Java版本。 在运行时,类的正确变体将被自动加载,这取决于所使用的Java版本。这允许库作者在早期利用新的Java版本,同时保持与旧版本的兼容性。

应用场景:

        比如某个架构师开发了一个工具类MyUtils,该工具类里面使用了jdk9的新特性,这时候该 具在推广的时候会遇到很大的阻力,因为很多用户还没有升级jdk版本,JDK9推出了多版本兼用jar的特性就允许该架构师编写一个同类名的工具MyUtils,并在该工具类中不使用jdk9的新特性,然后两个同类名的类一起打包成为一个jar,提供给用户去使用,这时候即可根据用户当前使用的jdk版本而选择不同的 工具类了。

util.jar
│ MyUtils.class

└─META-INF
   │ MANIFEST.MF
   │
   └─versions
 └─9
  MyUtils.clas

简言之:

        该jar包在java 8中可以执行最上层的MyUtils.class,在Java 9中自动选择执行目录9下的 MyUtils.class。

四、接口私有方法

        当我们在一个接口里写多个默认方法或者静态方法的时候,可能会遇到程序重复的问题。我们可以把这些重复的程序提取出来,创建一个新的方法,用private进行修饰,这样就创造了一个只有接口可以调用 的私有方法。

    public interface UserDao {
        default void methodA(){
            System.out.println("methodA...");
            System.out.println("A....");
            System.out.println("B....");
            System.out.println("C....");

        }

        default void methodB(){
            System.out.println("methodB...");
            System.out.println("A....");
            System.out.println("B....");
            System.out.println("C....");
        }
    } 

        以上代码的methodA与methodB存在着代码冗余问题,我们可以把这部分公共的方法抽取成私有的方法提供给接口内部去使用。

    public interface UserDao {
        default void methodA(){
            System.out.println("methodA...");
            commons();
        }

        default void methodB(){
            System.out.println("methodB...");
            commons();
        }

        //定一个私有的方法,把重复部分的代码抽离出来。然后在methodA与methodB方法内部去调用。
        //私有方法只能在本类中调用,这里包括接口的实现类也不能调用。
        private void commons(){
            System.out.println("A....");
            System.out.println("B....");
            System.out.println("C....");

        }

五、JShell工具 

        针对于Java9来说,相当于cmd工具,可以和cmd一样,直接写方法等等,不过我认为只是适用于初学者做一些最简单的运算和写一些方法。

六、try-with-resources 增强 

         动机:try-with-resources 声明在 JDK 9 已得到改进。如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量

        介绍 :try-with-resources 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。
  • java7之前 try的使用

        这里主要突出必须对资源(比如说IO流)进行显式关闭。
  •  java8 中try的新用法

         这里突出,资源不需要在进行显式关闭,只需要将资源的实例化对象放在try后面的括号中,使用结束后便会自动关闭。

  • java9 中try的变化

       可在try后面的括号中放入已经实例化过的对象。但是需要注意的是:这里所说的实例化对象默认被final修饰,所以在try中不能再对其进行修改,否则会报错;再者,try后面的()可以放入多个实例化对象,对象之间用分号隔开。

七、语法改进(下划线使用限制)

        Java8 之前 String _ ="hello"; 这样的标识符可以用,但在Java9中进行了限制使用。

八、Stream、Optional 增强,集合增强

  • 在原有Stream API 新添加了4个方法,takeWhile、dropWhile、ofNullable、iterate(新重载方法)
  • Optional的增强与优化
  • collection集合类的增强与优化

Java 9 新特性,看这里就明白了 51CTO博客Java 9 新特性,看这里就明白了,摘要:1.目录结构2.repl工具jShell命令3.模块化4.多版本兼容jar包5.接口方法的https://blog.51cto.com/u_15486212/5287850

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560059.html

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

相关文章

Unity shader 变种 multi_compile

官方地址 https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html 变种用我自己的理解就是 能用程序控制的shader 举个例子 这里声明了 a b c d 四个变量(其实是开关 下面会说) 记住 #pragma multi_compile 必须放在 CGPROGRAM 下…

js混淆加密之jsjiami.v6

混淆加密是一种常见的技术,用于隐藏代码的意图和实现细节,增加代码的复杂性,以 ers ers 对代码进行保护, ers ers 并 ers ers 分析和理解代码。以下是一些通用的步骤,用于分析和解密混淆的 JavaScript 代码&#xff1a…

Python实现「数据可视化」的3大步骤,保姆级讲解!

本篇文章主要使用了matplotlib进行案例分析,希望对正在从事&学习数据分析的你有所帮助。 Python实现可视化的三个步骤: 确定问题,选择图形 转换数据,应用函数 参数设置,一目了然 01 画图: 首先&am…

618前夜,电商物流「涌向」B2B战场

随着终端交易场景的增长红利消失殆尽,电商平台需要在产业侧寻找到新的企业支点,这里的背景布不再是熟悉的电商战场,而是红海重重的B2B场域。 作者|斗斗 编辑|皮爷 出品|产业家 电商平台开始在B端寻找新的交易环节。 随着人口红利逐渐…

「.XD 文件 」用什么软件打开?

1、什么是「.XD 文件 」 「.XD 文件 」其实是 Adobe XD 文件格式。而 Adobe XD 是一款基于矢量的一站式 UI/UX 设计工具,可以进行移动应用和网页设计与原1型制作,从早期的构思和低保真设计,一直到令人印象深刻的动画和逼真的原型&#xff0c…

RSD的伪三维(3D)遥感图像

李国春 3D对象的背后是3D模型,用点面数据描述现实世界的物体,通过材质视角光线等条件的渲染得到比较逼真的展示效果。但这里给大家介绍的伪3D则不然,将通常的遥感影像加上高程数据,不使用3D对象模型,实现一种自顶向下…

【JAVA凝气】异常篇

哈喽~大家好呀,这篇来看看JAVA异常篇。 目录 一、前言 二、Exception 异常 1、Java 的非检查性异常 2、Java 检查性异常类 三、Error 错误 四、捕获异常 五、多重捕获块 六、throws/throw 关键字 七、自定义异常类 八、图书推荐 一、前言 异常是程序中的一…

k8s上部署Alluxio:v2.9.1经验总结

1.采用helm安装 配置文件下载地址 https://github.com/Alluxio/alluxio/tree/v2.9.1 直接将如下图所示的文件传到K8s集群的master节点 values.yaml为alluxio的配置文件,在里面可以配置一些属性,如挂载点、文件读写的一些配置、worker存储介质的配置&a…

100天精通Python(可视化篇)——第88天:全网最全Seaborn库常用绘图3万字总结(参数说明+案例实战)

文章目录 一、Seaborn介绍1.1 介绍1.2 安装1.3 风格设置1.3.1 style(风格)1.3.2 context(环境设置) 1.4 调色盘设置1.5 数据集下载 二、Relational plots(关系图)2.1 scatterplot(散点图&#x…

常见的几种设计模式——单例、工厂、代理、模板

文章目录 前言一、工厂模式1、介绍2、实现 二、单例模式1.介绍2.实现3、懒汉与饿汉 三、代理模式1、介绍2、实现3、AOP的底层实现 四、模板模式1、介绍2、实现 总结 前言 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过…

某书最新版X-s(2023/5/23更新)

前不久刚写过xhs的x-s, 前几天听一些小伙伴说又更新了,我二话不说还按原先的逆向思路,直接搜function sign,开始施展补环境大法。。。 一顿无用的折腾,补完后,测试发现死活不成功,这真是离了大谱了。 对比了一下,通过补环境,sign生成的x-s: 浏览器的x-s: 很明显…

MySQL-3-创建表、删除表、增删改、约束、索引

一、创建表 语法格式&#xff1a; create table <表名>( 字段名1 数据类型&#xff0c; 字段名2 数据类型&#xff0c; … ); 补充&#xff1a;MySQL中常见的数据类型 int 整数&#xff08;对应Java中的int&#xff09; bigint 长整型&#xff08;对应Java中的long&#…

我叫缺陷,也叫Bug,下面介绍一下我的生命周期

我叫缺陷&#xff0c;从被创建至关闭&#xff0c;到最后做缺陷分析&#xff0c;这是我的完整生命周期。我的整个生命周期贯穿着整个项目的项目周期&#xff0c;因此&#xff0c;掌握我的生命周期&#xff0c;不止是测试人员必修的课程&#xff0c;也是测试人员的灵魂。 缺陷的定…

强化学习系列之Policy Gradient算法

一. 背景 1.1 基础组成部分 强化学习里面包含三个部件:Actor,environment,reward function Actor : 表示角色,是能够被玩家控制的。 Policy of Actor:在人工智能中,Policy π \pi π 可以表示为一个神经网络,参数为 θ \theta

C# MVC 微信支付之小程序红包

最近有个项目增加导游引流功能&#xff0c;因为项目只用的小程序&#xff0c;没有使用公众号&#xff0c;没法用”现金红包“功能&#xff0c;开通商家转账到零钱需要7-14天才能申请下来&#xff0c;暂时先用小程序红包顶上&#xff0c;一路都是坑啊&#xff0c;特此记录下。 官…

docker常规命令使用

docker 操作 命令分类 启动类、镜像、容器 docker服务启动 systemctl start docker docker 版本查看 docker version 列出本机所有镜像 docker images 在远程仓库中查找镜像 docker search --limit 5 redis //从仓库中查找点赞数前5的redis镜像 从远程仓库中拉取镜像 docker …

Wireshark - 过滤表达式的规则

文章目录 1. 过滤 协议2. 过滤 端口3. 过滤 IP4. 过滤 TCP重传数据包5. 包长度过滤6. <未完待续2023.5.23> 1. 过滤 协议 1、TCP - 只显示TCP协议2、!TCP - 排除TCP协议 2. 过滤 端口 1、tcp.port6666 - 显示&#xff08;不分来源或目标&#xff09;端口2、tcp.dstp…

Hadoop完全分布式搭建

主机设置 三台主机关闭防火墙 三台主机关闭SeLinux安全机制 给每台主机修改主机名 配置三台主机地址映射 设置免密登录 安装JDK 解压安装 配置jdk的环境变量 测试安装成功 分发JDK 安装配置 Hadoop 解压安装 Hadoop环境配置文件 - hadoop-env.sh 修改Hadoop…

【电商必备】增长销售和客户在线支持的网站即时聊天(一)

科技的进步无疑令商业世界更加国际化&#xff0c;你的公司一定有来自世界各地的客户。试想一下&#xff0c;你的公司本部在亚洲&#xff0c;但有国外的客户在非工作时间透过Google搜寻到你公司&#xff0c;并有疑问期望实时得到回复&#xff0c;我们可以如何解决时差的问题呢&a…

MySQL 事务篇

事务有哪些特性&#xff1f; 原子性&#xff1a; 一个事务中的所有操作&#xff0c;必须全部执行。要么全部完成要么就不完成。中间如果出现错误&#xff0c;就要回滚到初始状态。 持久性&#xff1a; 事务处理结束后&#xff0c;对数据的修改就是永久的&#xff0c;就是系统故…