Collection集合和Map集合的區別:java
a: Map集合屬於雙列集合 , Collection屬於單列集合 安全
b: Map集合鍵是惟一性的, 而Collection集合中的Set集合能夠保證元素的惟一性數據結構
c: Map集合的數據結構只和鍵有關係 ,和值沒有關係 , 而Collection集合的數據結構和元素有關係app
Map集合是一個接口 , 接口不能直接實例化 , 若是咱們要對其進行實例化,那麼就須要使用子類 , HashMap 和 TreeMapide
Map集合的功能概述:工具
a: 添加元素學習
V put(K key, V value) 添加元素測試
b: 刪除元素ui
void clear() 刪除全部的元素spa
V remove(Object key) 根據鍵刪除元素
c: 獲取元素
V get(Object key) 根據鍵獲取值
Set<K> keySet() 獲取全部的鍵對應的Set集合
int size() 獲取集合的長度
Collection<V> values() 獲取全部的值對應Collection
d: 判斷該功能
boolean containsKey(Object key) 判斷是否包含某一個鍵
boolean containsValue(Object value) 判斷是否包含某一個值
boolean isEmpty() 判斷集合是否爲空
e: 遍歷Map集合
(1) 鍵找值
分析:
a: 獲取全部的鍵對應的Set集合
b: 遍歷這個Set集合, 獲取每個元素 , 而每個元素就是鍵 , 而後根據當前遍歷的鍵獲取對應的值
(2)根據鍵值對象遍歷集合
Set<Map.Entry<K,V>> entrySet(): 獲取的是全部的鍵值對對象對應的set集合
分析:
a: 調用entrySet方法獲取全部的鍵值對對象對應的Set集合
b: 遍歷這個Set集合, 獲取每個元素,而每個元素應該是鍵值對對象 , 而後咱們調用方法 ,從這個鍵值對對象中獲取對應的鍵和值
HashMap的兩種遍歷方式:
* 請編寫程序,存儲自定義對象到HashMap集合中,並採用兩種方式遍歷 */ import java.util.HashMap; import java.util.Map.Entry; import java.util.Set; public class HashMapDemo { public static void main(String[] args) { Student s1 = new Student("李時珍",50); Student s2 = new Student("蒲松齡",39); Student s3 = new Student("曹雪芹",41); //1.建立HashMap對象,鍵爲String類型,值爲Student類型 HashMap<String, Student> hs = new HashMap<String,Student>(); //將自定義對象加入集合 hs.put("本草綱目", s1); hs.put("聊齋志異", s2); hs.put("紅樓夢", s3); //遍歷,根據鍵獲取對象 Set<String> keySet = hs.keySet(); for(String k:keySet){ Student st = hs.get(k); System.out.println(k+"---"+st.getName()+"---"+st.getAge()); } System.out.println("----------------------------------------"); //2.建立HashMap對象,key爲Student類,value爲String類型 HashMap<Student,String> hs2 = new HashMap<Student,String>(); //將自定義對象加入集合 hs2.put(s3, "紅樓夢"); hs2.put(s2, "聊齋志異"); hs2.put(s1, "本草綱目"); //遍歷,使用entrySet方法,將全部鍵值對的對象存入Set集合中,而後根據鍵值對象獲取鍵與值 Set<Entry<Student, String>> entrySet = hs2.entrySet(); for(Entry<Student, String> en : entrySet){ Student st = en.getKey(); System.out.println(st.getName()+"---"+st.getAge()+"---"+en.getValue()); } } } /* * 紅樓夢---曹雪芹---41 聊齋志異---蒲松齡---39 本草綱目---李時珍---50 ---------------------------------------- 李時珍---50---本草綱目 曹雪芹---41---紅樓夢 蒲松齡---39---聊齋志異 */
TreeMap:
TreeMap集合的特色: 底層的數據結構是二叉樹, 能夠對元素進行排序
而排序有兩種方式
第一種是天然排序 public TreeMap()
對元素有要求 , 要求元素必須實現 Comparable 接口
第二種是比較器排序 public TreeMap(Comparator comparator)
咱們到底使用的是天然排序仍是比較器排序主要依賴於構造方法
Map集合的數據結構只和鍵有關係,和值沒有關係
TreeMap的兩種遍歷方式
/* * 請編寫程序,存儲自定義對象到TreeMap集合中,並採用兩種方式遍歷. */ import java.util.Map.Entry; import java.util.Comparator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo { public static void main(String[] args) { //建立自定義對象 Student s1 = new Student("曹雪芹",41); Student s2 = new Student("蒲松齡",39); Student s3 = new Student("李時珍",50); //使用TreeMap類中的比較器進行排序 TreeMap<Student, String> tm = new TreeMap<Student,String>(new Comparator<Student>() { //重寫Comparator的compare方法 @Override public int compare(Student st1, Student st2) { // TODO Auto-generated method stub //比較年齡 int num = st1.getAge()-st2.getAge(); //比較姓名 int num2 = (num==0)?st1.getName().compareTo(st2.getName()):num; return num2; } } ); //將鍵值對添加入TreeSet集合中 tm.put(s3, "本草綱目"); tm.put(s2, "聊齋志異"); tm.put(s1, "紅樓夢"); //1.使用鍵值對對象遍歷TreeMap集合 //將TreeSet鍵值對對象存儲到set集合中 Set<Entry<Student, String>> entrySet = tm.entrySet(); //用鍵值對對象獲取key,value值 for(Entry<Student, String> en :entrySet){ Student key = en.getKey(); String value = en.getValue(); System.out.println(key.getName()+"---"+key.getAge()+"----"+value); } //2.根據獲取到的key去獲取value System.out.println("-----------------------------------------------------------"); Set<Student> st = tm.keySet(); //遍歷 for(Student sNum:st){ System.out.println(sNum.getName()+"---"+sNum.getAge()+"---"+tm.get(sNum)); } } } /* * 結果: 蒲松齡---39----聊齋志異 曹雪芹---41----紅樓夢 李時珍---50----本草綱目 ----------------------------------------------------------- 蒲松齡---39---聊齋志異 曹雪芹---41---紅樓夢 李時珍---50---本草綱目 */
最後再舉幾個使用Map集合的例子
import java.util.HashMap; import java.util.Map.Entry; import java.util.Set; /* * 需求:統計字符串中每一個字符出現的次數 "aababcabcdabcde",獲取字符串中每個字母出現的次數要求結果:a(5)b(4)c(3)d(2)e(1) * * 要點:1.根據HashMap集合的特色去存儲字符的出現次數 * 2.對於HashMap的遍歷方式進行學習與理解 * 3.選用StringBuffer進行拼接,減小內存資源的消耗 * 4.更優的方式是使用StringBuilder進行拼接,由於StringBuffer是線程安全的,拼接速度較慢。StringBuilder是線程不安全的, * 適用於單線程任務,速度更快 */ public class HashMapTest { public static void main(String[] args) { //定義一個字符串 String st = "aababcabcdabcde"; //建立一個HashMap集合 HashMap<Character,Integer> hs = new HashMap<Character,Integer>(); //遍歷字符串,將字符串添加到HashMap集合中去 for(int i = 0;i<st.length();i++){ char charAt = st.charAt(i); //將要查找的字符做為鍵,去HashMap中去查找 Integer num = hs.get(charAt); //若是不存在,將其值num賦值爲1 if(num==null){ hs.put(charAt, 1); } //若是已經存在該鍵,將該鍵的值+1, else{ num++; hs.put(charAt, num); } } //測試HashMap中的結果 //System.out.println(hs); //建立StringBuffer對象,按照要求進行拼接 StringBuffer stb = new StringBuffer(); //遍歷HashMap集合,按照指定格式進行輸出 //將HashMap集合對對象存儲到Set集合中 Set<Entry<Character, Integer>> entrySet = hs.entrySet(); //分別獲取Set集合中的鍵值對對象的key,value值,而後進行拼接 for( Entry<Character, Integer> en:entrySet){ stb.append(en.getKey()).append("(").append(en.getValue()).append(")"); } //輸出 System.out.println(stb.toString()); } } /*結果: * a(5)b(4)c(3)d(2)e(1) */
集合嵌套的使用
import java.util.HashMap; import java.util.Map.Entry; import java.util.Set; /*集合嵌套實例: * HashMap的嵌套 *明: * 李時珍 本草綱目 *清: * 曹雪芹 紅樓夢 * 蒲松齡 聊齋志異 */ public class HashMapNest { public static void main(String[] args) { //建立嵌套HashMap集合對象 HashMap<String,HashMap<String, String>> hm = new HashMap<String,HashMap<String,String>>(); //建立明朝做者,書籍集合對象 HashMap<String, String> hMing = new HashMap<String,String>(); //添加明朝集合中的key,value值 hMing.put("李時珍", "本草綱目"); //建立清朝做者,書籍對象 HashMap<String, String> hQing = new HashMap<String,String>(); hQing.put("蒲松齡", "聊齋志異"); hQing.put("曹雪芹", "紅樓夢"); //將小範圍集合添加進大範圍集合中 hm.put("明", hMing); hm.put("清", hQing); //遍歷集合 //獲取外集合鍵值對對象 Set<Entry<String, HashMap<String, String>>> entrySet = hm.entrySet(); for(Entry<String, HashMap<String, String>> en:entrySet){ //獲取鍵值 String key1 = en.getKey(); System.out.println(key1+":"); //獲取外集合value值(即內集合) HashMap<String,String> hm2 = en.getValue(); //獲取內集合鍵值對對象 Set<Entry<String, String>> entrySet2 = hm2.entrySet(); for(Entry<String, String> en2:entrySet2){ //獲取內集合鍵值 String key2 = en2.getKey(); System.out.println(key2+"---"+en2.getValue()); } } } } /* 清: 蒲松齡---聊齋志異 曹雪芹---紅樓夢 明: 李時珍---本草綱目 */
HashMap和HashSet的區別
HashMap 線程不安全 , 效率高 , 容許存在null值和null鍵
Hashtable 線程安全, 效率低 , 不容許在null值和null鍵
Collections:
集合工具類,該類中提供了不少操做集合的方法
public static <T> void sort(List<T> list): 排序,默認按照天然順序
public static <T> int binarySearch(List<?> list,T key): 二分查找
public static <T> T max(Collection<?> coll): 獲取最大值
public static void reverse(List<?> list): 反轉
public static void shuffle(List<?> list):隨機置換