JAVA進階學習09

文章目錄

  • 一、雙列集合Map
    • 1.1 雙列集合介紹
    • 1.2 雙列集合Map常見API
    • 1.3 Map集合遍歷方式
      • 1.3.1 通過集合的全部鍵來遍歷集合
      • 1.3.2 Map集合遍歷方式2
      • 1.3.3 Map集合遍歷方式3
  • 二、Map集合的實現類
    • 2.1 HashMap類
    • 2.2 LinkedHashMap
    • 2.3 TreeMap
  • 三、可變參數
  • 四、Collections類
  • 五、集合的嵌套

一、雙列集合Map

1.1 雙列集合介紹

所謂雙列集合,就是說集合中的元素是一對一對的。Map集合中的每一個元素是以key=value的形式存在的,一個key=value就稱之為一個鍵值對,而且在Java中有一個類叫Entry類,Entry的對象用來表示鍵值對對象。

  • 鍵不能重復,值可以重復,每一個鍵只能找到自己對應的值。

1.2 雙列集合Map常見API

請添加圖片描述

public class MapTest2 {public static void main(String[] args) {// 1.添加元素: 無序,不重復,無索引。//Map是一個接口,無法創建對象,只能創建其實現類的對象HashMapMap<String, Integer> map = new HashMap<>();map.put("手表", 100);map.put("手表", 220);map.put("手機", 2);map.put("Java", 2);map.put(null, null);System.out.println(map);// map = {null=null, 手表=220, Java=2, 手機=2}// 2.public int size():獲取集合的大小System.out.println(map.size());// 3、public void clear():清空集合//map.clear();//System.out.println(map);// 4.public boolean isEmpty(): 判斷集合是否為空,為空返回true ,反之!System.out.println(map.isEmpty());// 5.public V get(Object key):根據鍵獲取對應值int v1 = map.get("手表");System.out.println(v1);System.out.println(map.get("手機")); // 2System.out.println(map.get("張三")); // null// 6. public V remove(Object key):根據鍵刪除整個元素(刪除鍵會返回鍵的值)System.out.println(map.remove("手表"));System.out.println(map);// 7.public  boolean containsKey(Object key): 判斷是否包含某個鍵 ,包含返回true ,反之System.out.println(map.containsKey("手表")); // falseSystem.out.println(map.containsKey("手機")); // trueSystem.out.println(map.containsKey("java")); // falseSystem.out.println(map.containsKey("Java")); // true// 8.public boolean containsValue(Object value): 判斷是否包含某個值。System.out.println(map.containsValue(2)); // trueSystem.out.println(map.containsValue("2")); // false// 9.public Set<K> keySet(): 獲取Map集合的全部鍵。Set<String> keys = map.keySet();System.out.println(keys);// 10.public Collection<V> values(); 獲取Map集合的全部值。Collection<Integer> values = map.values();System.out.println(values);// 11.把其他Map集合的數據倒入到自己集合中來。(拓展)Map<String, Integer> map1 = new HashMap<>();map1.put("java1",  10);map1.put("java2",  20);Map<String, Integer> map2 = new HashMap<>();map2.put("java3",  10);map2.put("java2",  222);map1.putAll(map2); // putAll:把map2集合中的元素全部倒入一份到map1集合中去。System.out.println(map1);System.out.println(map2);}
}

1.3 Map集合遍歷方式

1.3.1 通過集合的全部鍵來遍歷集合

通過鍵找值的方法遍歷集合,由于鍵值的唯一性

public class MapTest1 {public static void main(String[] args) {// 準備一個Map集合。Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 162.5);map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊寶", 169.5);map.put("牛魔王", 183.6);System.out.println(map);// map = {蜘蛛精=169.8, 牛魔王=183.6, 至尊寶=169.5, 紫霞=165.8}// 1、獲取Map集合的全部鍵Set<String> keys = map.keySet();// System.out.println(keys);// [蜘蛛精, 牛魔王, 至尊寶, 紫霞]//         key// 2、增強for遍歷全部的鍵,根據鍵獲取其對應的值for (String key : keys) {// 根據鍵獲取對應的值double value = map.get(key);System.out.println(key + "=====>" + value);}}
}

1.3.2 Map集合遍歷方式2

通過鍵值對的方法遍歷集合

直接獲取每一個Entry對象,把Entry存儲到 Set集合中去,再通過Entry對象獲取鍵和值。

public class MapTest2 {public static void main(String[] args) {Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊寶", 169.5);map.put("牛魔王", 183.6);System.out.println(map);// map = {蜘蛛精=169.8, 牛魔王=183.6, 至尊寶=169.5, 紫霞=165.8}// entries = [(蜘蛛精=169.8), (牛魔王=183.6), (至尊寶=169.5), (紫霞=165.8)]// entry = (蜘蛛精=169.8)// entry = (牛魔王=183.6)// ...// 1、調用Map集合提供entrySet方法,把Map集合轉換成鍵值對類型的Set集合//entry是Map類中的內部接口Set<Map.Entry<String, Double>> entries = map.entrySet();for (Map.Entry<String, Double> entry : entries) {String key = entry.getKey();double value = entry.getValue();System.out.println(key + "---->" + value);}}
}

1.3.3 Map集合遍歷方式3

用forEach方法

/*** 目標:掌握Map集合的第二種遍歷方式:鍵值對。*/
public class MapTest3 {public static void main(String[] args) {Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊寶", 169.5);map.put("牛魔王", 183.6);System.out.println(map);// map = {蜘蛛精=169.8, 牛魔王=183.6, 至尊寶=169.5, 紫霞=165.8}//遍歷map集合,傳遞匿名內部類map.forEach(new BiConsumer<String, Double>() {@Overridepublic void accept(String k, Double v) {System.out.println(k + "---->" + v);}});//遍歷map集合,傳遞Lambda表達式map.forEach(( k,  v) -> {System.out.println(k + "---->" + v);});}
}

二、Map集合的實現類

2.1 HashMap類

HashMap底層原理和HashSet是一樣的。我們往HashSet集合中添加元素時,實際上是把元素作為添加添加到了HashMap集合中。故兩個類的常用方法都一樣

下面是Map集合的體系結構,HashMap集合的特點是由鍵決定的: 它的是無序、不能重復,而且沒有索引的。再各種Map集合中也是用得最多的一種集合。
請添加圖片描述
Hash和HashMap在本質上是一樣的,底層原理都依賴于哈希表來實現

2.2 LinkedHashMap

與單列結合的哈希表一樣,底層是基于雙鏈表實現的

請添加圖片描述

public class Test2LinkedHashMap {public static void main(String[] args) {// Map<String, Integer> map = new HashMap<>();    //  按照鍵 無序,不重復,無索引。LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); //  按照鍵 有序,不重復,無索引。map.put("手表", 100);map.put("手表", 220);map.put("手機", 2);map.put("Java", 2);map.put(null, null);System.out.println(map);}
}

運行結果:

請添加圖片描述
可見:

  • 鍵值相同時,值會被覆蓋
  • 存入與取出的次序一致

2.3 TreeMap

TreeMap集合的特點也是由鍵決定的,默認按照鍵的升序排列,鍵不重復,也是無索引的。
TreeMap集合的底層原理和TreeSet也是一樣的,底層都是紅黑樹實現的。所以可以對鍵進行排序。

TreeMap類在排序是和TreeSet一樣也有兩種方法

排序方式1:寫一個Student類,讓Student類實現Comparable接口

//第一步:先讓Student類,實現Comparable接口
public class Student implements Comparable<Student>{private String name;private int age;private double height;//無參數構造方法public Student(){}//全參數構造方法public Student(String name, int age, double height){this.name=name;this.age=age;this.height=height;}//...get、set、toString()省略//按照年齡進行比較,只需要在方法中讓this.age和o.age相減就可以。/*原理:在往TreeSet集合中添加元素時,add方法底層會調用compareTo方法,根據該方法的結果是正數、負數、還是零,決定元素放在后面、前面還是不存。*/@Overridepublic int compareTo(Student o) {//this:表示將要添加進去的Student對象//o: 表示集合中已有的Student對象return this.age-o.age;}
}

排序方式2:在創建TreeMap集合時,直接傳遞Comparator比較器對象。

public class Test3TreeMap {public static void main(String[] args) {Map<Student, String> map = new TreeMap<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return Double.compare(o1.getHeight(), o2.getHeight());}});
//        Map<Student, String> map = new TreeMap<>(( o1,  o2) ->   Double.compare(o2.getHeight(), o1.getHeight()));map.put(new Student("蜘蛛精", 25, 168.5), "盤絲洞");map.put(new Student("蜘蛛精", 25, 168.5), "水簾洞");map.put(new Student("至尊寶", 23, 163.5), "水簾洞");map.put(new Student("牛魔王", 28, 183.5), "牛頭山");System.out.println(map);}
}

三、可變參數

當函數接收的數據數量不確定時,可以用到可變參數

public class Test {public static void main(String[] args) {System.out.println(getSum(1,2,3,4,5));}//普通參數放在可變參數之前,且方法中最多只接收一個可變參數public static int getSum(double agg,int... args){int sum=0;for (int i : args) {sum += i;}return sum;}
}

注意

  1. 方法的形參最多接收一個可變參數
  2. 可變參數的本質時數組
  3. 普通參數應該放在可變參數之前

四、Collections類

該類是一個集合的工具類

public class CollectionsDemo {public static void main(String[] args) {//該類的兩個常用方法ArrayList<String> arr=new ArrayList<>();//1.集合的批量添加Collections.addAll(arr,"1","2","3","4");System.out.println(arr);//2.集合的打亂Collections.shuffle(arr);}
}

五、集合的嵌套

當有如下的需求時,一個鍵對應著多個值:
請添加圖片描述

而又因為一個省份有多個城市,同一個省份的多個城市可以再用一個List集合來存儲。
所以Map集合的鍵是String類型,而指是List集合類型
HashMap<String, List> map = new HashMap<>();

/*** 江蘇省 = "南京市","揚州市","蘇州市“,"無錫市","常州市"* 湖北省 = "武漢市","孝感市","十堰市","宜昌市","鄂州市"* 河北省 = "石家莊市","唐山市", "邢臺市", "保定市", "張家口市"*/
public class Test {public static void main(String[] args) {// 1、定義一個Map集合存儲全部的省份信息,和其對應的城市信息。Map<String, List<String>> map = new HashMap<>();List<String> cities1 = new ArrayList<>();Collections.addAll(cities1, "南京市","揚州市","蘇州市" ,"無錫市","常州市");map.put("江蘇省", cities1);List<String> cities2 = new ArrayList<>();Collections.addAll(cities2, "武漢市","孝感市","十堰市","宜昌市","鄂州市");map.put("湖北省", cities2);List<String> cities3 = new ArrayList<>();Collections.addAll(cities3, "石家莊市","唐山市", "邢臺市", "保定市", "張家口市");map.put("河北省", cities3);System.out.println(map);List<String> cities = map.get("湖北省");for (String city : cities) {System.out.println(city);}map.forEach((p, c) -> {System.out.println(p + "----->" + c);});}
}

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

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

相關文章

Vue 2.0 與 3.0區別

Vue.js是一種流行的前端JavaScript框架&#xff0c;用于構建用戶界面和單頁面應用程序。隨著時間的推移&#xff0c;Vue.js已經從Vue2發展到了Vue3&#xff0c;這兩個版本在**生命周期、模板組件以及性能**等方面有顯著差異。具體分析如下&#xff1a; 1. **生命周期** - **Vue…

恭喜朱雀橋的越南薇妮她牌NFC山竹汁飲料,成為霸王茶姬奶茶主材

朱雀橋NFC山竹汁飲料&#xff1a;榮登霸王茶姬奶茶主材&#xff0c;非遺傳承的天然之選 近日&#xff0c;據小編了解到&#xff1a;霸王茶姬欣喜地宣布&#xff0c;成功與朱雀橋達成合作越南薇妮她VINUT牌NFC山竹汁飲料。這款商超產品憑借其卓越的品質與獨特的口感&#xff0c…

PostgreSQL安裝教程及文件介紹

Ubuntu 安裝和配置 PostgreSQL 以 Ubuntu Server 20.04&#xff0c;PostgreSQL 12 版本為例。 1. 安裝 使用如下命令&#xff0c;安裝指定版本的 PostgreSQL sudo apt install postgresql-12在 Ubuntu 20.04 中安裝 PostgreSQL 登錄您的 Ubuntu 系統并使用以下 apt 命令更新…

Java web應用性能分析之【prometheus監控指標體系】

Java web應用性能分析之【系統監控工具prometheus】_javaweb服務器性能監控工具-CSDN博客 Java web應用性能分析之【prometheusGrafana監控springboot服務和服務器監控】_grafana 導入 prometheus-CSDN博客 因為篇幅原因&#xff0c;前面沒有詳細說明Prometheus的監控指標&…

將手機上的已安裝應用拷貝出到電腦中

方法一&#xff1a;通過應用管理器 下載并安裝應用管理器&#xff1a;可以使用應用管理器如“ES文件瀏覽器”或“APK Extractor”。 提取APK文件&#xff1a; 打開應用管理器。 找到已安裝的應用程序列表。 選擇你想要提取的應用程序&#xff0c;然后選擇“提取”或“備份”選…

數據結構 —— 哈夫曼樹

數據結構 —— 哈夫曼樹 哈夫曼樹定義構造算法特性應用 哈夫曼編碼核心概念工作原理特點 我們今天來看哈夫曼樹&#xff1a; 哈夫曼樹 哈夫曼樹&#xff08;Huffman Tree&#xff09;&#xff0c;是一種特殊的二叉樹&#xff0c;由D.A. Huffman在1952年提出&#xff0c;主要用…

[面試題]計算機網絡

[面試題]Java【基礎】[面試題]Java【虛擬機】[面試題]Java【并發】[面試題]Java【集合】[面試題]MySQL[面試題]Maven[面試題]Spring Boot[面試題]Spring Cloud[面試題]Spring MVC[面試題]Spring[面試題]MyBatis[面試題]Nginx[面試題]緩存[面試題]Redis[面試題]消息隊列[面試題]…

ES報錯:解決too_many_clauses: maxClauseCount is set to 1024 報錯問題

解決too_many_clauses: maxClauseCount is set to 1024 報錯問題 問題場景報錯信息問題分析解決1. 優化查詢2. 增加maxClauseCount3. 改用其他查詢類型修改后的查詢示例 問題場景 查詢語句&#xff1a;查詢clcNo分類號包含分類O的所有文檔 {"match_phrase_prefix":…

社會與網絡的討論#1

“拒絕心靈雞湯” 都說人人平等&#xff0c;那請問一個有錢人看到一個掃大街的&#xff0c;能有幾個保證不產生厭惡感的&#xff1f; 你能確保&#xff0c;你的工資會比有關系的人的工資高嗎&#xff1f; 你進入公司&#xff0c;有有關系的人進入的方便嗎&#xff1f; 在學…

特產零售元宇宙:探索虛擬世界的商業機遇

在數字化時代&#xff0c;元宇宙作為一個全新的虛擬世界&#xff0c;正在逐漸改變我們的生活方式和商業模式。隨著技術的不斷發展&#xff0c;特產零售業也開始嘗試進入這個充滿無限可能的新領域。本文將探討特產零售元宇宙的概念、優勢以及面臨的挑戰&#xff0c;并分析其未來…

WAIC2024 | 華院計算邀您共赴2024年世界人工智能大會,見證未來科技革新

在智能時代的浪潮洶涌澎湃之際&#xff0c;算法已成為推動社會進步的核心力量。作為中國認知智能技術的領軍企業&#xff0c;華院計算在人工智能的廣闊天地中&#xff0c;不斷探索、創新&#xff0c;致力于將算法的潛力發揮到極致。在過去的時日里&#xff0c;華院計算不斷探索…

Java - Execl自定義導入、導出

1.需求&#xff1a;問卷星答 下圖框出區域&#xff0c;為用戶自定義字段問題及答案 2.采用技術EasyExcel 模板所在位置如下 /*** 導出模板** param response*/ Override public void exportTemplate(HttpServletResponse response) throws IOException {ClassPathResource c…

Metricbeat和Prometheus監控比較

Metricbeat和Prometheus是兩種常見的監控工具&#xff0c;它們都有收集和存儲系統和應用程序性能數據的功能&#xff0c;但它們的設計理念、實現方式和適用場景有所不同。以下是它們的相同點和不同點的詳細比較&#xff1a; 相同之處 數據收集&#xff1a; Metricbeat 和 Pro…

vue 使用 face-api.js 實現人臉識別

HTML 代碼如下 <div class="videoBox" id="videoBox"><video ref="videoPlayer" width="800" height="600" autoplay muted playsinline></video><canvas ref="overlay"></canvas>…

配置 Cmder 到鼠標右鍵

win Q 快捷鍵搜索 cmd&#xff0c;以管理員身份運行 在命令行輸入 cmder.exe /REGISTER ALL

OpenCloudOS開源的操作系統

OpenCloudOS 是一款開源的操作系統&#xff0c;致力于提供高性能、穩定和安全的操作系統環境&#xff0c;以滿足現代計算和應用程序的需求。它結合了現代操作系統設計的最新技術和實踐&#xff0c;為開發者和企業提供了一個強大的平臺。本文將詳細介紹 OpenCloudOS 的背景、特性…

品牌進行3D數字化轉型,有哪些優勢?

各行業都在經歷著從增量市場向存量市場的轉變&#xff0c;同時用戶的消費觀念也日趨成熟&#xff0c;更加注重產品的體驗和服務質量。 無論是線上購物平臺還是線下實體門店&#xff0c;提供個性化和增強體驗感的產品與服務已成為未來發展的核心驅動力&#xff0c;品牌轉型也迫…

SyncFolders文件備份—辦公人員必備

SyncFolders支持在兩個或多個文件夾之間同步文件&#xff0c;用戶可以將重要文件同步到多個位置&#xff0c;如備份硬盤、網絡共享文件夾或云存儲等。通過設定同步規則&#xff0c;可以自動備份和同步更新&#xff0c;減少手動操作的繁瑣&#xff0c;確保文件的安全和可訪問性。…

uniapp橫屏移動端卡片縮進輪播圖

uniapp橫屏移動端卡片縮進輪播圖 效果&#xff1a; 代碼&#xff1a; <!-- 簡單封裝輪播圖組件:swiperCard --> <template><swiper class"swiper" circular :indicator-dots"true" :autoplay"true" :interval"10000&quo…

標準庫STL

標準庫STL stringstreamvector自定義類型初始化為一個數 queue stringstream 頭文件sstream。格式化字符流 #include <iostream> #include <sstream> using namespace std; int main(){stringstream ss;// hex 以十六進制保存 oct是8進制ss <<89<<…