java9學習筆記-part1

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…