1. 程式人生 > >淺談javaSE中set和list的區別

淺談javaSE中set和list的區別

一、關於集合類

set和list首先是java中的集合類,那麼可以簡單介紹下集合類。

現在有個簡單問題。

把一個公司每個員工作為一個物件,那麼這個公司就有了很多這樣的員工物件,該如何儲存這些物件?

如果使用原始的陣列方式,且不說員工物件的個數不確定,即使現在確定下來,每天都伴隨著員工的新增和離職,用陣列儲存的方式就很麻煩了,所以集合也就應運而生了。

所以:集合用來儲存物件,就像一個抽獎箱,可以放很多號碼,當號碼不夠還可以繼續放,靈活可變;而每一個號碼(物件地址)就對應一個獎品(物件),這便是集合儲存的核心。

總結:可變長度、儲存物件。

部分集合類簡圖如下:


二、關於list和set

list:有序(存入取出順序一致),有索引(角標),元素可重複。

 |--Vector:底層是陣列結構,原理:一旦原陣列長度不夠,會建立新陣列,將原陣列的元素複製到新陣列中,並將新元素新增到新陣列中,是同步的。增刪和查詢都很慢。
 |--ArrayList:底層是陣列結構,也是支援長度可變陣列的。是不同步的。 查詢效率很高。 但是增刪的效率很低。
 |--LinkedList:底層是連結列表結構,簡稱連結串列結構。是不同步的。這個中結構的好處:對元素的增刪非常效率很高。 查詢的效率很低。

通過以下兩個圖就可以知道為什麼會有這樣的差距了

ArrayList:


由於是陣列結構,連續的,所以查詢的時候根據索引查詢,速度很快;反之,假若元素77要插入到22和45之間,那麼所有45之後的元素都要往後移動,刪除操作也是一樣,因此,增刪就會很慢。

LinkedList:


底層是連結串列結構,儘管實現list介面,有角標(索引、編號),但是是不連續的,查詢一個個找,所以很慢;反之,當要加入(或刪除)某個元素時候,只需要更改元素的節點資訊,如將元素98刪除,只需要在44元素中的指標從98改為34即可,因而增刪非常快捷。

set:元素不重複,無序。

|--HashSet:底層資料結構是雜湊表,不保證順序,是不同步的。
                       雜湊表:提供陣列的查詢效率而出現的。將要儲存的元素先通過雜湊演算法算出一個雜湊值來標識儲存的位置,代表著元素。 要找元素時,先將該元素通過雜湊演算法算出雜湊值,在通過雜湊值到雜湊表中去查詢。


                         特點:
                         1,不關心元素的順序。
                         2,提高了查詢效率。
                         3,不可能出現重複元素,因為雜湊值都不同。即使相同,會再次判斷兩個元素的equals,內容是否相同。如果內容也相同,不存,如果內容不同,儲存。 所以雜湊表要保證元素的唯一性,必須要依賴於兩個方法:hashCode和equals    

 |--TreeSet:可以給Set集合中的元素進行指定順序的排序。非同步的。  預設情況下,是通過元素的自然順序排的序。它保證元素唯一性的依據是看比較方法的返回結果是否是0.是0.就視為元素相同。不存。 TreeSet排序的方式一:讓元素自身具備比較性,需要實現Comparable介面,覆蓋compareTo方法。這種比較方式成為自然順序排序。


二叉樹結構模式,更加方便了排序(原理:選取一個居中的元素為首,比其大的靠後,小的靠前,相同元素則不新增)。

相關推薦

javaSEsetlist區別

一、關於集合類 set和list首先是java中的集合類,那麼可以簡單介紹下集合類。 現在有個簡單問題。 把一個公司每個員工作為一個物件,那麼這個公司就有了很多這樣的員工物件,該如何儲存這些物件? 如果使用原始的陣列方式,且不說員工物件的個數不確定,即使現在確定下來,每天都

Mybatis的 ${ } #{ }的區別

mybatis sql註入 語句 nbsp 之前 com pre 預編譯 sql 語句 一、舉例說明 1 select * from user where name = "dato"; 2 3 select * from user where name = #

Mysqlwherehaving的區別

where和having的區別一、誤區:不要錯誤的認為having和group by 必須配合使用.二、where和having用法解析:1、 where和having都可以使用的場景: select goods_price,goods_name from goods where goods_price &g

AndroidSerializableParcelable使用區別

Android中序列化有兩種方式:Serializable以及Parcelable。其中Serializable是Java自帶的,而Parcelable是安卓專有的。 一、Serializable序列化 serializable使用比較簡單,只需要對某個類實現Serializable 介面即可。 Ser

C++指標引用的區別

指標和引用在C++中很常用,但是對於它們之間的區別很多初學者都不是太熟悉,下面來談談他們2者之間的區別和用法。1.指標和引用的定義和性質區別:(1)指標:指標是一個變數,只不過這個變數儲存的是一個地址,指向記憶體的一個儲存單元;而引用跟原來的變數實質上是同一個東西,只不過是原變數的一個別名而已。如:int a

.NET介面類的區別

.Net提供了介面,這個不同於Class或者Struct的型別定義。介面有些情況,看似和抽象類一樣,因此有些人認為在.Net可以完全用介面來替換抽象類。其實不然,介面和抽象類各有長處和缺陷,因此往往在應用當中,兩者要結合來使用,從而互補長短。   接下來先說說

javareplace()replaceAll()的區別

replace和replaceAll是JAVA中常用的替換字元的方法,它們的區別是: 1)replace的引數是char和CharSequence,即可以支援字元的替換,也支援字串的替換(CharSequence即字串序列的意思,說白了也就是字串); 2)replaceA

cookie,sessionStoragelocalStorage區別

一次 flash htm ddb coo 清除 rem 限制 web服務器 在客戶端存儲數據可以使用的技術有如下四種: Cookie技術:瀏覽器兼容性好,但操作比較復雜,需要程序員自己封裝,源生的Cookie接口不友好 H5 WebStorage:不能超過8

css浮動清除浮動帶來的影響

淺談css中浮動和清除浮動帶來的影響 有很多時候,我們都會用到浮動,而我們有時候對浮動只是一知半解,卻不是太清楚它到底是怎麼回事,不知道各位有沒有和我一樣的感覺,只知道用它,卻不知道它到底是怎麼回事,所以,在學習的過程中,就要把一個概念不是很清晰的問題把它弄清楚了,便於我們以後的使用。早些時候,

jqueryprop()attr()

我們都知道,一般在jquery中設定屬性時要用到attr()方法,現在我們有一個效果,點選按鈕切換複選框的選中狀態,下面貼出html程式碼: <input type="checkbox" id="check"> <label>複選框</label> &

JAVA物件的理解

   我們知道程式語言是一個幫助我們和計算機“對話”的工具,我們可以通過它去讓計算機做一些事。而JAVA語言又是其中的高階語言,那麼什麼是高階?機器語言和人類語言之間有著巨大的鴻溝,人們不斷的想要跨過這個鴻溝,在這個過程中出現了一些“工具”,就是所謂的程式語言。通過這些語言

javaSet,Map,List區別

一,HashMap與Hashtable的區別 1.HashMap去掉了Hashtable 的contains方法,但是加上了containsValue()和containsKey()方法。 2.Hashtable是同步的,而HashMap是非同步的,效率上逼Hashtable要高。 3.hashMap允許空

caffetrain_val.prototxtdeploy.prototxt文件的區別

image pixel proto form 準確率 .proto 應用 網絡 基礎 本文以CaffeNet為例: 1. train_val.prototxt 首先,train_val.prototxt文件是網絡配置文件。該文件是在訓練的時候用的。 2.dep

c++結構體共用體的區別

ont 基本類型 erl list 變量名 ext 使用結構體 oot 數據格式 在c++中,結構體(struct)和共用體(union)是兩種很相似的復合數據類型,都可以用來存儲多種數據類型,但是兩者還有很大的區別。 結構體(struct) 結構是用戶自定

java的"=="eqals區別

short copy 覆寫 main 否則 變量 程序 bar gif 在初學Java時,可能會經常碰到下面的代碼: 1 String str1 = new String("hello"); 2 String str2 = new String("hello");

JS的!=、== 、!==、===的用法區別 JSNull與Undefined的區別 讀取XML文件 獲取路徑的方式 C#Cookie,Session,Application的用法與區別? c#反射 抽象工廠

main 收集 data- 時間設置 oba ase pdo 簡單工廠模式 1.0 var num = 1; var str = ‘1‘; var test = 1; test == num //true 相同類型 相同值 te

【分析】C#Control的Invoke與BeginInvoke在主副線程的執行順序區別(SamWang)

info start result 初步 總結 inter blank rap 傳遞   今天無意中看到有關Invoke和BeginInvoke的一些資料,不太清楚它們之間的區別。所以花了點時間研究了下。   據msdn中介紹,它們最大的區別就是BeginInvoke屬於

caffetrain_val.prototxtdeploy.prototxt檔案的區別

在剛開始學習的時候,覺得train_val.prototxt檔案和deploy.prototxt檔案很相似,然後當時想嘗試利用deploy.prototxt還原出train_val.prototxt檔案,所以就進行了一下對比,水平有限,可能很多地方說的不到位,希望大神們指點批

java"&&""&"的區別

“&&”和”&”都是java中的邏輯運算子,並且它們都表示“邏輯與”即“同真則真,有一假則假”,它們的區別在於”&&”具有短路功能,即如果左邊是false,則右邊的邏輯表示式不會執行。而”&”沒有短路功能,無論左邊是false還是true右邊都會執行。

AngularJS的$parse$eval

淺談 return 什麽是 apply() logs ava new 表達式 ret AngularJS的初學者常常會對$parse和$eval兩個內建服務感到有些困惑,今天我們就來說說AngularJS中的$parse和$eval。 總的來說,$parse和$eval都