java編寫一個集合類_Java集合類

數組是一種很常見的數據結構,開始接觸編程的時候多數程序都和數組相關。剛開始接觸Java時也是一直使用數組寫一些程序,后來越來越覺得數組這東西沒法滿足需求了,這時一位“前輩”對我說了一句:不會用集合類就等于沒學過Java。然后才知道有集合類。

想想已經是3、4年前的事了,時間如白駒過隙啊。

什么時候數組會顯得力不從心,沒法滿足需求,需要集合類呢?

不知道具體數據長度

需要自動排序

存儲鍵值對

當然,上面的情況不是絕對的,只是數組比較難滿足。這時集合類(也可稱為容器類)就顯示了它強大的功能。

集合類的分類(圖片轉自http://biancheng.dnbcw.info/1000wen/359774.html)

5bbf501655b3cb968505f80107a245bd.png

上圖中不包含Queue內容,部分Map的實現類未給出。

常見使用的有List、Set、Map及他們的實現類。

List、Set、Map接口及各實現類的特性

接口

特性

實現類

實現類特性

成員要求

List

線性、有序的存儲容器,可通過索引訪問元素

ArrayList

數組實現。非同步。

Vector

類似ArrayList,同步。

LinkedList

雙向鏈表。非同步。

Map

保存鍵值對成員

HashMap

基于哈希表的?Map?接口的實現,滿足通用需求

任意Object對象,如果修改了equals方法,需同時修改hashCode方法

TreeMap

默認根據自然順序進行排序,或者根據創建映射時提供的?Comparator進行排序

鍵成員要求實現caparable接口,或者使用Comparator構造TreeMap。鍵成員一般為同一類型。

LinkedHashMap

類似于HashMap,但迭代遍歷時取得“鍵值對”的順序是其插入順序或者最近最少使用的次序

與HashMap相同

IdentityHashMap

使用==取代equals()對“鍵值”進行比較的散列映射

成員通過==判斷是否相等

WeakHashMap

弱鍵映射,允許釋放映射所指向的對象

ConcurrentHashMap

線性安全的Map

Set

成員不能重復

HashSet

為快速查找設計的Set

元素必須定義hashCode()

TreeSet

保持次序的Set,底層為樹結構

元素必須實現Comparable接口

LinkedHashSet

內部使用鏈表維護元素的順序(插入的次序)

元素必須定義hashCode()

在滿足要求的情況下,Map應盡量使用HashMap,Set應盡量使用HashSet。

集合類的基本使用

List

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.pngList基本操作

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 ArrayList arrayList = new ArrayList();

2 arrayList.add("Tom");

3 arrayList.add("Jerry");

4 arrayList.add("Micky");

5 // 使用Iterator遍歷元素

6 Iterator it = arrayList.iterator();

7 while (it.hasNext()) {

8 String str = it.next();

9 System.out.println(str);

10 }

11 // 在指定位置插入元素

12 arrayList.add(2, "Kate");

13 // 通過索引直接訪問元素

14 for (int i = 0; i < arrayList.size(); i++) {

15 System.out.println(arrayList.get(i));

16 }

17 List subList = new ArrayList();

18 subList.add("Mike");

19 // addAll(Collection extends String> c)添加所給集合中的所有元素

20 arrayList.addAll(subList);

21 // 判斷是否包含某個元素

22 if (arrayList.contains("Mike")) {

23 System.out.println("Mike is include in the list");

24 }

25

26 LinkedList linkedList = new LinkedList();

27 linkedList.addAll(arrayList);

28 // 獲取指定元素

29 System.out.println(linkedList.get(4));

30 // 獲取第一個元素

31 System.out.println(linkedList.getFirst());

32 // 獲取最后一個元素

33 System.out.println(linkedList.getLast());

34 // 獲取并刪除第一個元素

35 System.out.println(linkedList.pollFirst());

36 // 獲取,但不移除第一個元素

37 System.out.println(linkedList.peekFirst());

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

ArrayList和LinkedList的效率比較

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.pngArrayList添加元素的效率

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 ArrayList arrList = new ArrayList();

2 long startTimeMillis, endTimeMillis;

3 startTimeMillis = System.currentTimeMillis();

4 for (int i = 0; i < 10000; i++) {

5 arrList.add(0, "addString");

6 }

7 endTimeMillis = System.currentTimeMillis();

8 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

9 + "ms");

10

11 arrList.clear();

12

13 startTimeMillis = System.currentTimeMillis();

14 for (int i = 0; i < 20000; i++) {

15 arrList.add(0, "addString");

16 }

17 endTimeMillis = System.currentTimeMillis();

18 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

19 + "ms");

20

21 arrList.clear();

22

23 startTimeMillis = System.currentTimeMillis();

24 for (int i = 0; i < 40000; i++) {

25 arrList.add(0, "addString");

26 }

27 endTimeMillis = System.currentTimeMillis();

28 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

29 + "ms");

30

31 arrList.clear();

32

33 startTimeMillis = System.currentTimeMillis();

34 for (int i = 0; i < 80000; i++) {

35 arrList.add(0, "addString");

36 }

37 endTimeMillis = System.currentTimeMillis();

38 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

39 + "ms");

40

41 arrList.clear();

42

43 startTimeMillis = System.currentTimeMillis();

44 for (int i = 0; i < 160000; i++) {

45 arrList.add(0, "addString");

46 }

47 endTimeMillis = System.currentTimeMillis();

48 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

49 + "ms");

50

51 arrList.clear();

52

53 startTimeMillis = System.currentTimeMillis();

54 for (int i = 0; i < 320000; i++) {

55 arrList.add(0, "addString");

56 }

57 endTimeMillis = System.currentTimeMillis();

58 System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)

59 + "ms");

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

執行時間比較

執行次數(在0號位置插入)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

31

0

20000

141

0

40000

484

16

80000

1985

0

160000

7906

0

320000

31719

16

執行次數(在尾部插入)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

0

0

20000

15

0

40000

0

0

80000

0

0

160000

0

15

320000

0

16

循環輸出次數(get(index)方法)

ArrayList所用時間(ms)

LinkedList所用時間(ms)

10000

93

204

20000

188

797

40000

328

2734

80000

688

13328

160000

1594

62313

320000

2765

太久了……

因為ArrayList底層由數組實現,在0號位置插入時將移動list的所有元素,在末尾插入元素時不需要移動。LinkedList是雙向鏈表,在任意位置插入元素所需時間均相同。所以在List中有較多插入和刪除操作的情況下應使用LinkedList來提高效率,而有較多索引查詢的時候使用ArrayList(使用增強型的for循環或Iterator遍歷LinkedList效率將提高很多)。

Map

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.pngMap基本操作

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 HashMap map = new HashMap();

2 // 向Map中添加元素

3 map.put("Tom", 26);

4 map.put("Jack", 18);

5 map.put("Micky", 17);

6 map.put("Kate", 15);

7 // 根據Key獲取Value

8 System.out.println("Jack is " + map.get("Jack") + " years old");

9 // 移除

10 map.remove("Micky");

11 // 遍歷Map

12 for (Entry entry : map.entrySet()) {

13 System.out.println("name:" + entry.getKey() + " age:"

14 + entry.getValue());

15 }

16 // Key相同的元素將被覆蓋

17 map.put("Jack", 19);

18 // 根據Key獲取Value

19 System.out.println("Jack is " + map.get("Jack") + " years old");

20 // 判斷是否包含某個Key

21 if (map.containsKey("Tom")) {

22 System.out.println(map.get("Tom"));

23 }

24 // 判斷是否包含某個Value

25 if (map.containsValue(26)) {

26 System.out.println("The map include the value 26");

27 }

28 // 判斷map是否為空

29 if (!map.isEmpty()) {

30 // 獲取map大小

31 System.out.println("The map's size=" + map.size());

32 }

33 // 獲取Key的集合

34 for (String str : map.keySet()) {

35 System.out.println(str);

36 }

37

38 TreeMap treeMap = new TreeMap();

39 treeMap.putAll(map);

40 // 輸出內容按照key值排序

41 for (Entry entry : treeMap.entrySet()) {

42 System.out.println("name:" + entry.getKey() + " age:"

43 + entry.getValue());

44 // name:Jack age:19

45 // name:Kate age:15

46 // name:Tom age:26

47 }

48

49 LinkedHashMap linkedHashMap = new LinkedHashMap();

50 // 向Map中添加元素

51 linkedHashMap.put("Tom", 26);

52 linkedHashMap.put("Jack", 18);

53 linkedHashMap.put("Micky", 17);

54 linkedHashMap.put("Kate", 15);

55 // 保持了插入的順序

56 for (Entry entry : linkedHashMap.entrySet()) {

57 System.out.println("name:" + entry.getKey() + " age:"

58 + entry.getValue());

59 // name:Tom age:26

60 // name:Jack age:18

61 // name:Micky age:17

62 // name:Kate age:15

63 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

Set

48304ba5e6f9fe08f3fa1abda7d326ab.png

961ddebeb323a10fe0623af514929fc1.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 List list = new ArrayList();2 list.add(3);3 list.add(4);4 HashSet hashSet = new HashSet();5 hashSet.add(1);6 hashSet.add(3);7 hashSet.add(2);8 hashSet.add(6);9 //重復元素將不能被添加

10 hashSet.add(3);11 //只要有元素被添加就返回true

12 if(hashSet.addAll(list)) {13 System.out.println("Add success");14 }15 //判斷是否存在某個集合

16 if(hashSet.containsAll(list)) {17 System.out.println("The hashSet is contain 3 and 4");18 }19 Iterator it =hashSet.iterator();20 while(it.hasNext()) {21 System.out.print(it.next() + " ");22 //1 2 3 4 623 //看結果是被排序了,HashSet按照Hash函數排序,Integer值的HashCode就是其int值

24 }25 //換轉成數組

26 Object[] integers =hashSet.toArray();27 for (int i = 0; i < integers.length; i++) {28 System.out.print((Integer) integers[i]);29 }30 //移除元素

31 hashSet.remove(3);32

33 TreeSet treeSet = new TreeSet();34 treeSet.add("C");35 treeSet.add("A");36 treeSet.add("D");37 treeSet.add("B");38 for (Iterator strIt =treeSet.iterator(); strIt.hasNext();) {39 System.out.print(strIt.next());40 //ABCD 按照字母順序

41 }42 LinkedHashSet linkedHashSet = new LinkedHashSet();43 linkedHashSet.add("C");44 linkedHashSet.add("A");45 linkedHashSet.add("D");46 linkedHashSet.add("B");47 for (Iterator linkedIt =linkedHashSet.iterator(); linkedIt48 .hasNext();) {49 System.out.print(linkedIt.next());50 //CADB 按照插入順序

51 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

本文沒有對ArrayList及HashMap進行深入的分析,這兩個類是集合類中最常用的類,將另開文章進行深入剖析。

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

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

相關文章

python 當前文件路徑獲取方式_Python獲取當前文件路徑

一. Python 獲取當前文件路徑方法2. sys.path[0]獲取文件當前工作目錄路徑(絕對路徑)sys.argv[0]|獲得模塊所在的路徑(由系統決定是否是全名)若顯示調用python指令&#xff0c;如python demo.py&#xff0c;會得到絕對路徑;若直接執行腳本&#xff0c;如./demo.py&#xff0c;會…

pdf不支持64位瀏覽器_4MLinux 31.0 發布,不支持32位

Zbigniew Konojacki宣布發布4MLinux 31.0&#xff0c;這是該項目極簡發行版的新穩定版本&#xff0c;專注于四個功能&#xff1a;維護(作為系統救援Live CD)&#xff0c;多媒體(用于播放視頻DVD和其他多媒體文件)&#xff0c;迷你服務器(使用inetd守護程序)和神秘的版本(提供幾…

java期末考試2013及答案_java筆試經典(題及答案)2013.doc

java筆試經典(題及答案)2013.doc Java筆試經典(基礎部分及答案和分析)1、一個“.java“源文件中是否可以包括多個類(不是內部類)&#xff1f;有什么限制&#xff1f;7答:可以包括多個類&#xff0c;但是最多只能有一個public修飾的類。2、Java有沒有goto?7答&#xff1a;java中…

datatables 行分組信息展開與折疊的功能實現_[LaTeX 嘗試] fancyvrb - 修復行引用的超鏈接跳轉位置

本文已加入專欄文章目錄&#xff0c;歸入「進階使用」文章系列。本文可以看作對這個發生于 2019 年 7 月中旬的 TeX-SX 上自問自答的展開說明。那個回答中避免了 python 的使用&#xff0c;而是利用 zref 宏包把位置信息以文本形式在 pdf 中呈現&#xff0c;好處是不用引入 pyt…

qtcreator攝像頭顯示時間_三星Galaxy S11 +渲染器展現出巨大的相機凹凸和四邊形曲面顯示...

我們正接近一年中三星宣布其Galaxy S系列最新設備的時間。Galaxy S10系列被認為是三星發布的最好的版本之一&#xff0c;因此在這方面他們有很多重要的事情。我們已經看到了Galaxy S11和Galaxy S11e的渲染&#xff0c;但是現在我們首先來看看Galaxy S11 。三星Galaxy S11 與其他…

php源碼安裝配置,php源碼安裝時configure配置參數 | 學步園

在Linux下安裝PHP&#xff0c;源代碼方式安裝&#xff0c;總需要配置很多參數。這里列出常用配置參數&#xff0c;并詳細用中文解釋說明了。給大家一些參考./configure–prefix/usr/local/PHP php 安裝目錄–with-apxs2/usr/local/apache/bi…

python遞歸函數詳解-講解Python中的遞歸函數

在函數內部&#xff0c;可以調用其他函數。如果一個函數在內部調用自身本身&#xff0c;這個函數就是遞歸函數。 舉個例子&#xff0c;我們來計算階乘n! 1 x 2 x 3 x ... x n&#xff0c;用函數fact(n)表示&#xff0c;可以看出&#xff1a; ? 1 fact(n) n! 1 x2 x3 x ... x …

php 高效判斷是否登錄,php 判斷用戶是否登錄

判斷用戶登陸主要分幾個過程&#xff0c;第一步是用戶登陸成功后把數據保存到session中&#xff0c;然后當用戶訪問需要登陸過的用戶權限時就來判斷session是否為空&#xff0c;如果不是就登錄成功。下面來看個實例session_start();if(getconfig("chatroom_admin")$_…

php異步處理任務工具,php異步任務處理: gearman

Gearman是一個用來把工作委派給其他機器、分布式的調用更適合做某項工作的機器、并發的做某項工作在多個調用間做負載均衡準備軟件包gearmand-1.1.12.tar.gzgearman-1.1.1.tgz php擴展安裝支持組件yum -y install boost-devel* gperf* libevent-devel* libuuid-devel*./configu…

頁面錯誤!請稍后再試_微信內嵌H5頁面授權和分享

近期新上線項目&#xff0c;用到了微信授權獲取用戶信息和分享&#xff0c;掉坑無數次&#xff0c;遂寫此篇&#xff0c;為后人指路項目情況技術選型項目語言&#xff1a;HTML、CSS、JavaScript項目框架&#xff1a;Vue.js項目搭建腳手架&#xff1a;vue-cli工程化工具&#xf…

電腦打字手指正確姿勢_正確的彈琴手型,應該是怎樣的?

手型是基礎&#xff0c;手型規范才有助于練習出正確的指法&#xff0c;指法正確就可以提高練習質量。剛入門的時候&#xff0c;不能刻意的要求手型&#xff0c;但是我們要有一個基本的要求&#xff0c;就是手要保持放松。彈琴的時候&#xff0c;沒有多余的身體的力量參與到觸鍵…

php 開源 采集,迅睿CMS 火車頭內容采集

采集工具&#xff1a;火車采集器 v7.6采集模塊&#xff1a;新聞 News一、編寫采集入庫腳本接口新建&#xff1a;./api/caiji.php/*** 數據采集*/define(IS_API, basename(__FILE__, .php)); // 項目標識define(SELF, pathinfo(__FILE__, PATHINFO_BASENAME)); // 該文件的名稱r…

英文數據集txt_YOLOv5在建筑工地中安全帽佩戴檢測的應用(已開源+數據集)

點擊上方“計算機視覺cv”即可“進入公眾號”重磅干貨第一時間送達前言隨著人工智能的發展&#xff0c;現在越來越多的場景需要人工智能。在工廠的廠區中以安全為首&#xff0c;但工人普遍缺乏佩戴安全帽意識&#xff1b;工廠環境復雜&#xff0c;有各種各樣的禁止進入的區域&a…

浪潮集團PHP,浪潮php實習第一天(初識php)

先推薦幾個比較好的php初學者資料php manual.chm(可在csdn下載頻道下載&#xff0c;可查到大部分函數)比較好的開發工具1 eclipse PDT(對eclipse比較熟悉的比較適應)2.zendStudio(公認的最好的php集成開發環境)php沒有想象中的那么難學&#xff0c;不僅僅是它的語法&#xff0c…

檢測到目標url存在內部ip地址泄露_Cendertron,動態爬蟲與敏感信息泄露檢測

Cendertron&#xff0c;動態爬蟲與敏感信息泄露檢測Cendertron Crawler RendertronCendertron https://url.wx-coder.cn/HinPM 是基于 Puppeteer 的 Web 2.0 動態爬蟲與敏感信息泄露檢測工具。其依托于 xe-crawler 的通用爬蟲、調度與緩存模型&#xff0c;新增了 Monkey Test…

wamp2 php配置,wamp安裝后自定義配置的方法

WampServer是目前應用非常廣泛的PHP集成開發環境&#xff0c;本文就來講述Wamp安裝后自定義配置的方法。供大家參考借鑒。具體如下&#xff1a;wamp2.5安裝完畢后&#xff0c;自己手動重新設置了apache的默認根目錄。但是發現本機可以訪問&#xff0c;別人不能訪問。提示信息為…

屏幕壞點檢測圖片_iPhone新機如何檢測質量 iPhone新機檢測質量步驟【詳解】

iPhone新機怎么檢測好壞_iPhone新機檢測質量方法 說實話&#xff0c;蘋果對于iPhone的品控把握確實一代不如一代&#xff0c;特別是去年發布的iPhone7系列&#xff0c;很多用戶都反映自己新買的手機存在劃痕、屏幕發黃、掉漆等問題。那么當我們購買一部全新的iPhone7時&#xf…

php 安全mysql,關于php:我從mysql注入安全嗎?

本問題已經有最佳答案&#xff0c;請猛點這里訪問。這是否足以避免SQL注入&#xff1f;這里只需要mysql_real_escape_string()方法。在將數據插入數據庫之前&#xff0c;不應該執行htmlentities()或urlencode()。這些方法通常是在呈現您提供給用戶的視圖期間編寫的代碼。避免SQ…

excel單元格斜線_怎么在excel中畫斜線?怎么在excel表格中畫斜線?

在excel表格中畫斜線的技巧教程&#xff1a;1.在Excel中打開一個空白工作簿。 2.您可以在任何大小的單元格中執行此操作&#xff0c;但是如果先將其增大則更容易理解。為此&#xff0c;我們只需單擊并按住第1行和第2行之間的線&#xff0c;然后將其拖動到所需的高度即可。然后對…

php報表數據打印機,通過打印機打印帶打印功能的php表

我有以下php表,我如何只在php表中添加打印功能&#xff1f;點擊一個按鈕,下面的表格通過打印機打印,我試過’CTRL P’,我只得到頁面的html部分示例頁眉,頁腳,導航欄,而不是結果php結果echo "FILEIDFirstnameLastnameIssue DateInterest RateTermsBalance OutstandingBalan…