摘要:使用默認隨機源對指定列表進行置換。將集合排序使用二分搜索法搜索指定列表,以獲得指定對象根據元素的自然順序,返回給定的最大元素。
1_Map集合概述和特點
A:Map接口概述
查看API可以知道:
將鍵映射到值的對象
一個映射不能包含重復的鍵
每個鍵最多只能映射到一個值
B:Map接口和Collection接口的不同
Map是雙列的,Collection是單列的
Map的鍵唯一,Collection的子體系Set的元素是唯一的
Map集合的數據結構只針對鍵有效,跟值無關;Collection集合的數據結構是針對元素有效
HashMap: 鍵是哈希算法
TreeMap: 鍵是二叉樹算法
問: Set集合底層依賴Map,還是Map集合底層依賴Set?
2_Map集合的功能概述
A:Map集合的功能概述
a:添加功能
V put(K key,V value):添加元素。
如果鍵是第一次存儲,就直接存儲元素,返回null
如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值
b:刪除功能
void clear():移除所有的鍵值對元素
V remove(Object key):根據鍵刪除鍵值對元素,并把值返回
c:判斷功能
boolean containsKey(Object key):判斷集合是否包含指定的鍵
boolean containsValue(Object value):判斷集合是否包含指定的值
boolean isEmpty():判斷集合是否為空
d:獲取功能
Set
V get(Object key):根據鍵獲取值
Set
Collection
e:長度功能
int size():返回集合中的鍵值對的個數
import java.util.Collection; import java.util.HashMap; import java.util.Map; public class Demo1_Map { public static void main(String[] args) { // demo1(); // demo2(); Map3_Map集合的遍歷之鍵找值map = new HashMap<>(); Integer i1 = map.put("張三", 23); Integer i2 = map.put("李四", 24); Integer i3 = map.put("王五", 25); Collection c = map.values(); System.out.println(c); System.out.println(map.size()); } private static void demo2() { Map map = new HashMap<>(); map.put("張三", 23); map.put("李四", 24); map.put("王五", 25); // Integer value = map.remove("張三"); //根據鍵刪除鍵值對元素,并把值返回 // System.out.println(value); System.out.println(map.containsKey("張三"));//判斷集合是否包含指定的鍵 System.out.println(map.containsValue(23)); //判斷集合是否包含指定的值 System.out.println(map); } private static void demo1() { Map map = new HashMap<>(); Integer i1 = map.put("張三", 23); Integer i2 = map.put("李四", 24); Integer i3 = map.put("王五", 25); Integer i4 = map.put("張三", 26); //相同的鍵不存儲,值覆蓋 System.out.println(map); System.out.println(i1); } }
A:鍵找值思路:
獲取所有鍵的集合
*Set
遍歷鍵的集合,獲取到每一個鍵
根據鍵找值
*V get(Object key):根據鍵獲取值
B:案例演示
Map集合的遍歷之鍵找值
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Demo2_Iterator { public static void main(String[] args) { Map4_Map集合的第二種迭代,根據鍵值對對象找鍵和值(雙列集合不能直接迭代)map = new HashMap<>(); Integer i1 = map.put("張三", 23); Integer i2 = map.put("李四", 24); Integer i3 = map.put("王五", 25); // Integer i = map.get("張三"); // System.out.println(i);//根據鍵獲取值 //獲取所有的鍵 Set keySet = map.keySet(); //獲取所有鍵的集合 Iterator it = keySet.iterator();//獲取迭代器 while(it.hasNext()) { String key = it.next(); //獲取每一個鍵 Integer value = map.get(key); System.out.println(key + "..." + value); } //使用增強for循環遍歷 for (String key : map.keySet()) { System.out.println(key + "..." + map.get(key)); } } }
A:鍵值對對象找鍵和值思路:(畫圖演示)
獲取所有鍵值對對象的集合
遍歷鍵值對對象的集合,獲取到每一個鍵值對對象
根據鍵值對對象找鍵和值
B:案例演示
Map集合的遍歷之鍵值對對象找鍵和值
Set
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Demo3_Iterator { public static void main(String[] args) { Mapmap = new HashMap<>(); map.put("張三", 23); map.put("李四", 24); map.put("王五", 25); map.put("趙六", 26); //Map.Entry說明Entry是Map的內部接口,將鍵和值封裝成了Entry對象,并存儲在Set集合中 Set > entrySet = map.entrySet(); //獲取每一個對象 Iterator > it = entrySet.iterator(); while(it.hasNext()) { //獲取每一個Entry對象 Map.Entry en = it.next(); //父類引用指向子類對象 //Entry en = it.next(); //直接獲取的是子類對象 String key = en.getKey(); //根據鍵值對對象獲取鍵 Integer value = en.getValue(); //根據鍵值對對象獲取值 System.out.println(key + "..." + value); } //使用增強for循環迭代 for (Map.Entry en : map.entrySet()) { System.out.println(en.getKey() + "..." + en.getValue()); } } }
interface Inter { interface Inter2 { public void show(); } } class Demo implements Inter.Inter2 { @Override public void show() { } }5_HashMap集合鍵是Student值是String的案例
A:案例演示
HashMap集合鍵是Student值是String的案例
import java.util.HashMap; import net.allidea.bean.StudentMap; public class Demo5_HashMap { //鍵是學生對象,代表每一個學生 //值是String,代表學生籍貫 public static void main(String[] args) { HashMaphm = new HashMap<>(); hm.put(new StudentMap("張三", 23), "北京"); hm.put(new StudentMap("張三", 23), "上海"); hm.put(new StudentMap("李四", 24), "武漢"); hm.put(new StudentMap("王五", 25), "天津"); System.out.println(hm); } }
package net.allidea.bean; public class StudentMap { private String name; private int age; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; 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; StudentMap other = (StudentMap) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public StudentMap() { super(); } public StudentMap(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "StudentMap [name=" + name + ", age=" + age + "]"; } }6_LinkedHashMap的概述和使用
A:案例演示
LinkedHashMap的特點
底層是鏈表實現的可以保證怎么存就怎么取
import java.util.LinkedHashMap; public class Demo6_LinkedHashMap { public static void main(String[] args) { LinkedHashMap7_TreeMap集合鍵是Student值是String的案例)lhm = new LinkedHashMap<>(); lhm.put("張三",23); lhm.put("趙六",26); lhm.put("李四",24); lhm.put("王五",25); System.out.println(lhm); } }
A:案例演示
TreeMap集合鍵是Student值是String的案例
import java.util.Comparator; import java.util.TreeMap; import net.allidea.bean.StudentMap; public class Demo7_TreeMap { public static void main(String[] args) { // demo1(); TreeMaptm = new TreeMap<>(new Comparator () { @Override public int compare(StudentMap s1, StudentMap s2) { int num = s1.getName().compareTo(s2.getName()); //按照姓名比較 return num == 0 ? s1.getAge() - s2.getAge() : num; } }); tm.put(new StudentMap("張三", 23), "北京"); tm.put(new StudentMap("趙六", 26), "深圳"); tm.put(new StudentMap("王五", 25), "廣州"); tm.put(new StudentMap("李四", 24), "上海"); System.out.println(tm); } private static void demo1() { TreeMap tm = new TreeMap<>(); tm.put(new StudentMap("張三", 23), "北京"); tm.put(new StudentMap("李四", 24), "上海"); tm.put(new StudentMap("王五", 25), "廣州"); tm.put(new StudentMap("趙六", 26), "深圳"); System.out.println(tm); } }
public class StudentMap implements Comparable8_統計字符串中每個字符出現的次數{ private String name; private int age; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; 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; StudentMap other = (StudentMap) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public StudentMap() { super(); } public StudentMap(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "StudentMap [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(StudentMap o) { int num = this.age - o.age; //以年齡為主要條件 return num == 0 ? this.name.compareTo(o.name) : num; } }
A:案例演示
需求:統計字符串中每個字符出現的次數
import java.util.HashMap; public class Demo8_test1 { public static void main(String[] args) { //1.定義一個字符串 String s = "aaaaabbbbbcccccc"; //2.將字符串轉換為字符數組 char[] arr = s.toCharArray(); //3.定義雙列集合,存儲字符串中字符以及字符出現的次數 HashMap9_集合嵌套之HashMap嵌套HashMaphm = new HashMap<>(); //4.遍歷字符數組獲取每一個字符,并將字符存儲在雙列集合中 for (char c : arr) { //5.做判斷,如果集合不包括這個鍵,就將該字符當做鍵,值為1存儲,如果集合中包含這個鍵,就將值加1存儲 /*if(hm.containsKey(c)) { //如果不包含這個鍵 hm.put(c, 1); }else { hm.put(c, hm.get(c) + 1); }*/ hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1); } //6.打印雙列結合獲取字符出現的次數 for (Character key : hm.keySet()) { //hm.keySet()代表所有鍵的集合 System.out.println(key + "=" + hm.get(key));//hm.get(ket)根據鍵獲取值 } } }
A:案例演示
集合嵌套之HashMap嵌套HashMap
需求: javaSE有A班和B班,定義成雙列集合,鍵是學生對象,值是學生的歸屬地,為了便于管理,把a和b期都歸屬JavaSE這個大的集合中.
import java.util.HashMap; import net.allidea.bean.StudentMap; public class Demo9_HashMapHashMap { public static void main(String[] args) { HashMap10_HashMap和Hashtable的區別)hmA = new HashMap<>(); hmA.put(new StudentMap("張三", 23), "北京"); hmA.put(new StudentMap("李四", 24), "北京"); hmA.put(new StudentMap("王五", 25), "上海"); hmA.put(new StudentMap("趙六", 26), "杭州"); HashMap hmB = new HashMap<>(); hmB.put(new StudentMap("唐三", 32), "北京"); hmB.put(new StudentMap("悟空", 15), "北京"); hmB.put(new StudentMap("悟能", 10), "上海"); hmB.put(new StudentMap("悟凈", 20), "杭州"); HashMap , String> hm = new HashMap<>(); hm.put(hmA, "班級A"); hm.put(hmB, "班級B"); //遍歷雙列結合 for (HashMap h : hm.keySet()) { //hm.keySet()代表的是雙列集合中鍵的集合 String value = hm.get(h); //get(h)根據鍵對象獲取值對象 //遍歷鍵的雙列集合對象 for (StudentMap key : h.keySet()) { //h.keySet()獲取集合中所有的學生鍵對象 String value2 = h.get(key); System.out.println(key + "..." + value2 + "..." + value); } } } }
A:共同點:
底層都是哈希算法,都是雙列集合
B:區別
1.Hashtable是JDK1.0版本出現的,是線程安全的,效率低; HashMap是JDK1.2版本出現的,是線程不安全的,效率高
2.Hashtable不可以存儲null鍵和null值; HashMap可以存儲null鍵和null值(目的是為了讓后續代碼可以繼續執行)
C:案例演示
HashMap和Hashtable的區別
public static void main(String[] args) { HashMap11_Collections工具類的概述和常見方法講解hm = new HashMap<>(); hm.put(null, 23); hm.put("李四", null); System.out.println(hm); Hashtable ht = new Hashtable<>(); ht.put(null, 23); ht.put("李四", null); System.out.println(ht); }
A:Collections類概述
針對集合操作 的工具類
B:Collections成員方法
public static
public static
public static
public static void reverse(List> list) 反轉指定列表中元素的順序。
public static void shuffle(List> list) 使用默認隨機源對指定列表進行置換。
import java.util.ArrayList; import java.util.Collections; public class Demo1_Collections { public static void main(String[] args) { ArrayList12_模擬斗地主洗牌和發牌list = new ArrayList<>(); list.add("a"); list.add("c"); list.add("d"); list.add("e"); Collections.sort(list); //將集合排序 System.out.println(Collections.binarySearch(list, "e"));//使用二分搜索法搜索指定列表,以獲得指定對象 System.out.println(Collections.max(list)); //根據元素的自然順序,返回給定 collection 的最大元素。 Collections.reverse(list); //反轉集合 Collections.shuffle(list); //隨機置換,洗牌 System.out.println(list); } }
A:案例演示
模擬斗地主洗牌和發牌,牌沒有排序
import java.util.ArrayList; import java.util.Collections; public class Demo2_test { public static void main(String[] args) { //1.定義一副撲克牌 String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; String[] color = {"紅桃","黑桃","方片","梅花"}; ArrayList14_模擬斗地主洗牌和發牌并對牌進行排序的代碼實現poker = new ArrayList<>(); //拼接花色和數字 for(String s1 : color) { for(String s2 : num) { poker.add(s1.concat(s2)); //concat鏈接兩個字符串 } } poker.add("小王"); poker.add("大王"); //2.洗牌 Collections.shuffle(poker); //3.發牌 ArrayList dushen = new ArrayList<>(); ArrayList dusheng = new ArrayList<>(); ArrayList duxia = new ArrayList<>(); ArrayList dipai = new ArrayList<>(); for (int i = 0; i < poker.size(); i++) { if(i >= poker.size() - 3) { dipai.add(poker.get(i)); //將三張底牌存儲在底牌集合中 } else if(i % 3 == 0) { dushen.add(poker.get(i)); } else if(i % 3 == 1) { dusheng.add(poker.get(i)); } else{ duxia.add(poker.get(i)); } } //4.看牌 System.out.println(dushen); System.out.println(dusheng); System.out.println(duxia); System.out.println(dipai); } }
A:畫圖演示
畫圖說明排序原理
B:案例演示
模擬斗地主洗牌和發牌并對牌進行排序的代碼實現
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; public class Demo3_test { public static void main(String[] args) { //1.定義一副撲克牌 String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; String[] color = {"紅桃","黑桃","方片","梅花"}; HashMap15_集合框架(泛型固定下邊界)hm = new HashMap<>(); //存儲索引和撲克牌 ArrayList list = new ArrayList<>(); //存儲索引 int index = 0; //拼接撲克牌并將索引和撲克牌存儲在hm中 for (String s1 : num) { //獲取數字 for(String s2 : color) { //獲取顏色 hm.put(index, s2.concat(s1)); list.add(index); //將索引0-51添加到list集合中 index++; } } //將小王添加到雙列集合中 hm.put(index, "小王"); list.add(index); //將索引52添加到list集合中 index++; hm.put(index, "大王"); list.add(index); //將索引53添加到list集合中 //洗牌 Collections.shuffle(list); //發牌 TreeSet dushen = new TreeSet<>(); TreeSet dusheng = new TreeSet<>(); TreeSet duxia = new TreeSet<>(); TreeSet dipai = new TreeSet<>(); for(int i = 0; i < list.size(); i++) { if(i >= list.size() - 3) { dipai.add(list.get(i)); //將三張底牌存儲在底牌集合中 }else if(i % 3 == 0) { dushen.add(list.get(i)); }else if(i % 3 == 1) { dusheng.add(list.get(i)); }else{ duxia.add(list.get(i)); } } //看牌 lookPoker(hm, dushen, "賭神"); lookPoker(hm, dusheng, "賭圣"); lookPoker(hm, duxia, "賭俠"); lookPoker(hm, dipai, "底牌"); } //返回值類型void,參數列表HashMap、TreeSet、String name public static void lookPoker(HashMap hm,TreeSet ts , String name) { System.out.print(name + "的牌是:"); for(Integer i : ts) { //i代表雙列集合中的每一個鍵 System.out.print(hm.get(i) + " "); } System.out.println(); } }
? super E
public class Demo4_Genric { public static void main(String[] args) { TreeSet16_集合總結ts1 = new TreeSet<>(new CompareByAge()); ts1.add(new StudentMap("張三", 23)); ts1.add(new StudentMap("李四", 14)); ts1.add(new StudentMap("王五", 23)); ts1.add(new StudentMap("趙六", 33)); TreeSet ts2 = new TreeSet<>(new CompareByAge()); ts2.add(new Student("張三", 23)); ts2.add(new Student("李四", 14)); ts2.add(new Student("王五", 23)); ts2.add(new Student("趙六", 33)); System.out.println(ts2); } } class CompareByAge implements Comparator { @Override public int compare(StudentMap s1, StudentMap s2) { int num = s1.getAge() - s2.getAge(); return num == 0 ? s1.getName().compareTo(s2.getName()) : num; } }
Collection
List(存取有序,有索引,可以重復)
ArrayList
底層是數組實現的,線程不安全,查找和修改快,增和刪比較慢
LinkedList
底層是鏈表實現的,線程不安全,增和刪比較快,查找和修改比較慢
Vector
底層是數組實現的,線程安全的,無論增刪改查都慢
如果查找和修改多,用ArrayList
如果增和刪多,用LinkedList
如果都多,用ArrayList
Set(存取無序,無索引,不可以重復)
HashSet
底層是哈希算法實現
LinkedHashSet
底層是鏈表實現,但是也是可以保證元素唯一,和HashSet原理一樣
TreeSet
底層是二叉樹算法實現
一般在開發的時候不需要對存儲的元素排序,所以在開發的時候大多用HashSet,HashSet的效率比較高
TreeSet在面試的時候比較多,問你有幾種排序方式,和幾種排序方式的區別
Map
HashMap
底層是哈希算法,針對鍵
LinkedHashMap
底層是鏈表,針對鍵
TreeMap
底層是二叉樹算法,針對鍵
開發中用HashMap比較多
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77228.html
摘要:中的集合稱為單列集合,中的集合稱為雙列集合。洗牌通過數字完成洗牌發牌發牌將每個人以及底牌設計為將最后張牌直接存放于底牌,剩余牌通過對取模依次發牌。存放的過程中要求數字大小與斗地主規則的大小對應。 01Map集合概述 A:Map集合概述: 我們通過查看Map接口描述,發現Map接口下的集合與Collection接口下的集合,它們存儲數據的形式不同 ? a:Collection中的集...
摘要:第三階段常見對象的學習集合框架集合在實際需求中,我們常常會遇到這樣的問題,在諸多的數據中,通過其編號來尋找某一些信息,從而進行查看或者修改,例如通過學號查詢學生信息。面試題和的區別是單列集合的頂層接口,有子接口和。 第三階段 JAVA常見對象的學習 集合框架——Map集合 showImg(https://segmentfault.com/img/remote/1460000019683...
摘要:不用自己來創建,而是通過池來獲取對象使用完后,調用的方法也不會真的關閉,而是把歸還給池連接池技術可以完成對象的再次利用接口為數據庫連接池提供了公共的接口各個廠商需要讓自己的連接池實現這個接口。 1.DButils工具類的介紹個三個核心類 A: 概述 DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用。 DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少...
閱讀 3736·2023-04-25 18:41
閱讀 1169·2021-11-11 16:55
閱讀 1823·2021-09-22 15:54
閱讀 3069·2021-09-22 15:51
閱讀 3545·2019-08-30 15:55
閱讀 1937·2019-08-30 14:19
閱讀 1277·2019-08-29 10:57
閱讀 1699·2019-08-29 10:56