G1 成为默认垃圾回收器

在 Java 8 的时候,默认垃圾回收器是 Parallel Scavenge(新生代)+Parallel Old(老年代)。到了 Java 9, CMS 垃圾回收器被废弃了,G1(Garbage-First Garbage Collector) 成为了默认垃圾回收器。

G1 还是在 Java 7 中被引入的,经过两个版本优异的表现成为成为默认垃圾回收器。

集合新增工厂方法

增加了List.of()Set.of()Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合(有点参考 Guava 的味道)

使用 of() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。

        List list = List.of("张三", "李四", "王五", "赵六", "田七"); list.forEach(System.out::println);Set set = Set.of("张三", "李四", "王五", "赵六", "田七");set.forEach(System.out::println);Map map = Map.of("张三","张三", "李四","李四", "王五","王五", "赵六","赵六", "田七", "田七");map.forEach((k,v)->{System.out.println("k: "+k+"   v: "+v);});list.add("xx"); //抛异常

String 存储结构优化

Java 8 及之前的版本,String 一直是用 char[] 存储。在 Java 9 之后,String 的实现改用 byte[] 数组存储字符串,节省了空间。

String类的当前实现将字符存储在char数组中,每个字符使用两个字节(十六位)。从许多不同应用程序收集的数据表明,字符串是堆使用的主要组成部分,此外,大多数String对象只包含Latin-1个字符。此类字符只需要一个字节的存储空间,因此此类String对象的内部char数组中有一半的空间未被使用。

java8String

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];

java9String

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/*** The value is used for character storage.** @implNote This field is trusted by the VM, and is a subject to* constant folding if String instance is constant. Overwriting this* field after construction will cause problems.** Additionally, it is marked with {@link Stable} to trust the contents* of the array. No other facility in JDK provides this functionality (yet).* {@link Stable} is safe here, because value is never null.*/@Stableprivate final byte[] value;

改进的 Stream API

         java 的 Steam API 是java标准库最好的改进之一, 让开发者能够快速运算,从而能够有效的利用数据并行计算。 Java 8 提供的 Steam 能够利用多核架构实现声明式的数据处理。
在 Java 9 中, Stream API 变得更好, Stream 接口中添加了 4 个新的方法:
takeWhile, dropWhile, ofNullable,还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
除了对 Stream 本身的扩展, Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 stream() 将一个 Optional 对象转换为一个(可能是空的) Stream 对象。

ofNullable 方法

        当创建流的元素可能为空时,使用ofNullable()方法代替of()方法可以预防 NullPointerExceptions 异常,创建流时可以省去判空的逻辑条件。元素为null返回空流,否则返回正常流。

public static<T> Stream<T> ofNullable(T t) {return t == null ? Stream.empty(): StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
        Stream<Object> objectStream1 = Stream.ofNullable(null);//不报错Stream<Object> objectStream = Stream.of(null);//报错

takeWhile

takeWhile() 方法使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false。如果第一个值不满足断言条件,将返回一个空的 Stream。

takeWhile() 方法在有序的 Stream 中,takeWhile 返回从开头开始到不符合断言条件的前一个元素;在无序的 Stream 中,takeWhile 返回从开头开始的符合 Predicate 要求的所有元素的子集(包括空集)

        List<String> list = List.of("a", "b", "c", "", "e", "f");Set<String> set = Set.of("a", "b", "c", "", "e", "f");//abclist.stream().takeWhile(s -> !s.isEmpty()).forEach(System.out::print);System.out.println();//efabc 可能得结果a/ab/abc/abcef/b/bc/bcef/c/ce/cef/e/ef/f/空 且顺序是乱的set.stream().takeWhile(s -> !s.isEmpty()).forEach(System.out::print);System.out.println();//bac 顺序可能会乱但是稳定一直是abc三个元素list.parallelStream().takeWhile(s -> !s.isEmpty()).forEach(System.out::print);System.out.println();//bef 同第二条set.parallelStream().takeWhile(s -> !s.isEmpty()).forEach(System.out::print);

dropWhile

dropWhile 方法和 takeWhile 作用相反的,使用一个断言作为参数,直到断言语句第一次返回 false 才返回给定 Stream 的子集。

dropWhile () 方法在有序的 Stream 中,takeWhile 返回从不符合断言条件的后一个元素开始到结尾,并行流也一样

dropWhile () 方法在无序的 顺序Stream 中,返回从开头开始的符合 Predicate 要求的所有元素的子集(包括空集)。并行流只要中间有不符合的元素则返回null

        List<String> list = List.of("a", "b", "c", "", "e", "f");Set<String> set = Set.of("a", "b", "c", "", "e", "f");//eflist.stream().dropWhile(s -> !s.isEmpty()).forEach(System.out::print);System.out.println();//efabc 可能得结果a/ab/abc/abcef/b/bc/bcef/c/ce/cef/e/ef/f/空 且顺序是乱的set.stream().dropWhile(s -> !s.isEmpty()).forEach(System.out::print);System.out.println();//eflist.parallelStream().dropWhile(s -> !s.isEmpty()).forEach(System.out::print);System.out.println();// nullset.parallelStream().dropWhile(s -> !s.isEmpty()).forEach(System.out::print);

iterate

方法允许使用初始种子值创建顺序(可能是无限)流,并迭代应用指定的下一个方法。 当指定的 hasNext 的 predicate 返回 false 时,迭代停止。

第一个参数是int类型,第二个参数是迭代条件,第三个参数返回值作为下一次迭代的初始值

public static IntStream iterate(int seed, IntPredicate hasNext, IntUnaryOperator next) {Objects.requireNonNull(next);Objects.requireNonNull(hasNext);Spliterator.OfInt spliterator = new Spliterators.AbstractIntSpliterator(Long.MAX_VALUE,Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL) {int prev;boolean started, finished;@Overridepublic boolean tryAdvance(IntConsumer action) {Objects.requireNonNull(action);if (finished)return false;int t;if (started)t = next.applyAsInt(prev);else {t = seed;started = true;}if (!hasNext.test(t)) {finished = true;return false;}action.accept(prev = t);return true;}@Overridepublic void forEachRemaining(IntConsumer action) {Objects.requireNonNull(action);if (finished)return;finished = true;int t = started ? next.applyAsInt(prev) : seed;while (hasNext.test(t)) {action.accept(t);t = next.applyAsInt(t);}}};return StreamSupport.intStream(spliterator, false);
}
        IntStream.iterate(-1, a -> true, a -> a + 1).forEach(System.out::println);

Optional 增强

Optional 类在 Java 8 中引入,Optional 类的引入很好的解决空指针异常。在 Java 9 中, 添加了三个方法来改进它的功能:

  • stream()
  • ifPresentOrElse()
  • or()

stream() 

stream 方法的作用就是将 Optional 转为一个 Stream,如果该 Optional 中包含值,那么就返回包含这个值的 Stream,否则返回一个空的 Stream(Stream.empty())。

        List<Optional<String>> list = Arrays.asList (Optional.empty(),Optional.of("A"),Optional.empty(),Optional.of("B"));List<String> collect = list.stream().flatMap(Optional::stream).collect(Collectors.toList());System.out.println(collect);

ifPresentOrElse() 

ifPresentOrElse 方法的改进就是有了 else,接受两个参数 Consumer 和 Runnable。

ifPresentOrElse 方法的用途是,如果一个 Optional 包含值,则对其包含的值调用函数 action,即 action.accept(value),这与 ifPresent 一致;与 ifPresent 方法的区别在于,ifPresentOrElse 还有第二个参数 emptyAction —— 如果 Optional 不包含值,那么 ifPresentOrElse 便会调用 emptyAction,即 emptyAction.run()。虽然是.run(),但也是同步方法,不是异步

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {if (value != null) {action.accept(value);} else {emptyAction.run();}
}
        Optional<Integer>  optional = Optional.empty();optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->{try {Thread.sleep(200);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("Not Present.");}    );Optional<Integer>  optional1 = Optional.of(1);optional1.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->System.out.println("Not Present."));

or() 

如果值存在,返回 Optional 指定的值,否则返回一个预设的值。

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {Objects.requireNonNull(supplier);if (isPresent()) {return this;} else {@SuppressWarnings("unchecked")Optional<T> r = (Optional<T>) supplier.get();return Objects.requireNonNull(r);}
}
        Optional<String> optional = Optional.empty();optional = optional.or( () -> Optional.of("Not Present"));//Value: Not Presentoptional.ifPresent( x -> System.out.println("Value: " + x));Optional<String> optional1 = Optional.of("1");optional1 = optional1.or( () -> Optional.of("Not Present"));//Value: 1optional1.ifPresent( x -> System.out.println("Value: " + x));

私有接口方法

在 Java 8之前,接口可以有常量变量和抽象方法。

我们不能在接口中提供方法实现。如果我们要提供抽象方法和非抽象方法(方法与实现)的组合,那么我们就得使用抽象类。

在 Java 8 接口引入了一些新功能——默认方法和静态方法。我们可以在Java SE 8的接口中编写方法实现,仅仅需要使用 default 关键字来定义它们。

在 Java 8 中,一个接口中能定义如下几种变量/方法:

  • 常量
  • 抽象方法
  • 默认方法
  • 静态方法

Java 9 不仅像 Java 8 一样支持接口默认方法,同时还支持私有方法。

在 Java 9 中,一个接口中能定义如下几种变量/方法:

  • 常量
  • 抽象方法
  • 默认方法
  • 静态方法
  • 私有方法
  • 私有静态方法
public interface java9StudyInterface {// 默认方法default void process() {readData();analyzeData();writeResult();}// 私有工具方法(仅接口内部使用)private void readData() {System.out.println("读取数据");}private void writeResult() {System.out.println("写入结果");}// 抽象方法(由实现类提供)void analyzeData();
}
public class java9StudyClazz implements java9StudyInterface {@Overridepublic void analyzeData() {System.out.println("analyzeData");}
}
        java9StudyInterface java9StudyClazz = new java9StudyClazz();java9StudyClazz.process();输出:读取数据analyzeData写入结果

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【github.io静态网页 怎么使用 github.io 搭建一个简单的网页?】

这里是一张展示 GitHub Pages 静态网站架构与部署流程的示意图&#xff0c;可以帮助你更直观理解整个流程。 要使用 github.io&#xff08;GitHub Pages&#xff09;搭建一个简单的网页&#xff0c;你可以按照以下步骤操作&#xff1a; 快速入门&#xff1a;个人网站&#xff…

记录一次ubuntu20.04 解决gmock not found问题的过程

在电脑上源码编译moveit&#xff0c;系统是ubuntu20.04&#xff0c;有三个电脑&#xff0c;分别叫做A,B,C好了&#xff0c;A和C都可以很顺畅地走流程编译通过&#xff0c;但是B遇到了gmock not found的问题&#xff0c;一开始没当回事&#xff0c;感觉重装下库&#xff0c;或者…

Java基础编程核心案例:从逻辑到应用

Java编程的核心在于将逻辑思维转化为可执行的代码。本专栏通过8个实用案例&#xff0c;覆盖条件判断、循环结构、数组操作、用户交互等基础知识点&#xff0c;展示如何用Java解决实际问题&#xff0c;从简单游戏到数据计算&#xff0c;逐步构建编程思维。 案例一&#xff1a;剪…

Starlink卫星终端对星策略是终端自主执行的还是网管中心调度的?

以下文章首先来源于Google Gemini的Deep Research的内容,在Deep Research的报告参考了SpaceX公开信息、FCC技术报告、相关专利(如US9906292B2)以及学术研究的综合分析,并参考了RFWirelessWorld和APNIC博客等二次来源。 文章完成之后,前后发给了Grok和deepseek,让Grok和d…

【CDA案例】数据分析案例拆解:解锁数据分析全流程!

在当今数字化时代&#xff0c;数据如同一座座金矿&#xff0c;蕴含着巨大的价值。企业、组织乃至个人都渴望从海量的数据中挖掘出有用的信息&#xff0c;以指导决策、优化运营、提升竞争力。今天我们以一个实际的数据分析案例为蓝本&#xff0c;深入拆解其全过程&#xff0c;带…

vulnhub-drippingblues靶场攻略

1.打开靶场&#xff0c;我们将网络连接方式改为NAT模式2.然后使用nmap扫描一下nat的网段3.存在21&#xff0c;22&#xff0c;80端口我们先来看一下21端口的ftp协议&#xff0c;发现可以直接匿名登录&#xff0c;并且可以下载存在的东西4.但是这个压缩包被加密了&#xff0c;我们…

afsim2.9_使用QtCreator和VSCode编译

使用QtCreator和VSCode编译AFSIM2.9源代码指南 准备工作 在开始编译AFSIM2.9源代码前&#xff0c;需要确保您的开发环境满足以下条件&#xff1a; 安装QtCreator安装Visual Studio Code&#xff08;最新稳定版&#xff09;获取AFSIM2.9源代码包安装必要的编译工具链&#xf…

TC39x STM(System Timer)学习记录

STM有哪些特性&#xff1f;自由运行的 64 位计数器所有 64 位可同步读取可同步读取 64 位计数器的不同 32 位部分基于与 STM 部分内容的比较匹配&#xff0c;灵活地产生服务请求在应用复位后自动开始计数若 ARSTDIS.STMxDIS 位清零&#xff0c;应用复位将复位 STM 寄存器&#…

css初学者第四天

<1>snipaste工具的使用snipaste是一个简单但强大的截图工具&#xff0c;也可以让你将截图贴回屏幕上。常用的快捷方式&#xff1a;1、F1可以截图&#xff0c;同时测量大小&#xff0c;设置箭头 书写文字等2、F3在桌面置顶显示3、点击图片&#xff0c;alt可以取色&#xf…

CompletableFuture实现Excel 多个sheet页批量导出

CompletableFuture实现Excel 多个sheet页批量导出 文章目录 CompletableFuture实现Excel 多个sheet页批量导出 为什么不能直接合并文件或Sheet? 我的方案合理性 1. 操作实现步骤 1.1、导入所需要的依赖 1.2 、Excel 导入导出对象 1.3、异步生成 Excel 文件到指定路径 1.4、合并…

搭建本地 Git 服务器

以下是搭建本地 Git 服务器的通用步骤&#xff0c;支持团队协作或私有仓库管理&#xff1a;方法 1&#xff1a;基于 SSH 的简单部署&#xff08;适合小团队&#xff09; 步骤 1&#xff1a;安装 Git 在服务器上安装 Git&#xff08;以 Ubuntu 为例&#xff09;&#xff1a; sud…

【Matplotlib】中文显示问题

中文显示问题本地Mac上作图&#xff0c;可以方便地实现中文字体显示。比如在Jupter中&#xff0c;通过&#xff1a;方法一&#xff1a;不下载字体库即可实现中文显示 (MAC)plt.rcParams[font.family][Arial Unicode MS]方法二&#xff1a;下载指定字体训即可实现中文显示plt.rc…

从“单体崩溃”到“稳定如山”:Java 构建高可用、低耦合架构实战指南

引言&#xff1a; 你是否经历过这样的痛苦&#xff1f;某个模块突然异常&#xff0c;整个系统瞬间崩盘&#xff0c;排查日志堆积如山&#xff0c;客户投诉不断。系统耦合严重、容错性差&#xff0c;成了上线最忌惮的“隐雷”。 而今天&#xff0c;我们要带你深入剖析如何通过事…

人工智能正在学习自我提升的方式

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Numpy基础(广播机制)

广播机制 Numpy的Universal functions中要求输入的数组shape是一致的&#xff0c;当数组的shape不相等 时&#xff0c;则会使用广播机制。不过&#xff0c;调整数组使得shape一样&#xff0c;需要满足一定的规则&#xff0c;否则将 出错。这些规则可归纳为以下4条。 1&#xff…

reuse: for booting my spring project with mvn in Windows command line

boot.bat echo off setlocal enabledelayedexpansion:: 定义帮助信息 set HELP_MSG使用方法: %0 [选项,可选-m,-j,-h] [参数...]:: 默认启动方式为 mvn set MODEmvn set ARGS:: 解析命令行参数 :parse_args if "%~1""" goto end_parseif "%~1"&q…

NodeJs学习日志(4):路由合并_环境配置_常用文件目录

路由合并_环境配置_常用文件目录 路由合并 // routes/routes.js const express require(express); const router express.Router();// 合并子路由 var indexRouter require(../routes/index); var usersRouter require(../routes/users);router.use(/, indexRouter); route…

✨TRAE SOLO + Holopix AI | 轻松实现 “虚假广告“-转[特殊字符]割草小游戏

引言 &#x1f636; 两周前 (7.21) Trae-国际版 正式发布「SOLO」模式&#xff0c;需要 Pro 账户&#xff0c;邀请码一度 “难求”&#xff0c;海鲜市场还有人挂出 500块的 “天价”&#xff0c;这都能炒&#xff1f;我是无法理解的&#x1f937;‍♀️&#xff0c;目前一个月…

redis集群-本地环境

* Linux 本地集群&#xff1a;3主3从yum install -y gccyum install -y wgetyum install -y vimwget http://download.redis.io/releases/redis-7.2.5.tar.gztar -zxvf redis-7.2.5.tar.gzcd redis-7.2.5/makemake PREFIX/usr/local/redis install# 配置系统环境变量vim /etc/p…

海关 瑞数 失信企业 逆向 分析 后缀 rs

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;部分python代码headers {Accept: appl…