Java集合拓展01

1、List,Set,Map三者的區別

  • List:一個有序(元素存入集合的順序和取出的順序一致)容器,元素可以重復,可以插入多個null元素,元素都有索引。常用的實現類有 ArrayList、LinkedList 和 Vector。
  • Set:一個無序(存入和取出順序有可能不一致)容器,不可以存儲重復元素,只允許存入一個null元素,必須保證元素唯一性。Set 接口常用實現類是 HashSet、LinkedHashSet 以及 TreeSet。
  • Map是一個鍵值對集合,存儲鍵、值和之間的映射。 Key無序,唯一;value 不要求有序,允許重復。Map 的常用實現類:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap。

2、集合框架底層的數據結構

List集合:

  • Arraylist和Vector使用的是 Object 數組, LinkedList使用雙向循環鏈表

Set集合:

  • HashSet(無序,唯一):基于 HashMap 實現的,HashSet的值作為key,value是Object類型的常量
  • LinkedHashSet繼承HashSet,并且通過 LinkedHashMap 來實現的
  • TreeSet(有序,唯一): 紅黑樹(自平衡的排序二叉樹。

Map集合:

  • HashMap由數組+鏈表+紅黑樹組成的,數組是HashMap的主體,鏈表則是主要為了解決哈希沖突而存在的,當鏈表長度大于閾值(默認為8)并且數組長度大于64時,將鏈表轉化為紅黑樹
  • LinkedHashMap(有序) 繼承自 HashMap,底層仍然是數組+鏈表+紅黑樹組成。另外,LinkedHashMap 在此基礎上,節點之間增加了一條雙向鏈表,使得可以保持鍵值對的插入順序
  • HashTable無序,數組+鏈表組成的,數組是 HashTable的主體,鏈表則是主要為了解決哈希沖突而存在的
  • TreeMap有序,紅黑樹

3、集合框架的擴容

  • ?ArrayList和Vector默認初始容量為10,當元素個數超過容量長度時都進行進行擴容,ArrayList擴容為原來的1.5倍,而Vector擴容為原來的2倍
  • HashSet和HashMap默認初始容量為16,加載因子為0.75:即當元素個數超過容量長度的0.75倍時,進行擴容,擴容為原來的2倍。HashSet基于 HashMap 實現的,因此兩者相同
  • HashTable:默認初始容量為11,加載因子為0.75,擴容策略是2倍+1,如 初始的容量為11,一次擴容后是容量為23

4、HashMap 的實現原理以及JDK1.7和JDK1.8的區別

????????實現原理

????????數組的特點是:尋址容易,插入和刪除困難;而鏈表的特點是:尋址困難,插入和刪除容易。我們綜合兩者的特性,做出一種尋址容易,插入刪除也容易的數據結構哈希表。并且使用最常用的一種方法—— 拉鏈法來實現哈希表。

????????數組存儲的元素是一個Entry類,這個類有三個數據域,key、value(鍵值對),next(指向下一個Entry)。當兩個key經過計算得到的index(索引)相同時,即產生哈希沖突時,用鏈地址法來解決哈希沖突,即通過next屬性將索引值相同的鏈接在一起。隨著map的容量或者鏈表長度越來越大,在進行進一步的優化,比如使用紅黑樹。

????????存儲過程

????????HashMap個put()方法:

????????第一步首先將k,v封裝成Node節點。第二步調用hashCode()方法得出hash值并將hash值轉換成數組的下標,下標位置上如果沒有任何元素(沒有碰撞),就把Node節點添加到這個位置上。如果說下標對應的位置上有值(hash碰撞)。碰撞的元素與要插入的元素key值相等,直接進行value的更新;如果key值不相同,于是增長鏈表或者樹節點的增加。插入之后判斷是否進行擴容。

????????HashMap個get()方法:

????????先調用k的hashCode()方法得出哈希值,并轉換成數組的下標。第二步:通過數組下標快速定位到某個位置上。如果該位置上什么都沒有,則返回null。如果這個位置上有數據,那么它就會拿著參數k和單向鏈表上(紅黑樹)的每一個節點的k進行equals,如果所有equals方法都返回false,則get方法返回null。如果其中一個節點的k和參數k進行equals返回true,那么返回該節點的value。

????????區別

????????JDK1.7是數組+鏈表,無沖突時,存放數組;沖突時,存放鏈表;采用頭插法。

????????JDK1.8是數組 + 鏈表 + 紅黑樹,無沖突時,存放數組;有沖突存放鏈表或者紅黑樹,當鏈表長度大于閾值(默認為8)并且數組長度大于64時,將鏈表轉化為紅黑樹;樹元素小于等于6時,樹結構還原成鏈表形式。

5、Arraylist與LinkedList區別

  • ArrayList是數組的數據結構,LinkedList是鏈表的數據結構。
  • 隨機訪問的時候,ArrayList的效率比較高,因為LinkedList要移動指針,而ArrayList是基于索引(index)的數據結構,可以直接映射到。
  • 插入、刪除數據時,LinkedList的效率比較高,因為ArrayList要移動數據。
  • LinkedList比ArrayList開銷更大,因為LinkedList的節點除了存儲數據,還需要存儲引用。

6、HashMap 的擴容過程?

  • 第一步把數組長度變為原來的兩倍,
  • 第二步把舊數組的元素重新計算hash插入到新數組中。
  • jdk8時,不用重新計算hash,只用看看原來的hash值新增的一位是零還是1,如果是1這個元素在新數組中的位置,是原數組的位置加原數組長度,如果是零就插入到原數組中。擴容過程第二步一個非常重要的方法是transfer方法,采用頭插法,把舊數組的元素插入到新數組中。

?7、哪些集合類是線程安全的?哪些不安全

線性安全的

  • Vector:比Arraylist多了個同步化機制。
  • Hashtable:比Hashmap多了個線程安全。
  • ConcurrentHashMap:是一種高效但是線程安全的集合。
  • Stack:棧,也是線程安全的,繼承于Vector。

線性不安全的

  • Hashmap
  • Arraylist
  • LinkedList
  • HashSet
  • TreeSet
  • TreeMap

?8、ArrayList 和 Vector 的區別是什么

  • Vector是線程安全的,ArrayList不是線程安全的。
  • ArrayList在底層數組不夠用時在原來的基礎上擴展0.5倍,Vector是擴展1倍。
  • Vector只要是關鍵性的操作,方法前面都加了synchronized關鍵字,來保證線程的安全性。

?9、Collection與Collections的區別是什么

  • Collection是Java集合框架中的基本接口,如List接口也是繼承于它
publicinterfaceList<E>extendsCollection<E>{}
  • Collections是Java集合框架提供的一個工具類,其中包含了大量用于操作或返回集合的靜態方法。如下:
publicstatic<T extendsComparable<?super T>>void sort(List<T> list){list.sort(null);
}

10、如何決定使用 HashMap 還是TreeMap?

這個點,主要考察HashMap和TreeMap的區別。

TreeMap實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按key的升序排序,也可以指定排序的比較器。當用Iterator遍歷TreeMap時,得到的記錄是排過序的。

11、數組和 List之間的轉換

List 轉Array:必須使用集合的 toArray(T[] array),如果直接使用 toArray 無參方法,返回值只能是 Object[] 類,強轉其他類型可能有問題。

Array 轉List:使用Arrays.asList() 把數組轉換成集合時,不能使用修改集合相關的方法。

PS:需要注意的是,asList() 返回的是一個視圖(view),所以對該 List 進行添加、刪除操作會直接影響到原數組的值,而且還不支持 add()、remove()、clear() 操作,不然會拋出 UnsupportedOperationException 異常,該方法適用于只需要讀取數組中數據的情況。如果想要對集合修改元素,應該通過創建新的 List 進行修改。
可以這樣使用彌補這個缺點:

//方式一:
ArrayList<String> arrayList =newArrayList<String>(strArray.length);
Collections.addAll(arrayList, strArray);
//方式二:
ArrayList<String> list =newArrayList<String>(Arrays.asList(strArray));

12、迭代器 Iterator 是什么?怎么用,有什么特點?

publicinterfaceCollection<E>extendsIterable<E>{
Iterator<E> iterator();

方法如下:

  1. next()方法獲得集合中的下一個元素
  2. hasNext()檢查集合中是否還有元素
  3. remove()方法將迭代器新返回的元素刪除
  4. forEachRemaining(Consumer<?super E> action)方法,遍歷所有元素

Iterator 主要是用來遍歷集合用的,它的特點是更加安全,因為它可以確保,在當前遍歷的集合元素被更改的時候,就會拋出 ConcurrentModificationException 異常。

使用demo如下:

List<String> list =newArrayList<>();
Iterator<String> it = list. iterator();
while(it. hasNext()){String obj = it.next();System.out. println(obj);
}

13、ArrayList集合加入1萬條數據,應該怎么提高效率

因為ArrayList的底層是數組實現,并且數組的默認值是10,如果插入10000條要不斷的擴容,耗費時間,所以我們調用ArrayList的指定容量的構造器方法ArrayList(int size) 就可以實現不擴容,就提高了性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EMG肌肉信號處理合集 (一)

本文歸納了常見的肌肉信號預處理流程&#xff0c;方便EMG信號的后續分析。使用pyemgpipeline庫 來進行信號的處理。文中使用了 UC Irvine 數據庫的下肢數據。 目錄 1 使用wrappers 定義數據類&#xff0c;來進行后續的操作 2 肌電信號DC偏置去除 3 帶通濾波器處理 4 對肌電…

SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 負載均衡

目錄 一、LoadBalancer 負載均衡 1.1、前言 1.2、LoadBalancer 負載均衡底層實現原理 二、整合 OpenFeign LoadBalancer 2.1、所需依賴 2.2、具體實現 2.3、自定義負載均衡策略 一、LoadBalancer 負載均衡 1.1、前言 在 2020 年以前的 SpringCloud 采用 Ribbon 作為負載…

OOM問題排查+Jvm優化

OOM問題排查&#xff1a; 1、top命令&#xff1a;查看cpu和內存的使用情況。 2、jstat命令&#xff1a;查看YGC和FGC情況&#xff0c;一般都是老年代不夠用。導致OOM 3、jmap命令&#xff1a; 查看哪個類的實例過多,以每個類占用多少了內存。4、jstack 查看線程與線程之間的阻…

Linux用戶名用戶組命令

添加用戶(為sam用戶添加一個主目錄/home/sam) useradd -d /home/sam -m sam新建一個用戶gem,該用戶的登錄shell是/bin/sh,它屬于group用戶組&#xff0c;同時又屬于adm和root用戶組&#xff0c;其中group用戶組是其主組 添加用戶賬號就是在/etc/passwd文件中為新用戶添加一條記…

80基于matlab的小波包熵與模糊C均值聚類的故障診斷,以凱斯西儲大學軸承數據為例進行分析

基于matlab的小波包熵與模糊C均值聚類的故障診斷&#xff0c;以凱斯西儲大學軸承數據為例進行分析。對數據進行小波包分解后重構&#xff0c;然后提取各頻帶能量分布&#xff0c;后計算小波包熵進行故障診斷。輸出特征可視化結果。數據可更換自己的&#xff0c;程序已調通&…

Git遠程庫操作(GitHub)

GitHub 網址&#xff1a;https://github.com/ 創建遠程倉庫 遠程倉庫操作 命令名稱作用git remote -v查看當前所有遠程地址別名git remote add 別名 遠程地址起別名git push 別名 分支推送本地分支上的內容到遠程倉庫git clone 遠程地址將遠程倉庫的內容克隆到本地git pull 別…

文件格式校驗

json格式校驗 非嚴格模式 json.loads(data, strictFalse) 如果strict為false&#xff08;默認值為True&#xff09;&#xff0c;則字符串中允許使用控制字符。此上下文中的控制字符是那些字符代碼在0–31范圍內的字符&#xff0c;包括“\t”&#xff08;制表符&#xff09;、“…

基于STM32的色彩識別與分類算法優化

基于STM32的色彩識別與分類算法優化是一項與圖像處理和機器學習相關的研究任務&#xff0c;旨在實現高效的色彩識別和分類算法在STM32微控制器上的運行。本文將介紹基于STM32的色彩識別與分類算法優化的原理和實現步驟&#xff0c;并提供相應的代碼示例。 1. 色彩識別與分類概…

[SIGGRAPH-23] 3D Gaussian Splatting for Real-Time Radiance Field Rendering

pdf | proj | code 本文提出一種新的3D數據表達形式3D Gaussians。每個Gaussian由以下參數組成&#xff1a;中心點位置、協方差矩陣、可見性、顏色。通過世界坐標系到相機坐標系&#xff0c;再到圖像坐標系的仿射關系&#xff0c;可將3D Gaussian映射到相機坐標系&#xff0c;通…

.NET面試題2

1.請解釋一下C#中的委托&#xff08;Delegate&#xff09;。 委托是一種類型安全的函數指針&#xff0c;它可以將方法作為參數傳遞或存儲在變量中。通過委托&#xff0c;可以實現方法的回調、事件處理等功能。委托在C#中使用delegate關鍵字進行聲明&#xff0c;可以根據方法簽名…

c語言:用迭代法解決遞歸問題

題目&#xff1a; 解釋&#xff1a;題目的意思就是用迭代法的空間和時間復雜的太高了&#xff0c;需要我們減小空間與時間的復雜度&#xff0c;我就想到了迭代法&#xff0c;思路和代碼如下&#xff1a; #include <stdio.h> //這里是遞歸法轉迭代法 int main() {int x,i…

Rust語言特性探秘:宏的魔力

大家好&#xff01;我是lincyang。 今天我們繼續深入探討Rust語言中的一個有趣而強大的特性——宏&#xff08;Macros&#xff09;。 宏在Rust中扮演著特殊的角色&#xff0c;不僅提高了代碼的靈活性&#xff0c;還增強了代碼的可重用性。接下來&#xff0c;我們會通過具體的…

[ 云計算 | AWS 實踐 ] 基于 Amazon S3 協議搭建個人云存儲服務

本文收錄于【#云計算入門與實踐 - AWS】專欄中&#xff0c;收錄 AWS 入門與實踐相關博文。 本文同步于個人公眾號&#xff1a;【云計算洞察】 更多關于云計算技術內容敬請關注&#xff1a;CSDN【#云計算入門與實踐 - AWS】專欄。 本系列已更新博文&#xff1a; [ 云計算 | …

Redis-Redis緩存高可用集群

1、Redis集群方案比較 哨兵模式 在redis3.0以前的版本要實現集群一般是借助哨兵sentinel工具來監控master節點的狀態&#xff0c;如果master節點異常&#xff0c;則會做主從切換&#xff0c;將某一臺slave作為master&#xff0c;哨兵的配置略微復雜&#xff0c;并且性能和高可…

深信服技術認證“SCSA-S”劃重點:信息收集

為幫助大家更加系統化地學習網絡安全知識&#xff0c;以及更高效地通過深信服安全服務認證工程師考核&#xff0c;深信服特別推出“SCSA-S認證備考秘笈”共十期內容&#xff0c;“考試重點”內容框架&#xff0c;幫助大家快速get重點知識~ 劃重點來啦 深信服安全服務認證工程師…

前端相關免查整合-vue、es、工具類等

知識 工具篇 網頁 取色器 F12 之后&#xff0c; style里面選一個顏色&#xff0c;然后點擊鉛筆&#xff0c;復制值 dayjs 用法 const date dayjs(2021-09-01); const formattedDate dayjs(2021-09-01).format(YYYY-MM-DD); console.log(formattedDate); // 輸出&#…

SEO從業人員提問常用的ChatGPT通用提示詞模板

如何提高網站在搜索引擎中的排名&#xff1f; 如何評估網站的SEO效果和優化潛力&#xff1f; 如何運用關鍵詞研究和競爭對手分析來制定SEO策略&#xff1f; 如何優化網站的內容、結構和元數據來提高SEO效果&#xff1f; 如何運用外部和內部鏈接來提高網站的權威性和排名&am…

OpenCvSharp從入門到實踐-(02)圖像處理的基本操作

目錄 圖像處理的基礎操作 1、讀取圖像 1.1、讀取當前目錄下的圖像 2、顯示圖像 2.1、Cv2.ImShow 用于顯示圖像。 2.2、Cv2.WaitKey方法用于等待用戶按下鍵盤上按鍵的時間。 2.3、Cv2.DestroyAllWindows方法用于銷毀所有正在顯示圖像的窗口。 2.4實例1-顯示圖像 2.4實例…

分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測

分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測 目錄 分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測分類效果基本描述程序設計參考資料 分類效果 基本描述 1.多特…

校園圈子論壇,交友,帖子內短視頻,二手市場,APP小程序H5三端交付,源碼交付,支持二開

校園圈子論壇&#xff0c;交友頻道&#xff0c;商城&#xff0c;二手市場&#xff0c;活動專區&#xff0c;短視頻&#xff0c;從校園生活的方方面面展現出了充滿活力和創造力的鏡頭。這個頻道是一個讓學生們相互交流、結識新朋友的平臺&#xff0c;不僅有交友功能&#xff0c;…