讀Java實戰(第二版)筆記05_Collection API的增強功能

来源:https://www.cnblogs.com/lying7/archive/2023/02/09/17103969.html
-Advertisement-
Play Games

一、應用介紹 ”所有網頁都是客戶端“為fusion app的核心概念,讓我們利用它可以快速的做出屬於自己的應用。由於作者已經停止更新原版app,文章採用FA 重製版完成。 成品展示: 體驗下載: 下載鏈接:https://wwp.lanzoup.com/iIKXF0mxu1gd 提取碼 : xcvb ...


1. 集合工廠

1.1. Arrays.asList()

1.1.1. 創建了一個固定大小的列表

1.1.2. 列表的元素可以更新

1.1.3. 不能增加或者刪除

1.1.4. 大小固定的可變數組

1.2. 沒有Arrays.asSet()

1.2.1. 可以向HashSet的構造器傳遞一個列表實現

1.2.2. Stream.of 結合Collectors.toSet()實現

1.2.3. 可變的Set

1.3. List.of

1.3.1. 一個只讀列表

1.3.2. 保護你的集合,以免被意外地修改

1.3.3. 不要在工廠方法創建的列表中存放null元素

1.3.4. 10個元素是分水嶺,Set,Map也一樣

1.3.5. 使用List.of創建超過10個元素的列表

1.3.6. 使用List.of創建不超過10個元素的列表

1.4. Set.of

1.4.1. 創建列表元素的不可變Set集合

1.5. Map.of

1.5.1. 創建不到10個鍵值對的小型不可變Map

1.6. Map.ofEntries

1.6.1. 以變長參數列表形式組織的Map.Entry<K, V>對象作為參數

1.6.2. 創建額外的對象,從而實現對鍵和值的封裝

1.6.3. 不可變Map

1.6.4. Map.entry

1.6.4.1. 用於創建Map.Entry對象的工廠方法

1.7. Java9

1.8. 除非需要進行某種形式的數據處理並對數據進行轉換,否則應該儘量使用工廠方法

2. 定長元素版本的函數

2.1. 沒有分配數組、初始化以及最後對它進行垃圾回收的開銷

3. 變參版本的函數

3.1. 需要額外分配一個數組

3.2. 這個數組被封裝於列表中

3.3. 要負擔分配數組、初始化以及最後對它進行垃圾回收的開銷

4. 使用Set

4.1. removeIf

4.1.1. 移除集合中匹配指定謂詞的元素

5. 使用List

5.1. removeIf

5.1.1. 移除集合中匹配指定謂詞的元素

5.2. replaceAll

5.2.1. 用一個函數(UnaryOperator)替換元素

5.3. sort

5.3.1. 對列表自身的元素進行排序

6. Java8

6.1. 改變的是集合自身

7. 使用Map

7.1. forEach

7.1.1. 接受一個BiConsumer,以Map的鍵和值作為參數

7.1.2. 讓代碼更簡潔

7.2. 排序

7.2.1. Entry.comparingByValue

7.2.2. Entry.comparingByKey

7.3. getOrDefault

7.3.1. 提供一個預設值

7.3.2. 在Map中找不到指定的鍵時,該預設值會作為返回值

7.3.3. 如果鍵在Map中存在,但碰巧被賦予的值是null,那麼getOrDefault還是會返回null

7.3.4. 無論該鍵存在與否,作為參數傳入的表達式每次都會被執行

7.4. computeIfAbsent

7.4.1. 如果指定的鍵沒有對應的值(沒有該鍵或者該鍵對應的值是空),那麼使用該鍵計算新的值,並將其添加到Map中

7.4.2. 應用場景是緩存信息

7.5. computeIfPresent

7.5.1. 如果指定的鍵在Map中存在,就計算該鍵的新值,並將其添加到Map中

7.5.2. 如果生成結果的方法返回的值為空,那麼當前的映射就會從Map中移除

7.6. compute

7.6.1. 使用指定的鍵計算新的值,並將其存儲到Map中

7.7. remove

7.7.1. 從Map中刪除指定鍵對應的映射條目

7.8. replaceAll

7.8.1. 通過BiFunction替換Map中每個項的值

7.9. Replace

7.9.1. 如果鍵存在,就可以通過該方法替換Map中該鍵對應的值

7.9.2. 可以僅在原有鍵對應某個特定的值時才進行替換

7.10. merge

7.10.1. 在合併時對值有更加靈活的控制

7.10.1.1. 使用BiFunction方法處理重覆的鍵

7.10.1.2. 執行初始化檢查

7.10.2. 如果指定的鍵並沒有關聯值,或者關聯的是一個空值,那麼會將它關聯到指定的非空值

7.10.3. 否則,會用給定映射函數的[返回值]替換該值,如果映射函數的返回值為空就刪除[該鍵]

7.11. putAll

7.11.1. Map中不能含有重覆的鍵

8. 桶(bucket)

8.1. 由鏈接列表(LinkedList)實現的

8.2. 時間複雜度是O(n)

9. 同步式的Hashtable

9.1. 標準的HashMap是不帶同步的

10. ConcurrentHashMap

10.1. 應對高併發的場景

10.1.1. 讀寫性能都更好

10.1.2. 其內部實現基於分段鎖

10.1.3. 允許執行併發的添加和更新操作

10.2. forEach

10.2.1. 對每個(鍵,值)對執行指定的操作

10.3. reduce

10.3.1. 依據歸約函數整合所有(鍵,值)對的計算結果

10.4. search

10.4.1. 對每個(鍵,值)對執行一個函數,直到函數取得一個非空值

10.5. 參數形式

10.5.1. 使用鍵(forEachKey, reduceKeys, searchKeys)

10.5.2. 使用值(forEachValue, reduceValues, searchValues)

10.5.3. 使用Map.Entry對象(forEachEntry, reduceEntries, searchEntries)

10.6. 註要點

10.6.1. 都不會對ConcurrentHashMap的狀態上鎖

10.6.2. 只是在運行中動態地對對象加鎖

10.6.3. 執行操作的函數不應對執行順序或其他對象或可能在運行中變化的值有任何的依賴

10.6.4. int、long、double等基礎類型的歸約操作(reduceValuesToInt、reduce-KeysToLong等)會更加高效

10.7. 並行閾值

10.7.1. Map的規模比指定的閾值小,方法就只能順序執行

10.7.2. 使用通用線程池時,如果把並行閾值設置為1將獲得最大的並行度

10.7.3. 閾值設定為Long.MAX_VALUE時,方法將以單線程的方式運行

10.8. mappingCount

10.8.1. 以長整形long返回Map中的映射數目

10.9. keySet

10.9.1. 以Set的形式返回ConcurrentHashMap的一個視圖

10.9.2. Map中的變化會反映在返回的Set中


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android 常用 adb 命令總結 adb ( 全稱為Android Debug Bridge)是一個C/S 架構命令行工具,起到調試橋的作用,是連接Android手機與PC端的橋梁,方便我們在電腦上對手機進行操作。adb 命令可用於執行各種設備操作,如安裝和調試應用。 點擊下載adb工具 AD ...
  • 支持日語假名註音的JpTextView 支持自動換行 支持自動寬高 支持一次標記或者總是標記 網上找了一下,發現沒有類型的輪子,就自己造了一個 源碼:https://github.com/toukomine/JpTextView 引入依賴 代碼已上傳 mavenCentral倉庫,在項目根目錄的bu ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 我以前很喜歡封裝組件,什麼東西不喜歡別人的,總喜歡自己搞搞,這讓人很有成就感,雖然是重覆造輪子,但是能從無聊的crud業務中暫時解脫出來,對我來說也算是一種休息,相信有很多人跟我一樣有這個習慣。 這種習慣在獨立開發時無所謂,畢竟沒人 ...
  • react腳手架配置代理總結 方法一 在 package.json 中追加如下配置 "proxy":"<http://localhost:5000>" 說明: 優點:配置簡單,前端請求資源時可以不加任何首碼。 缺點:不能配置多個代理。 工作方式:上述方式配置代理,當請求了3000不存在的資源時,那麼 ...
  • javaScript進階 一、作用域 JS的作用域簡單來說就是變數(變數作用於又稱上下文)和函數生效(能被訪問)的區域 1.全局作用域 函數之外聲明的變數,會成為全局變數。 變數在程式的任何地方都能被訪問,表示它是全局變數,window 對象的內置屬性都擁有全局作用域。 自動全局 如果您為尚未聲明的 ...
  • 環境安裝 一、node 1.為什麼需要node環境 Vue.js本質上就是一個Js庫,可以直接在頁面通過script標簽引用。這種使用方式只使用了VueJs的”構建用戶界面“,使用不了他的模塊化 Vue.js可以在html里直接引用後使用,等到與Vue一起配合使用的第三方應用的庫或框架多起來後,一個 ...
  • JavaScript 中的高階函數是一種接受函數作為輸入或返回函數作為輸出的函數。高階函數可以用於創建抽象概念,例如柯里化、組合和管道。 ...
  • 如何創建有層次的C++工程目錄 大多數人創建C++工程採用預設設置,這樣會導致工程內文件散亂,毫無可觀性。那麼如何去創建一個可觀性搶的工程目錄呢?以下將為大家解惑。 1、快速創建預設工程並簡單處理 a、新手因不理解具體的項目工程有哪些文件目錄,所以我建議直接創建一個預設的項目,然後關閉當前目錄創建這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...