00084_Map接口
1、Map接口概述
通過查看Map接口描述,發現Map接口下的集合與Collection接口下的集合,它們存儲數據的形式不同。
(1)Collection中的集合,元素是孤立存在的(理解為單身),向集合中存儲元素采用一個個元素的方式存儲;
(2)Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值;
(3)Collection中的集合稱為單列集合,Map中的集合稱為雙列集合;
(4)需要注意的是,Map中的集合不能包含重復的鍵,值可以重復;每個鍵只能對應一個值;
(5)Map中常用的集合為HashMap集合、LinkedHashMap集合。
2、Map接口中常用集合概述
(1)HashMap<K,V>:存儲數據采用的哈希表結構,元素的存取順序不能保證一致。由于要保證鍵的唯一、不重復,需要重寫鍵的hashCode()方法、equals()方法;
(2)LinkedHashMap<K,V>:HashMap下有個子類LinkedHashMap,存儲數據采用的哈希表結構+鏈表結構。通過鏈表結構可以保證元素的存取順序一致;通過哈希表結構可以保證的鍵的唯一、不重復,需要重寫鍵的hashCode()方法、equals()方法;
(3)Map接口中的集合都有兩個泛型變量<K,V>,在使用時,要為兩個泛型變量賦予數據類型。兩個泛型變量<K,V>的數據類型可以相同,也可以不同。
3、Map接口中的常用方法
(1)put方法:將指定的鍵與值對應起來,并添加到集合中;
方法返回值為鍵所對應的值;
使用put方法時,若指定的鍵(key)在集合中沒有,則沒有這個鍵對應的值,返回null,并把指定的鍵值添加到集合中;
使用put方法時,若指定的鍵(key)在集合中存在,則返回值為集合中鍵對應的值(該值為替換前的值),并把指定鍵所對應的值,替換成指定的新值。
(2)get方法:獲取指定鍵(key)所對應的值(value);
(3)remove方法:根據指定的鍵(key)刪除元素,返回被刪除元素的值(value)。
(4)Map接口的方法演示:
1 public class MapDemo { 2 public static void main(String[] args) { 3 //創建Map對象 4 Map<String, String> map = new HashMap<String,String>(); 5 //給map中添加元素 6 map.put("星期一", "Monday"); 7 map.put("星期日", "Sunday"); 8 System.out.println(map); // {星期日=Sunday, 星期一=Monday} 9 10 //當給Map中添加元素,會返回key對應的原來的value值,若key沒有對應的值,返回null 11 System.out.println(map.put("星期一", "Mon")); // Monday 12 System.out.println(map); // {星期日=Sunday, 星期一=Mon} 13 14 //根據指定的key獲取對應的value 15 String en = map.get("星期日"); 16 System.out.println(en); // Sunday 17 18 //根據key刪除元素,會返回key對應的value值 19 String value = map.remove("星期日"); 20 System.out.println(value); // Sunday 21 System.out.println(map); // {星期一=Mon} 22 } 23 }4、Map集合遍歷鍵找值方式
(1)鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值;
(2)操作步驟:
獲取Map集合中所有的鍵,由于鍵是唯一的,所以返回一個Set集合存儲所有的鍵;
遍歷鍵的Set集合,得到每一個鍵;
根據鍵,獲取鍵所對應的值。
(3)代碼演示:
1 public class MapDemo { 2 public static void main(String[] args) { 3 //創建Map對象 4 Map<String, String> map = new HashMap<String,String>(); 5 //給map中添加元素 6 map.put("鄧超", "孫儷"); 7 map.put("李晨", "范冰冰"); 8 map.put("劉德華", "柳巖"); 9 //獲取Map中的所有key 10 Set<String> keySet = map.keySet(); 11 //遍歷存放所有key的Set集合 12 Iterator<String> it =keySet.iterator(); 13 while(it.hasNext()){ 14 //得到每一個key 15 String key = it.next(); 16 //通過key獲取對應的value 17 String value = map.get(key); 18 System.out.println(key+"="+value); 19 } 20 } 21 }5、Entry鍵值對對象
(1)在Map類設計時,提供了一個嵌套接口:Entry。Entry將鍵值對的對應關系封裝成了對象。即鍵值對對象,這樣我們在遍歷Map集合時,就可以從每一個鍵值對(Entry)對象中獲取對應的鍵與對應的值;
(2)接口 Map<K,V>
Entry是Map接口中提供的一個靜態內部嵌套接口;
entrySet()方法:用于返回Map集合中所有的鍵值對(Entry)對象,以Set集合形式返回。
(3)接口 Map.Entry<Entry>
getKey()方法:獲取Entry對象中的鍵;
etValue()方法:獲取Entry對象中的值。
6、Map集合遍歷鍵值對方式
(1)鍵值對方式:即通過集合中每個鍵值對(Entry)對象,獲取鍵值對(Entry)對象中的鍵與值;
(2)操作步驟:
獲取Map集合中,所有的鍵值對(Entry)對象,以Set集合形式返回;
遍歷包含鍵值對(Entry)對象的Set集合,得到每一個鍵值對(Entry)對象;
通過鍵值對(Entry)對象,獲取Entry對象中的鍵與值。
(3)代碼演示:
1 public class MapDemo { 2 public static void main(String[] args) { 3 //創建Map對象 4 Map<String, String> map = new HashMap<String,String>(); 5 //給map中添加元素 6 map.put("鄧超", "孫儷"); 7 map.put("李晨", "范冰冰"); 8 map.put("劉德華", "柳巖"); 9 //獲取Map中的所有key與value的對應關系 10 Set<Map.Entry<String,String>> entrySet = map.entrySet(); 11 //遍歷Set集合 12 Iterator<Map.Entry<String,String>> it =entrySet.iterator(); 13 while(it.hasNext()){ 14 //得到每一對對應關系 15 Map.Entry<String,String> entry = it.next(); 16 //通過每一對對應關系獲取對應的key 17 String key = entry.getKey(); 18 //通過每一對對應關系獲取對應的value 19 String value = entry.getValue(); 20 System.out.println(key+"="+value); 21 } 22 } 23 }(4)注意:Map集合不能直接使用迭代器或者foreach進行遍歷。但是轉成Set之后就可以使用了。
7、HashMap存儲自定義類型鍵值
(1)練習:每位學生(姓名,年齡)都有自己的家庭住址。那么,既然有對應關系,則將學生對象和家庭住址存儲到map集合中。學生作為鍵, 家庭住址作為值;注意,學生姓名相同并且年齡相同視為同一名學生。
(2)學生類
1 public class Student { 2 private String name; 3 private int age; 4 5 //編寫構造方法,這里省略 6 //編寫get,set方法,這里省略 7 //編寫toString方法,這里省略 8 }(3)測試類
1 public class HashMapTest { 2 public static void main(String[] args) { 3 //1,創建hashmap集合對象。 4 Map<Student,String> map = new HashMap<Student,String>(); 5 6 //2,添加元素。 7 map.put(new Student("lisi",28), "上海"); 8 map.put(new Student("wangwu",22), "北京"); 9 map.put(new Student("zhaoliu",24), "成都"); 10 map.put(new Student("zhouqi",25), "廣州"); 11 map.put(new Student("wangwu",22), "南京"); 12 13 //3,取出元素。鍵找值方式 14 Set<Student> keySet = map.keySet(); 15 for(Student key : keySet){ 16 String value = map.get(key); 17 System.out.println(key.toString()+"....."+value); 18 } 19 20 //取出元素。鍵值對方式 21 Set<Map.Entry<Student, String>> entrySet = map.entrySet(); 22 for (Map.Entry<Student, String> entry : entrySet) { 23 Student key = entry.getKey(); 24 String value = entry.getValue(); 25 System.out.println(key.toString()+"....."+value); 26 } 27 } 28 }(4)當給HashMap中存放自定義對象時,如果自定義對象作為key存在,這時要保證對象唯一,必須復寫對象的hashCode和equals方法;
(5)如果要保證map中存放的key和取出的順序一致,可以使用LinkedHashMap集合來存放。
8、靜態導入
(1)在導包的過程中我們可以直接導入靜態部分,這樣某個類的靜態成員就可以直接使用了。在源碼中經常會出現靜態導入;
(2)靜態導入格式
import static XXX.YYY; 導入后YYY可直接使用。(3)例如:Map.Entry的訪問,簡化后為Entry。
1 import static java.util.Map.Entry; 2 public class HashMapTest { 3 public static void main(String[] args) { 4 //1,創建hashmap集合對象。 5 Map<Student,String> map = new HashMap<Student,String>(); 6 7 //取出元素。鍵值對方式 8 //Set<Map.Entry<Student, String>> entrySet = map.entrySet(); 9 Set<Entry<Student, String>> entrySet = map.entrySet(); 10 11 //for (Map.Entry<Student, String> entry : entrySet) { 12 for (Entry<Student, String> entry : entrySet) { 13 Student key = entry.getKey(); 14 String value = entry.getValue(); 15 System.out.println(key.toString()+"....."+value); 16 } 17 } 18 }9、可變參數
(1)在JDK1.5之后,如果我們定義一個方法需要接受多個參數,并且多個參數類型一致,我們可以對其簡化成如下格式:
修飾符 返回值類型 方法名(參數類型... 形參名){ }(2)jdk1.5以后。出現了簡化操作。... 用在參數上,稱之為可變參數;
(3)同樣是代表數組,但是在調用這個帶有可變參數的方法時,不用創建數組(這就是簡單之處),直接將數組中的元素作為實際參數進行傳遞,其實編譯成的class文件,將這些元素先封裝到一個數組中,在進行傳遞。這些動作都在編譯.class文件時,自動完成了;
(4)代碼演示:
1 public class ParamDemo { 2 public static void main(String[] args) { 3 int[] arr = {21,89,32}; 4 int sum = add(arr); 5 System.out.println(sum); 6 sum = add(21,89,32);//可變參數調用形式 7 System.out.println(sum); 8 9 } 10 11 //JDK1.5之后寫法 12 public static int add(int...arr){ 13 int sum = 0; 14 for (int i = 0; i < arr.length; i++) { 15 sum += arr[i]; 16 } 17 return sum; 18 } 19 20 //原始寫法 21 /* 22 public static int add(int[] arr) { 23 int sum = 0; 24 for (int i = 0; i < arr.length; i++) { 25 sum += arr[i]; 26 } 27 return sum; 28 } 29 */ 30 }(5)上述add方法在同一個類中,只能存在一個。因為會發生調用的不確定性;
(6)注意:如果在方法書寫時,這個方法擁有多參數,參數中包含可變參數,可變參數一定要寫在參數列表的末尾位置。
10、Collections集合工具類
(1)Collections是集合工具類,用來對集合進行操作;
(2)方法
public static <T> void sort(List<T> list) // 集合元素排序
//排序前元素list集合元素 [33,11,77,55] Collections.sort( list ); //排序后元素list集合元素 [11,33,55,77]public static void shuffle(List<?> list) //? 集合元素存儲位置打亂
//list集合元素 [11,33,55,77] Collections.shuffle( list ); //使用shuffle方法后,集合中的元素為[77,33,11,55],每次執行該方法,集合中存儲的元素位置都會隨機打亂11、集合嵌套
(1)集合嵌套并不是一個新的知識點,僅僅是集合內容又是集合,如Collection集合嵌套、Collection集合與Map集合相互嵌套、Map集合嵌套;
(2)ArrayList嵌套 ArrayList
ArrayList< ArrayList<String> > Collection< ArrayList<Integer> >(3)Map嵌套 ArrayList
HashMap<String, ArrayList<Person>> ArrayList< HashMap<String, String>(4)Map集合嵌套
HashMap<String, HashMap<String,String>> HashMap<String, HashMap<Person,String>>12、集合繼承體系的面向對象思想
(1)接口:用來明確所有集合中該具有的功能,相當于在定義集合功能標準;
(2)抽象類:把多個集合中功能實現方式相同的方法,抽取到抽象類實現,具體集合不再遍寫,繼承使用即可;
(3)具體類:繼承抽象類,實現接口,重寫所有抽象方法,達到具備指定功能的集合。每個具體集合類,根據自身的數據存儲結構方式,對接口中的功能方法,進行不同方式的實現。
l? ArrayList嵌套 ArrayList
轉載于:https://www.cnblogs.com/gzdlh/p/8094862.html
總結
以上是生活随笔為你收集整理的00084_Map接口的全部內容,希望文章能夠幫你解決所遇到的問題。