Java集合知識點,猿人花了幾天時間整理,還有Java超神之路腦圖、月薪3萬Java優秀簡歷模板、全網最全一線大廠Java筆試面試題、1000+本Java開發精華電子書送給大家,希望大家認真學習哦!
集合可以看作是一種容器,用來存盤物件資訊,所有集合類都位于java.util包下,但支持多執行緒的集合類位于java.util.concurrent包下,
陣列與集合的區別如下:
1)陣列長度不可變化而且無法保存具有映射關系的資料;集合類用于保存數量不確定的資料,以及保存具有映射關系的資料,
2)陣列元素既可以是基本型別的值,也可以是物件;集合只能保存物件,
Java集合類主要由兩個根介面Collection和Map派生出來的,Collection派生出了三個子介面:List、Set、Queue(Java5新增的佇列),因此Java集合大致也可分成List、Set、Queue、Map四種介面體系,(注意:Map不是Collection的子介面)
其中List代表了有序可重復集合,可直接根據元素的索引來訪問;Set代表無序不可重復集合,只能根據元素本身來訪問;Queue是佇列集合;Map代表的是存盤key-value對的集合,可根據元素的key來訪問value,
集合體系中常用的實作類,分別是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等實作類,
如下給出了集合的思維導圖:

猿碼天地-Java知識學堂腦圖 (檔案密碼:請關注公眾號【猿碼天地】,回復關鍵字‘活到老學到老’獲取)
猿碼天地-Java超神之路腦圖 (檔案密碼:請關注公眾號【猿碼天地】,回復關鍵字‘活到老學到老’獲取)
List用法

實作方式:ArrayList,LinkedList,Vector
添加物件:list.add()
獲取物件:list.get()
獲取物件大小:list.size()
1.可以允許重復的物件,
2.可以插入多個null元素,
3.是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序,
4.常用的實作類有 ArrayList、LinkedList 和 Vector,ArrayList 最為流行,它提供了使用索引的隨意訪問,而 LinkedList 則對于經常需要從 List 中添加或洗掉元素的場合更為合適,


為什么要用 List list = new ArrayList() ,而不用 ArrayList list = new ArrayList()呢?
問題就在于List有多個實作類,現在你用的是ArrayList,也許哪一天你需要換成其它的實作類,如LinkedList或者Vector等等,這時你只要改變這一行就行了,
List list = new LinkedList(); 其它使用了list地方的代碼根本不需要改動,
假設你開始用 ArrayList list = new ArrayList(), 這下你有的改了,特別是如果你使用了 ArrayList特有的方法和屬性,
Map用法

Map介面中鍵和值一一映射. 可以通過鍵來獲取值,
實作類:HashMap、LinkedHashMap、Hashtable 和 TreeMap
插入元素:map.put()
移除元素:map.remove()
清空元素:map.clear()
獲取map里有多少個鍵值對:map.size()
1、Map不是collection的子介面或者實作類,Map是一個介面,
2、Map 的 每個Entry都持有兩個物件,也就是一個鍵一個值,Map 可能會持有相同的值物件但鍵物件必須是唯一的,
3、TreeMap也通過 Comparator 或者 Comparable維護了一個排序順序,
4、Map里你可以擁有隨意個 null 值但最多只能有一個 null 鍵,
5、Map介面最流行的幾個實作類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap,(HashMap、TreeMap最常用)
java中遍歷map具體方式:

在Map介面中,共有四種實作:HashMap、LinkedHashMap、Hashtable 和 TreeMap,
HashMap 執行緒不安全,效率高,允許null鍵和null值,是基于哈希表的Map介面實作,哈希表的作用是用來保證鍵的唯一性,
Hashtable:執行緒安全,效率低,不允許null鍵和null值,
TreeMap 是基于紅黑樹的Map介面的實作,
Hashtable繼承Map介面,實作一個key-value映射的哈希表,任何非空(non-null)的物件都可作為key或者value, 添加資料使用put(key, value),取出資料使用get(key),這兩個基本操作的時間開銷為常數,


結果:
{key4=value4, key3=value3, key6=value6, key5=value5, key2=value2, key1=value1, key8=value8, key7=value7}
8
true
[key4, key3, key6, key5, key2, key1, key8, key7]
鍵key4,鍵key3,鍵key6,鍵key5,鍵key2,鍵key1,鍵key8,鍵key7,value3
{key4=value4, key6=value6, key5=value5, key2=value2, key1=value1, key8=value8, key7=value7}
[value4, value6, value5, value2, value1, value8, value7]
value6
key4<->value4
key6<->value6
key5<->value5
key2<->value2
key1<->value1
key8<->value8
key7<->value7
map遍歷的7種方式
package com.bowen.demo.demo004;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* <h3>java-study</h3>
* <p>MapBL</p>
* @author : zhang.bw
* @date : 2021-03-22 12:30
**/
public class MapBL {
/**
* HashMap 遍歷
* 大體上可以分為4類:
* 1,迭代器 (EntrySet、KeySet)
* 2,ForEach 遍歷 (EntrySet、KeySet)
* 3,lambda 運算式遍歷(lambda遍歷)
* 4,StreamsApi 遍歷(StreamsApi單執行緒、StreamsApi所執行緒)
*/
/**
* 迭代器 (EntrySet)
*/
public static void test1(){
//創建Map 物件
Map<Integer, String> map = new HashMap<>();
//添加資料
map.put(1,"我愛中國1");
map.put(2,"我愛中國2");
map.put(3,"我愛中國3");
map.put(4,"我愛中國4");
map.put(5,"我愛中國5");
//遍歷
Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer, String> next = iterator.next();
System.out.println(next.getKey());
System.out.println(next.getValue());
}
}
/**
* 迭代器 (KeySet)
*/
public static void test2(){
//創建Map 物件
Map<Integer, String> map = new HashMap<>();
//添加資料
map.put(1,"我愛中國1");
map.put(2,"我愛中國2");
map.put(3,"我愛中國3");
map.put(4,"我愛中國4");
map.put(5,"我愛中國5");
//遍歷
Iterator<Integer> iterator = map.keySet().iterator();
while (iterator.hasNext()){
Integer key = iterator.next();
System.out.print(key);
System.out.print(map.get(key));
}
}
/**
* ForEach 遍歷 (EntrySet)
*/
public static void test3(){
//創建Map 物件
Map<Integer, String> map = new HashMap<>();
//添加資料
map.put(1,"我愛中國1");
map.put(2,"我愛中國2");
map.put(3,"我愛中國3");
map.put(4,"我愛中國4");
map.put(5,"我愛中國5");
//遍歷
for (Map.Entry<Integer,String> entry: map.entrySet()) {
System.out.println("entry.getKey() = " + entry.getKey());
System.out.println("entry.getValue() = " + entry.getValue());
}
}
/**
* ForEach 遍歷 (KeySet)
*/
public static void test4(){
//創建Map 物件
Map<Integer, String> map = new HashMap<>();
//添加資料
map.put(1,"我愛中國1");
map.put(2,"我愛中國2");
map.put(3,"我愛中國3");
map.put(4,"我愛中國4");
map.put(5,"我愛中國5");
//遍歷
for (Integer key: map.keySet()) {
System.out.println(key);
System.out.println(map.get(key));
}
}
/**
* lambda 運算式遍歷(lambda遍歷)
*/
public static void test5(){
//創建Map 物件
Map<Integer, String> map = new HashMap<>();
//添加資料
map.put(1,"我愛中國1");
map.put(2,"我愛中國2");
map.put(3,"我愛中國3");
map.put(4,"我愛中國4");
map.put(5,"我愛中國5");
//遍歷
map.forEach((key,value) -> {
System.out.print(key);
System.out.print(value);
});
}
/**
* treamsApi 遍歷(StreamsApi單執行緒)
*/
public static void test6(){
//創建Map 物件
Map<Integer, String> map = new HashMap<>();
//添加資料
map.put(1,"我愛中國1");
map.put(2,"我愛中國2");
map.put(3,"我愛中國3");
map.put(4,"我愛中國4");
map.put(5,"我愛中國5");
//遍歷
map.entrySet().stream().forEach((integerStringEntry -> {
System.out.println(integerStringEntry.getKey());
System.out.println(integerStringEntry.getValue());
}));
}
/**
* treamsApi 遍歷(StreamsApi所執行緒)
*/
public static void test7(){
//創建Map 物件
Map<Integer, String> map = new HashMap<>();
//添加資料
map.put(1,"我愛中國1");
map.put(2,"我愛中國2");
map.put(3,"我愛中國3");
map.put(4,"我愛中國4");
map.put(5,"我愛中國5");
//遍歷
map.entrySet().parallelStream().forEach((integerStringEntry -> {
System.out.println(integerStringEntry.getKey());
System.out.println(integerStringEntry.getValue());
}));
}
/**
* 測驗
* @param args
*/
public static void main(String[] args) {
MapBL.test1();
MapBL.test2();
MapBL.test3();
MapBL.test4();
MapBL.test5();
MapBL.test6();
MapBL.test7();
}
}
Set用法

Set類繼承了Conllection類,是一種集合類,
Set的實作類有三個:HashSet()、LinkedHashSet()、TreeSet()
1.不允許重復物件,
2.無序容器,你無法保證每個元素的存盤順序,TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序,
3.只允許一個 null 元素,
4.Set 介面最流行的幾個實作類是 HashSet、LinkedHashSet 以及 TreeSet,最流行的是基于 HashMap 實作的 HashSet;TreeSet 還實作了 SortedSet 介面,因此 TreeSet 是一個根據其 compare() 和 compareTo() 的定義進行排序的有序容器,
HashSet()
1.Set中是不能出現重復資料的,
2.Set中可以出現空資料,
3.Set中的資料是無序的,

LinkedHashSet()
1.Set中是不能出現重復資料的,
2.Set中可以出現空資料,
3.Set中的資料是有序的,

TreeSet()
1.不能寫入空資料,
2.寫入的資料是有序的,
3.不寫入重復資料,

使用場景

keyset()和entryset()區別(推薦使用entrySet())
Map<String, String> map = new HashMap<String, String>();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
//先獲取map集合的所有鍵的Set集合,即為map中所有key值的集合
Set<String> keySet = map.keySet();
//有了Set集合,就可以獲取其迭代器,
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String key = it.next();
//有了鍵可以通過map集合的get方法獲取其對應的值,
String value = map.get(key);
//獲得key和value值
System.out.println("key: " + key + "-->value: " + value);
}
Map<String, String> map = new HashMap<String, String>();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
通過entrySet()方法將map集合中的映射關系取出(這個關系就是Map.Entry型別)
Set<Map.Entry<String, String>> entrySet = map.entrySet();
//將關系集合entrySet進行迭代,存放到迭代器中
Iterator<Map.Entry<String, String>> it2 = entrySet.iterator();
while (it2.hasNext()) {
//獲取Map.Entry關系物件me
Map.Entry<String, String> me = it2.next();
//通過關系物件獲取key
String key2 = me.getKey();
//通過關系物件獲取value
String value2 = me.getValue();
System.out.println("key: " + key2 + "-->value: " + value2);
}
雖然使用keyset及entryset來進行遍歷能取得相同的結果,但兩者的遍歷速度是有差別的,
keySet():迭代后只能通過get()取key;再根據key值取value,
entrySet():迭代后可以e.getKey(),e.getValue()取key和value,
getParameterMap和putAll使用
Map readOnlyMap = request.getParameterMap();
Map writeAbleMap = new HashMap();
writeAbleMap.putAll(readOnlyMap);
writeAbleMap.remove()或者put()...
在后續的程式代碼中使用writeAbleMap即可
putAll可以合并兩個map,只不過如果有相同的key那么用后面的覆寫前面的,
List轉Map
List results= null; // R類有no 和 name 屬性值
Map<String, String> collect = results.stream ().collect (Collectors.toMap (R::getNo, R::getName));
參考:https://www.cnblogs.com/IvesHe/p/6108933.html
粉絲福利
猿碼天地-Java知識學堂腦圖 (檔案密碼:請關注公眾號【猿碼天地】,回復關鍵字‘活到老學到老’獲取)
猿碼天地-Java超神之路腦圖 (檔案密碼:請關注公眾號【猿碼天地】,回復關鍵字‘活到老學到老’獲取)
福利一:月薪3萬Java優秀簡歷模板
簡歷是對你過往學習和作業的一個總結,一份好的簡歷容易給人留下深刻印象,更容易被企業發現,創造更多的就業機會,優秀的簡歷可以把你推銷給優秀的企業,看看別人的優秀簡歷范文,讓自己的簡歷更加優秀吧,
可以在微信搜索
「猿碼天地」,關注后回復關鍵字「簡歷」即可獲取!
福利二:全網最全一線大廠Java筆試面試題
面試題涵蓋了Spring核心知識、SpringMVC、SpirngBoot、SpringCloud、JVM、資料庫、常用訊息組件Kafka、RabbitMQ、分布式、微服務組件Eureka、Ribbon、Config、Feign、Nacos、Zookeeper等、SQL優化、常用服務器Tomcat、Nginx、多執行緒、高并發等等,


可以在微信搜索「猿碼天地」,關注后回復關鍵字「BAT面試」即可獲取!
福利三:1000+本Java開發精華電子書
猿人從事Java開發多年,從最初的小白,一步步通過自己不斷的學習、摸索,終于走上了碼農這條沒有回頭的路,學習是無止境的,有時零零散散的學習資料難以將我們的知識成體系的串聯起來,為此,為了讓大家在學習Java的道路上成系統的學習,少走彎路,猿人為大家整理了1000+本Java開發精華電子書,畢竟現在電子書也是挺貴的,哈哈,希望能給大家帶來幫助,
電子書涵蓋:Java入門、并發編程、底層、常用框架、性能優化、設計模式、工具、計算機網路、作業系統、資料庫、資料結構與演算法、大資料、架構設計、Linux知識、面試、擴展、管理、容器化技術、云計算、微服務、領域設計等方方面面,猿人還會給持續更新,




獲取方式
第一種:微信搜索「猿碼天地」或者掃描下面的二維碼,關注后回復關鍵字「電子書」即可獲取!

第二種:Gitee:https://gitee.com/zhangbw666/java-books
希望程式員朋友能認真學習,根據自身需要獲取對應的電子書,學習是永無止境的,
你多學一樣本事,就少說一句求人的話,現在的努力,是為了以后的不求別人,實力是最強的底氣,記住,活著不是靠淚水博得同情,而是靠汗水贏得掌聲,
——《寫給程式員朋友》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/279974.html
標籤:java
