【小家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);
        }
    }




相关文章
|
4月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
60 3
|
4月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
106 2
|
4月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
56 2
|
4月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
46 3
|
4月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
179 1
|
4月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
133 3
|
2月前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
2月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
102 6
|
3月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
50 4
|
4月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
170 3