【小家java】java9新特性(简述十大新特性) 褒贬不一(中)

简介: 【小家java】java9新特性(简述十大新特性) 褒贬不一(中)

3、多版本兼容 jar 包(这个在处理向下兼容方面,非常好用)


当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会

切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老

的 Java 版本(许多情况下就是 Java 6 或者 Java7)。这实际上意味着

未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。

幸运的是,多版本兼容 jar 功能能让你创建仅在特定版本的 Java 环境

中运行库程序选择使用的 class 版本


案例:略


4、语法改进:接口的私有方法


在 Java 9 中,接口更加的灵活和强大,连方法的访问权限修饰符

都可以声明为 private 的了,此时方法将不会成为你对外暴露的 API

的一部分(个人认为,这肯定是JDK8遗漏了的一个点,哈哈)

看个例子:


 public static String staticFun() {
        privateFun();
        return "";
    }
    default String defaultFun() {
        privateFun();
        return "";
    }
    private static void privateFun() {
        System.out.println("我是私有方法~");
    }


这样子是没有问题,可以正常调用和使用的。但是需要注意一下两点


  1. 私有方法可以是static,也可以不是。看你需要default方法调用还是static方法调用


  1. 私有方法只能用private修饰,不能用protected。若不写,默认就是public,就是普通静态方法了。


default String defaultFun() {
        privateFun();
        return "";
    }
    private void privateFun() {
        System.out.println("我是私有方法~");
    }


4、语法改进:钻石操作符(Diamond Operator)使用升级 泛型


在 java 8 中如下的操作是会报错的:


 public static void main(String[] args) {
        Set<String> set1 = new HashSet<>(); //最常用的初始化
        //Set<String> set2 = new HashSet<>(){}; //在JDK8中报错
        Set<String> set2 = new HashSet<String>(){}; //这样在JDK8中也正常
        Set<String> set3 = new HashSet<String>(){{}}; //这样也都是正常的
    }


由此课件,报错的那种情况是因为在JDK8中,还不能直接推断出钻石操作符里面的类型而报错。而我们在JDK9以后,就可以直接这么写了:


public static void main(String[] args) {
        Set<String> set1 = new HashSet<>(); //最常用的初始化
        Set<String> set2 = new HashSet<>(){}; //在JDK8中报错
        Set<String> set3 = new HashSet<>(){{}}; //这样也都是正常的
    }


这样写都是不会报错,可以直接书写使用的。相当于直接创建了一个HashMap的子类。


5、语法改进:UnderScore(下划线)使用的限制


这个点非常的小。距离说明就懂了


在Java8中,我们给变量取名直接就是_


public static void main(String[] args) {
       String _ = "hello";
       System.out.println(_); //hello
    }


image.png


我们很清晰的看到,Java8其实给出了提示,但是编译运行都是能通过的,而到了Java9:


image.png


直接就提示_是关键字,编译都过不了了。


6、底层结构:String 存储结构变更(这个很重要)


UTF-8表示一个字符是个动态的过程,可以能用1、2、3个字节都是有可能的。但是UTF-16明确的就是不管你是拉丁文、中文等,都是恒定的用两个字节表示


JDK8的字符串存储在char类型的数组里面,不难想象在绝大多数情况下,char类型只需要一个字节就能表示出来了,比如各种字母什么的,两个字节存储势必会浪费空间,JDK9的一个优化就在这,内存的优化。


Java8:


private final char value[];


Java9:


private final byte[] value;


结论:String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标

记,节约了不少空间。由于底层用了字节数组byte[]来存储,所以遇上非拉丁文,JDK9配合了一个encodingFlag来配合编码解码的


so,相应的StringBuffer 和 StringBuilder 也对应的做出了对应的变化。


有的人担心,这会不会影响到我的charAt方法呢?那我们来看看:


public static void main(String[] args) {
        String str = "hello";
        String china = "方世享";
        System.out.println(str.charAt(1)); //e
        System.out.println(china.charAt(1)); //世
    }


显然,这个对上层的调用者是完全透明的,完全是底层的数据结构存储而已。但是有必要对比一下源码,还是有非常大的区别的:


java8的charAt方法源码: 实现起来简单很多吧


 public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }

java9的charAt方法源码:


public char charAt(int index) {
        if (isLatin1()) {
            return StringLatin1.charAt(value, index);
        } else {
            return StringUTF16.charAt(value, index);
        }
    }




相关文章
|
3月前
|
安全 Java API
Java 17 + 特性与现代开发技术实操应用详解
本指南聚焦Java 17+最新技术,涵盖模块化开发、Record类、模式匹配、文本块、Stream API增强、虚拟线程等核心特性,结合Spring Boot 3与Micronaut框架实战。通过实操案例解析现代Java开发技术栈,包括高性能并发编程、GraalVM原生编译及开发工具链配置。同时梳理面试高频考点,助力掌握Java新特性和实际应用,适合学习与项目实践。代码示例丰富,附带完整资源下载链接。
333 0
|
5月前
|
数据采集 监控 Oracle
GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩
阿里巴巴是 GraalVM 全球顾问委员会的唯一中国代表,阿里云程序语言与编译器团队和可观测团队合作实现了 GraalVM 应用的无侵入可观测能力,并在 ARMS 平台上线了该功能。目前在 GraalVM 24 中发布的是支持 Java agent 的第一步,其余能力将在 GraalVM 的后续版本中陆续发布。
394 22
|
4月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
143 0
|
2月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
117 1
|
2月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
143 1
|
2月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
96 2
|
11月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
126 3
|
11月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
203 2