【從零開始學Java筆記】Set類和Map類

来源:https://www.cnblogs.com/zllk/archive/2020/04/07/12656888.html
-Advertisement-
Play Games

大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" Set類 Set集合的特點: 無序(存儲和讀取的順序有可 ...


大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。

【從零開始學Java筆記】目錄

Set類

Set集合的特點:
無序(存儲和讀取的順序有可能不一樣)
不允許重覆(要求元素唯一)
沒有索引

例子:使用HashSet存儲自定義對象並遍歷

import java.util.HashSet;

public class HashSetDemo2 {
	public static void main(String[] args) {
		Student s1 = new Student("大喬", "18");
		Student s2 = new Student("小喬", "17");
		Student s3 = new Student("小喬", "17");
		
		HashSet<Student> hs = new HashSet<Student>();
		hs.add(s1);
		hs.add(s2);
		hs.add(s3);
		
		for (Student student : hs) {
			System.out.println(student);
		}
		
		
	}
}
輸出結果
Student [name=小喬, age=17]
Student [name=大喬, age=18]
Student [name=小喬, age=17]

為什麼HashSet不可重覆,但是s2和s3一樣,卻都存進去了?
通過查看add()方法源碼發現:
HashSet的add()方法,首先會使用當前集合中的每一個元素和新加的元素進行hash值比較,如果hash值不一樣, 則直接添加新的元素,如果hash值-樣,比較地址值或者使用equals方法進行比較
比較結果-樣,則認為是重夏不添加。set中所有元素的比較結果都不一樣則添加。

但這並不是我們想要的,我們就像讓他既有hashset的特性,不可重覆,怎麼辦?
重新equal和hashcode
右鍵->resource-> generate hashcode and equal

生成如下代碼

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

再次運行主函數,結果如下

Student [name=大喬, age=18]
Student [name=小喬, age=17]

Collections類

Collection和Collections有什麼區別?
Collection是集合體系的最頂層,包含了集合體系的共性
Collections是一個工具類, 方法都是用於操作Collection

常用方法

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class CollectionsDemo {
	public static void main(String[] args) {
		
	
	}

	private static void mothed7() {
		//static void swap(List list, int i, int j) :將指定列表中的兩個索引進行位置互換
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(4);
		Collections.swap(list, 0, 1);
		
		System.out.println(list);
	}

	private static void method6() {
		//static void  sort(List<T> list) :按照列表中元素的自然順序進行排序
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(4);
		list.add(3);
		list.add(2);
		
		Collections.sort(list);
		System.out.println(list);
	}

	private static void method5() {
		//static void shuffle(List list):隨機置換  
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		Collections.shuffle(list);
		System.out.println(list);
	}

	private static void method4() {
		//static void reverse(List list)  :反轉
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		
		Collections.reverse(list);
		System.out.println(list);
	}

	private static void method3() {
		//static void fill(List list, Object obj) :使用指定的對象填充指定列表的所有元素
		List<String> list = new ArrayList<String>();
		list.add("hello");
		list.add("world");
		list.add("java");
		System.out.println(list);
		
		Collections.fill(list, "android");
		
		System.out.println(list);
	}

	private static void method2() {
		//static void copy(List dest, List src) :是把源列表中的數據覆蓋到目標列表
		//註意:目標列表的長度至少等於源列表的長度
		//創建源列表
		List<String> src = new ArrayList<String>();
		src.add("hello");
		src.add("world");
		src.add("java");
		
		//創建目標列表
		List<String> dest = new ArrayList<String>();
		dest.add("java");
		dest.add("java");
		dest.add("java");
		dest.add("java");
		Collections.copy(dest, src);
		System.out.println(dest);
	}

	private static void method() {
		//static int  binarySearch(List list, Object key) 使用二分查找法查找指定元素在指定列表的索引位置 
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		
		int index = Collections.binarySearch(list, 4);
		System.out.println(index);
	}
}

鬥地主發牌系統

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Landlords {
	public static void main(String[] args) {
		//生成一副撲克牌
		ArrayList<String> c = new ArrayList<String>();
		
		String[] arr = {"黑桃","紅桃","方片","草花"};
		String[] arr2 = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
		
				
		
		for (int i = 0; i <4; i++) {
			
			for (int k = 0; k < 13.; k++) {
				c.add(arr[i]+arr2[k]);
							}
			
				}
		c.add("大王");
		c.add("小王");
		
//		System.out.println(c);
//		System.out.println(c.size());
		//打亂
		Collections.shuffle(c);
//		System.out.println(c); 
		
		//分成三組
		List<String> c1 = new ArrayList<String>();
		List<String> c2 = new ArrayList<String>();
		List<String> c3 = new ArrayList<String>();
		c1 = c.subList(0, 17);
		c2 = c.subList(17, 34);
		c3 = c.subList(34, 51);
				
		//排序
		Collections.sort(c1);
		Collections.sort(c2);
		Collections.sort(c3);
		//輸出
		System.out.println("玩家1:"+c1);
		System.out.println("玩家2:"+c2);
		System.out.println("玩家3:"+c3);
		
		//底牌
		List<String> c4 = new ArrayList<String>();
		c4 = c.subList(51, 54);
		System.out.println("底牌"+c4);
	}

}

Map類

需求:實現學號和姓名這樣有對應關係的數據存儲(一對一:一個學號對應一個姓名)
為了體現這種有對應關係的數據,我們使用以前所學的內容是可以實現的,但是略有不變,所以java又給我買提供了一種專門用於存儲對應關係的集合——Map
Map:將鍵映射到值的對象。一個映射不能包含重覆的鍵;每個鍵最多只能映射到一個值

Map和Collection有什麼區別?
Map:是一個雙列集合,常用語處理有對應關係的數據,key是不可以重覆的,我們也稱之為是夫妻對集合
Collection:是單列集合,Collection有不同的子體系,有的允許重覆有索引有序,有的不允許重覆而且無序,那麼我們也稱之為單身漢集合

Map的方法

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/*
 * 	Map的常用功能:
 * 		映射功能:
 * 			 	V put(K key, V value) 
 * 		獲取功能:
 * 				V get(Object key) 
 * 				int size() 
 * 		判斷功能:
 * 				boolean containsKey(Object key) 
 				boolean containsValue(Object value) 
 				boolean isEmpty() 
 
 * 		刪除功能:
 * 				void clear()  
 * 				V remove(Object key)  
 * 
 * 		遍歷功能:
 * 				Set<Map.Entry<K,V>> entrySet() 
 * 
 * 
 * 			Set<K> keySet()  
 * 			Collection<V> values()  
 
 */
public class MapDemo2 {
	public static void main(String[] args) {
		// 創建Map對象
		Map<String, String> map = new HashMap<String, String>();
		map.put("001", "張三");
		map.put("002", "李四");
		

		// V put(K key, V value) :就是將key映射到value,如果key存在,則覆蓋value,並將原來的value返回
//		System.out.println(map.put("001", "張三"));
//		System.out.println(map.put("002", "李四"));
//		System.out.println(map.put("001", "王五"));

		// void clear() : 清空所有的對應關係
//		System.out.println(map);
//		map.clear();
//		System.out.println(map);

		// V remove(Object key) :根據指定的key刪除對應關係,並返回key所對應的值,如果沒有刪除成功則返回null
//		System.out.println(map.remove("005"));
//		System.out.println(map.remove("001"));

		// boolean containsKey(Object key) : 判斷指定key是否存在
//		System.out.println(map.containsKey("003"));
//		System.out.println(map.containsKey("001"));

		// boolean containsValue(Object value):判斷指定的value是否存在
//		System.out.println(map.containsValue("王五"));
//		System.out.println(map.containsValue("張三"));

		// boolean isEmpty() : 判斷是否有對應關係
//		System.out.println(map.isEmpty());
//		map.clear();
//		System.out.println(map.isEmpty());

		// int size() : 返回對應關係的個數
//		System.out.println(map.size());

		// V get(Object key) : 根據指定的key返回對應的value
//		System.out.println(map.get("002"));

		// Set<Map.Entry<K,V>> entrySet():輸出所有的映射關係
//		System.out.println(map.entrySet());
//		System.out.println(map);

//		// Set<K> keySet() : 以Set的形式獲返回所有的key
//		Set<String> keys = map.keySet();
//		for (String key : keys) {
//			System.out.println(key);
//		}
//		System.out.println("-----------");
//
//		// Collection<V> values() :以Collection的形式獲返回所有的values,不能使用List
//		Collection<String> values = map.values();
//		for (String value : values) {
//			System.out.println(value);
//		}

	}
}

Map兩種的遍歷方法

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo3 {
	public static void main(String[] args) {
		Map<String,String> m= new HashMap<String,String>();
		
		m.put("劉備", "孫尚香");
		m.put("諸葛亮", "黃月英");
		m.put("曹丕", "甄姬");
		
//		method(m);
//		method1(m);
	}

	private static void method1(Map<String, String> m) {
		/*
		 * 第二種遍歷
		 * 面向對象的方法
		 * entry是map的一個內部類,他有兩個變數key和value,就可以像類一樣獲取成員變數
		 */
		Set<Map.Entry<String, String>> set = m.entrySet();
		for (Map.Entry<String, String> entry : set) {
			String key = entry.getKey();
			String value = entry.getValue();
			System.out.println("丈夫:"+key+"---媳婦:"+value);
		}
	}

	private static void method(Map<String, String> m) {
		/*
		 * 第一種遍歷
		 * 先獲得丈夫集合
		 * 遍歷丈夫
		 * 讓丈夫去找自己的老婆
		 */
		
		Set<String> s = m.keySet();
		for (String key : s) {
			String value = m.get(key);
			System.out.println("丈夫:"+key+"---媳婦:"+value);
		}
	}

}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 首先要聲明一點,無論什麼語言都沒有高低貴賤之分,語言只是 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 這裡的Java基礎並不是真正的Java基礎,而是一些無法 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" Java語言是一種面向對象的程式設計語言,而面向對象思想 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 封裝概述 面向對象三大特征之一。 面向對象編程語言對客觀 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 什麼是繼承? 繼承就是子類繼承父類的特征和行為,使得子類 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 什麼是多態? 編程其實就是一個將具體世界進行抽象化的過程 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" Java本身為我們提供了很多已經封裝好的API,在開發中 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 集合的體繫結構 由於不同的數據結構(數據的組織,存儲方式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...