日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中List、Map、Set、Collection、Stack、Queue等的使用

發布時間:2023/12/9 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中List、Map、Set、Collection、Stack、Queue等的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java中這幾個東西是比較常用的,雖然我用的不多,也正是因為用的不多,所以我一直搞不清楚他們之間的具體用法以及相互之間的關系,現在特單獨作為一個東西來總結一下。

?

本文參考一下資料:

1.《java編程思想》一書第11章

2.http://blog.sina.com.cn/s/blog_a345a8960101k9vx.html

3.http://f51889920.iteye.com/blog/1884810

4.http://blog.csdn.net/speedme/article/details/22398395

5.http://www.tuicool.com/articles/qeEzym

6.http://blog.csdn.net/hguisu/article/details/7644395

在《java編程思想》一書中,這幾個東西放到一章里面講的,是在第11章。分了好多的小節去講的,看了一會,看的頭疼,但是基本上好多東西都可以明白,比較容易梳理。

首先放個圖在前面,展示下他們各個集合類之間的關系,如下:

java集合框架的基本接口/類層次結構

java.util.Collection [I] +--java.util.List [I]+--java.util.ArrayList [C]+--java.util.LinkedList [C]+--java.util.Vector [C]+--java.util.Stack [C] +--java.util.Set [I]+--java.util.HashSet [C]+--java.util.SortedSet [I]+--java.util.TreeSet [C]java.util.Map [I] +--java.util.SortedMap [I]+--java.util.TreeMap [C] +--java.util.Hashtable [C] +--java.util.HashMap [C] +--java.util.LinkedHashMap [C] +--java.util.WeakHashMap [C][I]:接口 [C]:類

那么,為什么要有集合類?

面向對象的語言對事物的體現都是以對象的形式,為了方便對多個對象操作,就要對對象進行存儲,集合類就是對多個對象進行存儲的一種方式。

數組和集合類有何不同?

最主要的區別是長度可變不可變問題。數組可以存儲對象,但是長度是固定的,不可變的。集合長度是可變的。其次,數組中可以存儲基本數據類型,集合只能存儲對象。集合的一個比較大的優點是可以存儲不同類型的對象。數組不可以。

下面就開始各種總結。

Collection接口

Collection接口是最基本的集合接口,代表一組Object集合,這些Object被稱作Collection的元素,所有實現Collection接口的類型必須提供兩個標準的構造函數:無參數的構造函數用于創建一個空的Collection,有一個Collection參數的構造函數用于創建一個新的Collection,這個新的Collection與傳入的Collection有相同的元素后一個構造函數允許用戶復制一個Collection。這些都比較容易理解。

1 Collection<Integer> ci = new ArrayList<Integer>(); 2 Collection<Integer> ci2 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));

并且注意Collection中沒有get()方法,要想查看或者操作Collection中的元素只能遍歷,使用的是iterator()方法,使用該方法可以逐一訪問Collection的每一個元素。

1 Iterator it = collection.iterator();//獲得迭代 2 while(it.hasNext()){ 3 Object obj = it.next();//得到下一個元素 4 }

由上圖可知,Collection分為Lst接口和Set接口。

List接口

  List接口是有序的Collection,使用該接口能精確控制每個元素的插入位置,可以使用索引來訪問List中的元素,跟數組是很類似的。并且List中允許有重復元素,當然有些List的實現類不允許重復元素的存在。

  List中有iterator()方法,還有listIterator方法,返回一個ListIterator接口,這個接口比標準的Iterator接口相比,多了一些add之類的方法,允許添加、刪除、設置元素值以及向前或者向后遍歷等。

  如上圖,List下有幾個常用類:LinkedList、ArrayList和Vector以及Stack。

  (1)ArrayList類:實現了可變大小的數組。它允許包含所有元素,包括null。每個ArrayList實例都有一個容量,即用于存儲元素的數組的大小,這個容量可以隨著不斷添加新元素而自動增加,但增長算法沒有定義,當插入大量元素時,插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。

  ? (2)LinkedList類:允許null元素,提供額外的get,remove和insert方法,這使得LinkedList可以用作stack、queue或雙向隊列。它可以再List的中間插入和移除,在這方面比ArrayList有效,但是在隨機訪問方面就沒有ArrayList有效了。如果多個線程同時訪問一個List,則必須自己實現訪問同步,一種解決方法是在創建List時構造一個同步的List:

List list = Collection.synchronizedList(new LinkedList(……));

  (3)Vector類:Vector跟ArrayList非常類似,但是Vector是同步的,由Vector創建的Iterator,雖然和ArrayList創建的 Iterator是同一接口,但是,因為Vector是同步的,當一個Iterator被創建而且正在被使用,另一個線程改變了Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出ConcurrentModificationException,因此必須捕獲該異常。

  (4)Stack類:繼承自Vector,實現一個后進先出的棧。提供了幾個基本方法,push、pop、peak、empty、search等。

總結:

  • List:元素是有序的,元素可以重復。因為該集合體系有索引。
    • ArrayList:底層的數據結構使用的是數據結構。
      • 查詢速度很快。
      • 增刪稍慢。
      • 線程不同步。
      • 默認長度為10增長率為50%。
    • LinkedList:底層使用的鏈表數據結構。
      • 增刪速度很快。
      • 查詢稍慢。
    • Vector:底層是數組數據結構。1.0出現
      • 線程同步
      • 被ArrayList替代了。
      • 長度增長率100%。

Set接口

Set接口是繼承自Collection的,它不能包含有重復元素。Set中最多有一個null元素。

因為Set的這個制約,在使用Set集合的時候,應該注意: 1,為Set集合里的元素的實現類實現一個有效的equals(Object)方法。 2,對Set的構造函數,傳入的Collection參數不能包含重復的元素。 Set下有幾個set類,HashSet、SortedSet、TreeSet,用的較多的是HashSet,其他兩種基本不常用,以后慢慢補充該方面知識,下面說HashSet。 (1)HashSet,底層數據結構式哈希表,由哈希表支持,不保證集合的迭代順序,特別是不保證該順序恒久不變,此類允許使用null元素。HashSet保證元素唯一性的方法是通過元素的兩個方法,hashCode和equals來完成。如果元素的HashCode值相同,才會判斷equals是否為true。如果元素的hashCode值不同,不會調用equals。 (2)TreeSet:底層數據結構式二叉樹。注:添加元素必須實現Comparable接口或在實例TreeSet時指定比較器。可以對Set集合中的元素進行排序。保證元素唯一性的依據:compareTo方法return 0; Map接口 Map集成Collection接口,Map和Collection是兩種不同的集合,Collection是值(value)的集合,Map是鍵值對(key,value)的集合。包含幾種主要類和接口:HashMap、LinkedMap、WeakHashMap、SortedMap、TreeMap、HashTable等幾種。 (1)Hashtable繼承Map接口,實現一個key-value映射的哈希表。任何非空(non-null)的對象都可作為key或者value。添加數據使用put(key, value),取出數據使用get(key),這兩個基本操作的時間開銷為常數。   (2)WeakHashMap類,WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那么該key可以被GC回收。 總結: 如果涉及到堆棧,隊列等操作,應該考慮用List,對于需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。 如果程序在單線程環境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高,如果多個線程可能同時操作一個類,應該使用同步的類。 在除需要排序時使用TreeSet,TreeMap外,都應使用HashSet,HashMap,因為他們 的效率更高。 要特別注意對哈希表的操作,作為key的對象要正確復寫equals和hashCode方法。 容器類僅能持有對象引用(指向對象的指針),而不是將對象信息copy一份至數列某位置。一旦將對象置入容器內,便損失了該對象的型別信息。 盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。 注意: 1、Collection沒有get()方法來取得某個元素。只能通過iterator()遍歷元素。 2、Set和Collection擁有一模一樣的接口。 3、List,可以通過get()方法來一次取出一個元素。使用數字來選擇一堆對象中的一個,get(0)...。(add/get) 4、一般使用ArrayList。用LinkedList構造堆棧stack、隊列queue。 5、Map用 put(k,v) / get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個key/value。 HashMap會利用對象的hashCode來快速找到key。 6、Map中元素,可以將key序列、value序列單獨抽取出來。 使用keySet()抽取key序列,將map中的所有keys生成一個Set。 使用values()抽取value序列,將map中的所有values生成一個Collection。 為什么一個生成Set,一個生成Collection?那是因為,key總是獨一無二的,value允許重復。

轉載于:https://www.cnblogs.com/Pillar/p/4226549.html

總結

以上是生活随笔為你收集整理的java中List、Map、Set、Collection、Stack、Queue等的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。