Java五個最常用的集合類之間的區別和聯繫

来源:https://www.cnblogs.com/javalove2022/archive/2022/10/14/16791469.html
-Advertisement-
Play Games

緩存就是記憶體中的數據,常常來自對資料庫查詢結果的保存。使用緩存,我們可以避免頻繁的與資料庫進行交互,進而提高響應速度MyBatis也提供了對緩存的支持,分為一級緩存和二級緩存,可以通過下圖來理解: ①、一級緩存是SqlSession級別的緩存。在操作資料庫時需要構造sqlSession對象,在對象中 ...


Map<String, ?>只能是只讀模式,不能增加,因為增加的時候不知道該寫入什麼類型的值;
Map<String, Object>可以讀和寫,只要是所有Object類的子類都可以。

 


 

常用的集合類有一下幾種:

List結構的集合類:ArrayList類,LinkedList類,Vector類,Stack類

Map結構的集合類:HashMap類,Hashtable類

Set結構的集合類:HashSet類,TreeSet類

Queue結構的集合:Queue介面

 

HashMap和Hashtable的區別:

HashMap和Hashtable都是java的集合類,都可以用來存放java對象,這是他們的相同點

以下是他們的區別:

1.歷史原因:

Hashtable是基於陳舊的Dictionary類的,HashMap是java 1.2引進的Map介面的一個現實。

2.同步性:

Hashtable是同步的,這個類中的一些方法保證了Hashtable中的對象是線程安全的,而HashMap則是非同步的,因此HashMap中的對象並不是線程安全的,因為同步的要求會影響執行的效率,所以如果你不需要線程安全的結合那麼使用HashMap是一個很好的選擇,這樣可以避免由於同步帶來的不必要的性能開銷,從而提高效率,我們一般所編寫的程式都是非同步的,但如果是伺服器端的代碼除外。

3.值:

HashMap可以讓你將空值作為一個表的條目的key或value

Hashtable是不能放入空值(null)的

 

ArrayList和Vector的區別:

ArrayList與Vector都是java的集合類,都是用來存放java對象,這是他們的相同點,

區別:

1.同步性:

Vector是同步的,這個類的一些方法保證了Vector中的對象的線程安全的,而ArrayList則是非同步的,因此ArrayList中的對象並不 是線程安全的,因為同步要求會影響執行的效率,所以你不需要線程安全的集合那麼使用ArrayList是一個很好的選擇,這樣可以避免由於同步帶來的不必 要的性能開銷。

2.數據增長:

從內部實現的機制來講,ArrayList和Vector都是使用數組(Array)來控制集合中的對象,當你向兩種類型中增加元素的時候,如果元素的數目超過了內部數組目前的長度他們都需要擴展內部數組的長度,Vector預設情況下自動增長原來一倍的數組長度,ArrayList是原來的50%,所以最後你獲得的這個集合所占的空間總是比你實際需要的要大,所以如果你要在集合中保存大量的數據,那麼使用Vector有一些優勢,因為你可以通過設置集合的初始大小來避免不必要的資源開銷。

 

總結:

1)如果要求線程安全,使用Vector,Hashtable

2)如果不要求線程安全,使用ArrayList,LinkedList,HashMap

3)如果要求鍵值對,則使用HashMap,Hashtable

4)如果數據量很大,又要求線程安全考慮Vector

 

1.ArrayList: 元素單個,效率高,多用於查詢

2.Vector:    元素單個,線程安全,多用於查詢

3.LinkedList:元素單個,多用於插入和刪除

4.HashMap:   元素成對,元素可為空

5.HashTable: 元素成對,線程安全,元素不可為空

 

ArrayList

底層是Object數組,所以ArrayList具有數組的查詢速度快的優點以及增刪速度慢的缺點。

而在LinkedList的底層是一種雙向迴圈鏈表。在此鏈表上每一個數據節點都由三部分組成:前指針(指向前面的節點的位置),數據,後指針(指向後面的節點的位置)。最後一個節點的後指針指向第一個節點的前指針,形成一個迴圈。

雙向迴圈鏈表的查詢效率低但是增刪效率高。

ArrayList和LinkedList在用法上沒有區別,但是在功能上還是有區別的。

 

LinkedList

經常用在增刪操作較多而查詢操作很少的情況下:隊列和堆棧。

隊列:先進先出的數據結構。

棧:後進先出的數據結構。

註意:使用棧的時候一定不能提供方法讓不是最後一個元素的元素獲得出棧的機會。

 

Vector

(與ArrayList相似,區別是Vector是重量級的組件,使用使消耗的資源比較多。)

結論:在考慮併發的情況下用Vector(保證線程的安全)。

在不考慮併發的情況下用ArrayList(不能保證線程的安全)。

 

面試經驗(知識點):

java.util.stack(stack即為堆棧)的父類為Vector。可是stack的父類是最不應該為Vector的。因為Vector的底層是數組,且Vector有get方法(意味著它可能訪問到並不屬於最後一個位置元素的其他元素,很不安全)。

對於堆棧和隊列只能用push類和get類。

Stack類以後不要輕易使用。

實現棧一定要用LinkedList。

(在JAVA1.5中,collection有queue來實現隊列。)

 

Set-HashSet實現類:

遍歷一個Set的方法只有一個:迭代器(interator)。

HashSet中元素是無序的(這個無序指的是數據的添加順序和後來的排列順序不同),而且元素不可重覆。

在Object中除了有finalize(),toString(),equals(),還有hashCode()。

HashSet底層用的也是數組。

當向數組中利用add(Object o)添加對象的時候,系統先找對象的hashCode:

int hc=o.hashCode(); 返回的hashCode為整數值。

Int I=hc%n;(n為數組的長度),取得餘數後,利用餘數向數組中相應的位置添加數據,以n為6為例,如果I=0則放在數組a[0]位置,如果I=1,則 放在數組a[1]位置。如果equals()返回的值為true,則說明數據重覆。如果equals()返回的值為false,則再找其他的位置進行比 較。這樣的機制就導致兩個相同的對象有可能重覆地添加到數組中,因為他們的hashCode不同。

如果我們能夠使兩個相同的對象具有相同hashcode,才能在equals()返回為真。

在實例中,定義student對象時覆蓋它的hashcode。

因為String類是自動覆蓋的,所以當比較String類的對象的時候,就不會出現有兩個相同的string對象的情況。

現在,在大部分的JDK中,都已經要求覆蓋了hashCode。

結論:如將自定義類用hashSet來添加對象,一定要覆蓋hashcode()和equals(),覆蓋的原則是保證當兩個對象hashcode返回相同的整數,而且equals()返回值為True。

如果偷懶,沒有設定equals(),就會造成返回hashCode雖然結果相同,但在程式執行的過程中會多次地調用equals(),從而影響程式執行的效率。

 

我們要保證相同對象的返回的hashCode一定相同,也要保證不相同的對象的hashCode儘可能不同(因為數組的邊界性,hashCode還是可能相同的)。

 

例子:

public int hashCode(){

return name.hashcode()+age;

}

這個例子保證了相同姓名和年齡的記錄返回的hashCode是相同的。

 

使用hashSet的優點:

hashSet的底層是數組,其查詢效率非常高。而且在增加和刪除的時候由於運用的hashCode的比較開確定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因為hashSet查詢和刪除和增加元素的效率都非常高。

但是hashSet增刪的高效率是通過花費大量的空間換來的:因為空間越大,取餘數相同的情況就越小。HashSet這種演算法會建立許多無用的空間。

使用hashSet類時要註意,如果發生衝突,就會出現遍歷整個數組的情況,這樣就使得效率非常的低。


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

-Advertisement-
Play Games
更多相關文章
  • 原文:JavaFx 使用字體圖標記錄 - Stars-One的雜貨小窩 之前其實也是研究過關於字體圖標的使用,還整了個庫Tornadofx學習筆記(4)——IconTextFx開源庫,整合5000+個字體圖標 - Stars-one - 博客園 由於之前並不是太過於講解字體圖標,最近又是抽空研究了一 ...
  • JDBC和連接池02 3.ResultSet[結果集] 基本介紹 表示資料庫結果集的數據表,通常通過執行查詢資料庫的語句生成 ResultSet對象保持一個游標指向其當前的數據行,最初,游標位於第一行的之前 next方法將游標移動到下一行,並且由於在ResultSet對象中沒有更多行時返回false ...
  • 配置環境變數的目的:使在任意目錄下都能執行java.exe這個應用程式 兩種方法 方法一 1找到jdk安裝的路徑,打開bin目錄(因為java.exe這個程式在bin目錄裡面),複製當前路徑 2右擊此電腦,打開屬性 3打開高級系統設置 4打開環境變數 5打開path,編輯 6 新建,粘貼複製的地址, ...
  • 以下為本人的學習筆記 1.網路編程基本概念 1.1 什麼是電腦網路 把發佈在不同地理區域的電腦與專門的外部設備用通信線路互連成一個規模大、功能強的網路系統,從而使眾多的電腦可以方便地互相傳遞消息,共用硬體、軟體、數據消息等資源 1.2 電腦網路的主要功能 資源共用 信息傳輸與集中處理 均衡負 ...
  • 發郵件:https://www.cnblogs.com/hudieren/p/16792041.html 收郵件:https://www.cnblogs.com/hudieren/p/16792045.html 解析郵件:https://www.cnblogs.com/hudieren/p/1679 ...
  • 前言 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 又到了學Python時刻~ 有時候下班~忙著跑路,忘記關電腦,逮到了會被老闆扣工資!!怎麼辦? python帶你製做一個小程式,到點自動關機~ 再也不怕忘關電腦啦~ 還能再嘗試的時候順帶摸摸魚,被老闆發現就是再調試程式~hhhhh 用python寫一個自 ...
  • ODS(OpenDocument Spreadsheet)是一種基於XML的文件格式,可以使用OpenOffice.org的Calc組件打開和建立。與MS Excel文件類似,ODS文件將數據存儲在組織成行和列的單元格中,並可以包含文本、數學函數、格式化等內容。 ...
  • 好家伙,上一篇做出來問題多多, 問題太多了,包括但不限於前端報錯:1.超出調用棧 2.跨域錯誤 vue3確實有很多我不熟悉的地方 所以,我們用回vue2吧 這裡全部用回之前的方法 Springboot連接資料庫 - 養肥胖虎 - 博客園 (cnblogs.com) 1、去新建一個spring boo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...