真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java集合類(Collection、Map)概述-創(chuàng)新互聯(lián)

文章目錄
  • 一、Collection和數(shù)組的區(qū)別
  • 二、遍歷集合的方法
    • 1.使用lambda表達式遍歷集合
    • 2.使用Iterator循環(huán)遍歷Collection
    • 3.使用foreach循環(huán)遍歷Collection
  • 三、使用Predicate操作集合
  • 四、使用Stream操作集合
  • 五、Set集合
    • 1.HashSet
    • 2.LinkedHashSet
    • 3.TreeSet
    • 4.EnumSet
    • 5.Set實現(xiàn)類的選擇
  • 六、List集合
    • 1.ArrayList(基于數(shù)組的線性表)
    • 2.Vector
  • 七、Queue
    • 1.PriorityQueue
    • 2.Deque
    • 3.ArrayDeque
    • 4.LinkedList(基于鏈的線性表)
    • 5.各種線性表的選擇
  • 八、Map
    • 1.HashMap
    • 2.Hashtable(古早,和Vector一樣)
    • 3.LinkedHashMap
    • 4.Properties
    • 5.TreeMap
    • 6.WeakHashMap
    • 7.IdentityHashMap
    • 8.Map實現(xiàn)類的選擇
  • 九、操作集合的工具類:Collections

首先,要知道Java中的集合不僅僅是指Set系列,而是(包含Set、List、Queue和Map四種體系),是用于存儲數(shù)量不等的對象。
其中,Set代表無序、不可重復(fù)的集合;
List代表有序、重復(fù)的集合;
Map則代表具有映射關(guān)系的集合;
Queue代表一種隊列集合;

Java集合類主要是由兩個接口派生而出:CollectionMap
在這里插入圖片描述

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的中江網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!一、Collection和數(shù)組的區(qū)別

數(shù)組:
長度不可變;
無法保存具有映射關(guān)系的數(shù)據(jù);
數(shù)組元素可以是基本類型(byte,short,int,long,float,double,boolean,char)的值,也可以是對象(實際上保存的是對象的引用變量)
集合類:
可以保存長度不確定的數(shù)據(jù);
可以保存具有映射關(guān)系的數(shù)據(jù);
集合里保存的是對象(實際上保存的是對象的引用變量)

二、遍歷集合的方法 1.使用lambda表達式遍歷集合
//programming=["Java","Python","C#","C++"]
programming.forEach(obj ->System.out.println("迭代集合元素:" + obj));
2.使用Iterator循環(huán)遍歷Collection
//programming=["Java","Python","C#","C++"]
var it = programming.iterator(); // 獲取programming集合對應(yīng)的迭代器
while (it.hasNext()){// it.next返回的是數(shù)據(jù)類型是Object類型,因此需要強制類型轉(zhuǎn)換
	var p = (String) it.next();
	System.out.println(p);
}
3.使用foreach循環(huán)遍歷Collection
//programming=["Java","Python","C#","C++"]
for (var program : programming){var p = (String) program;
	System.out.println(p);
}		
三、使用Predicate操作集合
public class temp {public static void main(String[] args) {var programming = new HashSet<>();
    programming.add("Java");
    programming.add("Python");
    programming.add("C#");
    programming.add("C++");
    programming.add("JavaScript");
    programming.add("Vue");
    System.out.println(calculate(programming, ele ->((String) ele).length() == 3));
    System.out.println(calculate(programming, ele ->((String) ele).contains("C")));
  }

  public static int calculate(Collection objs, Predicate p) {int total = 0;
    for (var obj : objs) {  // 使用Predicate的test()方法判斷該對象是否滿足Predicate指定的條件
      if (p.test(obj)) {total++;
      }
    }
    return total;
  }
}
四、使用Stream操作集合

獨立使用stream的步驟如下:

  1. 使用Stream或XxxStream的builder()類方法創(chuàng)建該Stream對應(yīng)的Builder;
  2. 重復(fù)調(diào)用Builder的add()方法向流中添加多個元素;
  3. 調(diào)用Builder的build()方法獲取對應(yīng)的Stream;
  4. 調(diào)用Stream的聚集方法;
    (對于大部分的聚集方法,每個Stream只能執(zhí)行一次,所以下面執(zhí)行了兩個聚集方法allMatch和map,在兩個方法之間又重新定義了一個變量is1,給第二個聚集方法使用)
public static void main(String[] args) {var is = IntStream.builder().add(3).add(1).add(2).add(9).build();
    System.out.println("is所有元素是否都是偶數(shù):" + is.allMatch(ele ->ele % 2 == 0));

    var is1 = IntStream.builder().add(3).add(1).add(2).add(9).build();
    var newIs = is1.map(ele ->ele * 3 + 5);
    newIs.forEach(System.out::println);
    //    is.forEach(ele ->System.out.println(ele % 2));
  }

Stream提供了大量的方法進行聚集操作,這些方法既可以是“中間的”,也可以是“末端的”。上述的allMatch就是末端操作,map是中間操作。
中間操作:允許流保持打開狀態(tài),并允許直接調(diào)用后續(xù)方法,中間方法的返回值是另外一個流;
末端方法:對流的最終操作。當(dāng)對某個Stream執(zhí)行末端方法后,該流將會被“消耗”,切不可再用。
所以上述的is流進行了allMatch末端操作后,被消耗,不可再次使用;

常用的中間操作:filter、mapToXxxpeek、distinct、sorted、limit
常用的末端方法:forEach、toArrayreduce、min、maxcount、anyMatch、allMatchnoneMatch、findFirst、findAny

五、Set集合 1.HashSet

HashSet按Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能。

  • 不能保證元素的排列順序;
  • HashSet不是同步的,是線程不安全的;
  • 集合元素值可以是null;
2.LinkedHashSet
  • LinkedHashSet是HashSet的子類;
  • 也是根據(jù)元素的hashCode值來決定元素的存儲位置,但它同時使用鏈表維護元素的次序。這樣是的元素看起來是以插入的順序保存的;
  • 線程不安全;
  • 集合元素值可以是null;
3.TreeSet
  • TreeSet是SortedSet接口的實現(xiàn)類,可以確保集合元素處于排序狀態(tài);
  • 采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)來存儲集合元素;
  • 線程不安全;
  • 自然排序自然排序的對象要實現(xiàn)Comparable接口,而且應(yīng)該是同一個類的多個實例;
  • 定制排序在創(chuàng)建TreeSet對象時,提供一個Comparator對象與該TreeSet集合關(guān)聯(lián),由Comparator對象負責(zé)集合元素的排序邏輯;
    (0:相等;負整數(shù):前者小于后者;正整數(shù):前者大于后者)
4.EnumSet
  • EnumSet中的所有元素都必須是指定枚舉類型的枚舉值
  • 元素有序,以枚舉值在Enum類內(nèi)的定義順序來決定集合元素的順序
  • 在內(nèi)部以向量的形式存儲,緊湊高效,占用內(nèi)存小,運行效率高
  • 不允許加入null元素
  • 線程不安全
5.Set實現(xiàn)類的選擇

性能:EnumSet >HashSet >TreeSet
需要一個保持排序的Set:TreeSet
遍歷:LinkedHashSet >HashSet
即一般情況下選HashSet,需要排序TreeSort,強調(diào)遍歷LinkedHashSet枚舉EnumSet

六、List集合 1.ArrayList(基于數(shù)組的線性表)
  • 封裝了一個動態(tài)的,允許再分配的Object[]數(shù)組,initialCapacity參數(shù)默認值為10;
  • 對于所有內(nèi)部基于數(shù)組的集合實現(xiàn),使用隨機訪問的性能要比使用Iterator迭代訪問的性能要好;
  • 線程不安全
  • Arrays.asList:生成Arrays的內(nèi)部類ArrayList的一個實例,Arrays.ArrayList是一個固定長度的List集合,只能遍歷,不能增加刪除;
2.Vector
  • 與上述ArrayList類似,顯著區(qū)別是:Vector線程安全,還提供了一個Stack子類,模擬“棧”;
  • 雖然Vector也是以數(shù)組的形式存儲集合元素,但因為它實現(xiàn)了線程同步功能,加之其它原因,性能較差;
七、Queue 1.PriorityQueue
  • Queue的實現(xiàn)類
  • 保存隊列中的元素順序以隊列元素大小排序,而不是加入隊列的順序;
  • 不允許插入null元素;
  • 自然排序
  • 定制排序
  • 對元素的要求類似于TreeSet;
2.Deque
  • 是Queue的子接口,代表一個雙端隊列,既可以當(dāng)隊列使用,也可以當(dāng)棧使用;
3.ArrayDeque
  • Deque接口的實現(xiàn)類
    • 封裝了一個動態(tài)的,允許再分配的Object[]數(shù)組,initialCapacity參數(shù)默認值為16;
4.LinkedList(基于鏈的線性表)
  • List接口的實現(xiàn)類,有List集合的特點,可以根據(jù)索引來隨機訪問集合中的元素;
  • 實現(xiàn)了Deque接口,可以被當(dāng)成雙端隊列使用,“?!薄ⅰ瓣犃小?/li>
5.各種線性表的選擇
  • 所有內(nèi)部以數(shù)組作為底層實現(xiàn)的集合在隨機訪問時性能都比較好,eg. ArrayList、ArrayDeque
  • 內(nèi)部以鏈表形式作為底層實現(xiàn)的集合在執(zhí)行插入、刪除操作時有較好的性能,eg. LinkedList
  • 提到排序的:PriorityQueue
八、Map

Set接口下有HashSet、LinkedHashSet、SortedSet、TreeSet、EnumSet等子接口和實現(xiàn)類;
Map接口下有HashMap、LinkedHashMap、SortedMap、TreeMap、EnumMap等子接口和實現(xiàn)類;
Map的類和子接口中Key集的存儲形式和對應(yīng)的Set集合中的元素存儲形式完全相同;
從Java源碼來看,Java先是實現(xiàn)了Map,然后通過包裝一個所有value均為空對象的Map就實現(xiàn)了Set集合;
Map提供了一個Entry內(nèi)部類來封裝key-value對,而計算Entry存儲時則只考慮Entry封裝的key;

1.HashMap
  • 線程不安全
  • 可以使用null為key或value,最多只能有一個key-value對的key為null;
2.Hashtable(古早,和Vector一樣)
  • 線程安全,性能比HashMap差;
  • 不允許使用null作為key和value;
3.LinkedHashMap
  • HashSet的子類
  • 需要維護元素的插入順序,性能略低于HashMap;
  • 以(雙向)鏈表維護內(nèi)部元素,所以迭代訪問(遍歷時)有較好性能;
scores.forEach((key,value) ->System.out.println(key + "-->" + value));
4.Properties
  • Hashtable的子類
  • 處理屬性文件(ini、xml)
5.TreeMap
  • 自然排序
  • 定制排序
6.WeakHashMap
  • HashMap的key保存了對實際對象的強引用
  • WeakHashMap保存了對實際對象的弱引用
7.IdentityHashMap
  • 與HashMap類似
  • 不同點:在IdentityHashMap中,當(dāng)且僅當(dāng)兩個key嚴(yán)格相等(key1 == key2)時,才認為兩個key相等;在HashMap中,只要key1和key2通過equals方法比較返回true,且hashCode值相等,才認為兩個key相等;
8.Map實現(xiàn)類的選擇

性能:EnumMap >HashMap(IdentityHashMap) >LinkedHashMap >Hashtable >TreeMap
強調(diào)排序:TreeMap >HashMap

九、操作集合的工具類:Collections
  1. 排序
  2. 查找替換
  3. 同步控制synchronizedXxx
  4. 設(shè)置不可變集合:emptyXxx、singletonXxxunmodifiableXxx、(Java9新增的:Set、List、Map的of方法)

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


當(dāng)前名稱:Java集合類(Collection、Map)概述-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://weahome.cn/article/csjegi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部