11.集合之map
map接口下的集合
- map接口下的集合采用鍵值對Map<k,v>的存儲方式,保存具有映射關系的數據。因此map集合里保存兩組值,一組用于保存map里的key值,另外一組用于保存map里的value值,key和value可以是任意引用類型的數據。key值不允許重復,鍵可以為null,如果添加key-value鍵值對時已經有重復的key,則添加的value會覆蓋key原來對應的value值.常用的實現類有HashMap、LinkedHashMap、TreeMap等。
- HashMap是以hash算法存儲的,無序的
- LinkedHashMap是以鏈表方式存儲的.有序的
- TreeMap是紅黑樹算法存儲的map,有序的
1 HashMap
-
案例1:存值
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Test {public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();map.put("CN","中華人民共和國");map.put("FN", "法國人民共和國");map.put("JP","日本人民共和國");map.put("YL", "伊朗人民共和國");map.put(null, "伊朗人民共和國");//鍵可以為nullmap.put("CN", "大秦帝國");//鍵如果重復,會將后面的值覆蓋前面的值String value = map.get("CN");System.out.println("CN鍵對應的值:"+value);System.out.println("是否有CN這個鍵:"+map.containsKey("CN"));System.out.println(map.keySet());System.out.println(map.values());System.out.println(map);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據鍵獲取值String value1 = map.get(key);System.out.println("值"+value1);}} } -
結果
CN鍵對應的值:大秦帝國 是否有CN這個鍵:true [null, YL, JP, FN, CN] [伊朗人民共和國, 伊朗人民共和國, 日本人民共和國, 法國人民共和國, 大秦帝國] {null=伊朗人民共和國, YL=伊朗人民共和國, JP=日本人民共和國, FN=法國人民共和國, CN=大秦帝國} 值伊朗人民共和國 值伊朗人民共和國 值日本人民共和國 值法國人民共和國 值大秦帝國 -
案例2:存對象
-
Student類
public class Student{private String name;private int age;public void showStudent(){System.out.println("你好我是"+name+",年齡是:"+age);}public Student() {super();}public Student(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;}} -
測試
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Test1 {public static void main(String[] args) {Student stu1 = new Student("馬云",45);Student stu2 = new Student("馬化騰",40);Student stu3 = new Student("董明珠",47);Student stu4 = new Student("章澤天",28);//Map集合的適用場景:不適用于大量有序的數據遍歷,一般適用于少量數據作為方法的參數Map<String,Student> map = new HashMap<String,Student>();map.put(stu1.getName(), stu1);map.put(stu2.getName(), stu2);map.put(stu3.getName(), stu3);map.put(stu4.getName(), stu4);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據鍵獲取值Student student = map.get(key);student.showStudent();}System.out.println("=================================");for (String key : keys) {Student student = map.get(key);student.showStudent();}System.out.println("===============================");for (Student student : map.values()) {student.showStudent();}} } -
結果
你好我是馬云,年齡是:45 你好我是章澤天,年齡是:28 你好我是董明珠,年齡是:47 你好我是馬化騰,年齡是:40 ================================= 你好我是馬云,年齡是:45 你好我是章澤天,年齡是:28 你好我是董明珠,年齡是:47 你好我是馬化騰,年齡是:40 =============================== 你好我是馬云,年齡是:45 你好我是章澤天,年齡是:28 你好我是董明珠,年齡是:47 你好我是馬化騰,年齡是:40
-
2 LinkedHashMap
-
LinkedHashMap以map接口的哈希表算法和連接列表實現,具有順序的map
-
采用雙向列表來維護key-value對的次序(其實只要考慮key的次序即可),該鏈表負責維護map的迭代順序,與插入順序一致,因此性能比HashMap低,但在迭代map里的全部元素時有較好的性能
-
案例1:
import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set;public class Test {public static void main(String[] args) {//LinkedHashMap以雙向鏈表式按照你插入元素的順序放到LinkedHashMap容器中//插入性能低,按鍵取值性能比hashMap低,但是遍歷所有值的時候效率高Map<String,String> map = new LinkedHashMap<String,String>();map.put("CN","中華人民共和國");map.put("FN", "法國人民共和國");map.put("JP","日本人民共和國");map.put("YL", "伊朗人民共和國");map.put(null, "伊朗人民共和國");//鍵可以為nullmap.put("CN", "大秦帝國");//鍵如果重復,會將后面的值覆蓋前面的值String value = map.get("CN");System.out.println("CN鍵對應的值:"+value);System.out.println("是否有CN這個鍵:"+map.containsKey("CN"));System.out.println(map.keySet());System.out.println(map.values());System.out.println(map);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據鍵獲取值String value1 = map.get(key);System.out.println("值"+value1);}} } -
結果
CN鍵對應的值:大秦帝國 是否有CN這個鍵:true [CN, FN, JP, YL, null] [大秦帝國, 法國人民共和國, 日本人民共和國, 伊朗人民共和國, 伊朗人民共和國] {CN=大秦帝國, FN=法國人民共和國, JP=日本人民共和國, YL=伊朗人民共和國, null=伊朗人民共和國} 值大秦帝國 值法國人民共和國 值日本人民共和國 值伊朗人民共和國 值伊朗人民共和國 -
案例2:存對象
import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set;public class Test1 {public static void main(String[] args) {Student stu1 = new Student("馬云",45);Student stu2 = new Student("馬化騰",40);Student stu3 = new Student("董明珠",47);Student stu4 = new Student("章澤天",28);//Map集合的適用場景:不適用于大量有序的數據遍歷,一般適用于少量數據作為方法的參數Map<String,Student> map = new LinkedHashMap<String,Student>();map.put(stu1.getName(), stu1);map.put(stu2.getName(), stu2);map.put(stu3.getName(), stu3);map.put(stu4.getName(), stu4);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據鍵獲取值Student student = map.get(key);student.showStudent();}System.out.println("=================================");for (String key : keys) {Student student = map.get(key);student.showStudent();}System.out.println("===============================");for (Student student : map.values()) {student.showStudent();}} } -
結果
你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 ================================= 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 =============================== 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 10
3 Properties
Properties類是HashTable的子類,它相當于一個key、value都是String類型的map,主要用于讀取配置文件,比如之前學的log4j.properties配置文件,將系統的配置信息配置在該文件中。
4 TreeMap
-
基于紅黑樹算法實現,非線程安全,不允許null,key不允許重復,它是sortedMap的實現類,會根據紅黑樹算法將key排序后插入到TreeMap容器中。也可以采取自然排序和自定義排序。
-
如果采用自定義排序,可以實現compareable接口或者comparator接口來重寫comparaTo方法來自定義排序
-
案例
import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap;public class Test {public static void main(String[] args) {//TreeMap是會排序后插入到容器中(LinkedHashMap是按序插入)//默認是自然排序,如果需要按照你的規則,需要實現comparator接口重寫排序規則Map<String,String> map = new TreeMap<String,String>();map.put("CN", "中國");map.put("AN", "美國");map.put("YL", "伊朗");map.put("JP", "日國");//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據鍵獲取值String value1 = map.get(key);System.out.println("值"+value1);}} } -
結果
值美國 值中國 值日國 值伊朗
5 Hashtable
Hashtable與HashMap的區別
-
hashMap是非線程安全的,hashtable是線程安全的,效率上低于hashMap
-
案例
-
Student類
public class Student{private String name;private int age;public void showStudent(){System.out.println("你好我是"+name+",年齡是:"+age);}public Student() {super();}public Student(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;}} -
測試類
import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Test1 {public static void main(String[] args) {Student stu1 = new Student("馬云",45);Student stu2 = new Student("馬化騰",40);Student stu3 = new Student("董明珠",47);Student stu4 = new Student("章澤天",28);//hashMap是非線程安全的,hashtable是線程安全的,效率上低于hashMapMap<String,Student> map = new Hashtable<String,Student>();map.put(stu1.getName(), stu1);map.put(stu2.getName(), stu2);map.put(stu3.getName(), stu3);map.put(stu4.getName(), stu4);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據鍵獲取值Student student = map.get(key);student.showStudent();}System.out.println("=================================");for (String key : keys) {Student student = map.get(key);student.showStudent();}System.out.println("===============================");for (Student student : map.values()) {student.showStudent();}} } -
結果
你好我是馬云,年齡是:45 你好我是章澤天,年齡是:28 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47
6 各Map實現類的性能分析
總結
- 上一篇: 手写HashMap及测试
- 下一篇: android广播 有序 无序,Andr