Java筆記——Map集合

 

Map集合接口

Map集合與Collection不是從屬關係,是平級的html

  1. Map集合的映射特色java

    • 一個映射不能包含重複的鍵,由此鍵只能容許有一個空null
    • 每一個鍵最多隻能和一個值對應
    • 值能夠重複,由此值容許多個是空null
    • Map集合與Collection的子接口Set同樣是無序的
  2. Map<KEY,VALUE>:KEY和VALUE表示泛型,KEY和VALUE能夠是任何數據類型【除基本數據類型以外】,實際項目中KEY通常是String類型node

實現類

HashMap

特色
  • 一個映射不能包含重複的鍵:web

    若是存在重複的KEY,則後面添加的會把前面的覆蓋windows

  • 其實鍵就是Set,元素惟一,只能有一個null,安全

  • 元素是無序的(與添加順序無關)app

  • HashMap不是同步的,即線程不安全less

如何將HashMap變成線程安全?ide

 
 
 
 
 
 
 
 
1
Collections.synchronizedMap(<HashMap集合>);
 
 
經常使用方法
 
 
 
x
 
 
 
 
1
public static void main(String[] args) {
2
        Map<String, String> maps = new HashMap<>();
3
        /*1.添加*/
4
        //加入單條鍵值對
5
        maps.put("智多星","吳用");
6
        maps.put("豹子頭","林沖");
7
        maps.put("玉麒麟","盧俊義");
8
        Map<String, String> map1 = new HashMap<>();
9
        map1.put("小諸葛","富安");
10
        map1.put("及時雨","宋江");
11
        //加入一個集合:將一個集合複製到另外一個集合中
12
        maps.putAll(map1);
13
        System.out.println("map集合:"+maps);
14
        System.out.println("map1集合:"+map1);
15
        /*2.清空*/
16
        map1.clear();
17
        System.out.println("map1是否爲空:"+map1.isEmpty());  //isEmpty()檢查集合是否爲空 返回布爾值
18
        /*3.獲取*/
19
        //獲取VALUE,經過KEY獲取VALUE
20
        System.out.println("獲取智多星的值:"+maps.get("智多星"));
21
        //獲取所有的KEY,返回一個Set集合
22
        Set<String> KEYSET = maps.keySet();
23
        System.out.println("獲取KEY的Set集合:"+KEYSET); //輸出Map集合中的KEY
24
    /*4.遍歷集合*/
25
        //遍歷集合:經過遍歷Set集合的KEYSET,來獲取集合的值VALUE
26
        System.out.println("===============\n經過for()加強遍歷HashMap集合");
27
        for (String str : KEYSET) {
28
            String value = maps.get(str);
29
            System.out.println(str+"——>"+value);
30
        }
31
        //遍歷集合:經過entrySet(),返回 Set<Map.Entry<K,V>>,一個Set集合
32
        System.out.println("===============\n經過entrySet()遍歷HashMap集合");
33
        Set<Map.Entry<String, String>> entries = maps.entrySet();
34
        for (Map.Entry<String, String> entry : entries) {
35
            //獲取KEY
36
            String key = entry.getKey();
37
            //獲取VALUE
38
            String value = entry.getValue();
39
            System.out.println(key+"——>"+value);
40
        }
41
    /*5.判斷功能*/
42
        //是否包含指定的鍵KEY,返回布爾值
43
        System.out.println("maps集合中是否包含」玉麒麟「這個KEY:"+(maps.containsKey("玉麒麟")?"是":"否"));
44
    
45
        //是否包含指定的值VALUE,返回布爾值
46
        System.out.println("maps集合中是否包含」宋江「這個VALUE:"+(maps.containsValue("宋江")?"是":"否"));
47
    
48
        //檢查集合是否爲空null
49
        System.out.println("maps集合是否爲空:"+(maps.isEmpty()?"是":"否"));
50
        //HashMap不能同步,即線程不安全
51
        /*6.如何線程安全?*/
52
        Collections.synchronizedMap(maps);
53
        Collections.synchronizedMap(map1);
54
55
56
    }
 
 

 

 

LinkedHashMap

  • 特色svg

    • 容許多個null 值 和 一個 null 鍵
    • LinkedHashMap有順序(添加順序有關)與HashMap的區別
    • LinkedHashMap線程不安全
  • 代碼

 
 
 
xxxxxxxxxx
23
 
 
 
 
1
 public static void main(String[] args) {
2
        /*LinkedHashMap*/
3
        Map<String, String> maps = new LinkedHashMap<>();
4
        maps.put("智多星","吳用");
5
        maps.put("豹子頭","林沖");
6
        maps.put("玉麒麟","盧俊義");
7
        //LinkedHashMap根據元素添加順序進行排序
8
        System.out.println(maps);
9
        
10
        /*HashMap*/
11
        Map<String, String> hashmap = new HashMap<String, String>();
12
        hashmap.put("智多星","吳用");
13
        hashmap.put("豹子頭","林沖");
14
        hashmap.put("玉麒麟","盧俊義");
15
        //排序與添加順序無關
16
        System.out.println(hashmap);
17
        //綜上比較LinkedHashMap和HashMap之間的區別即元素是否有序
18
    }
19
/*
20
LinkedHashMap-->{智多星=吳用, 豹子頭=林沖, 玉麒麟=盧俊義}
21
HashMap-->{玉麒麟=盧俊義, 智多星=吳用, 豹子頭=林沖}
22
23
*/
 
 

 

TreeMap

  • 不多用到,須要自定義比較器

  • TreeMap能夠參考TreeSet,TreeMap能夠支持Map的排序

  • TreeMap根據鍵KEY的天然順序進行排序,或者根據建立映射【鍵和值相對應】時提供的Comparator進行排序,具體取決於使用的構造方法。

  • 特色

    • 能夠按照KEY來排序
    • KEY不能爲null,KEY不能重複,VALUE值能夠有多個null
    • 線程不安全
代碼
封裝類
 
 
 
xxxxxxxxxx
50
 
 
 
 
1
/*
2
Student實現Comparable接口,則TreeMap能夠根據KEY來排序
3
*/
4
public class Student implements Comparable<Student> {
5
    private String name ;
6
    private int age;
7
8
    public Student() {
9
    }
10
11
    public Student(String name, int age) {
12
        this.name = name;
13
        this.age = age;
14
    }
15
16
    public String getName() {
17
        return name;
18
    }
19
20
    public void setName(String name) {
21
        this.name = name;
22
    }
23
24
    public int getAge() {
25
        return age;
26
    }
27
28
    public void setAge(int age) {
29
        this.age = age;
30
    }
31
32
    /**
33
     *
34
     * @param o
35
     * @return
36
     * 自定義比較器:根據年齡來比較
37
     */
38
    @Override
39
    public int compareTo(Student o) {
40
        return this.age - o.age;
41
    }
42
43
    @Override
44
    public String toString() {
45
        return "Student{" +
46
                "name='" + name + '\'' +
47
                ", age=" + age +
48
                '}';
49
    }
50
}
 
 
測試類
 
 
 
xxxxxxxxxx
22
 
 
 
 
1
public class HashMapDemo02  {
2
    public static void main(String[] args) {
3
        Map<Student, String> maps = new TreeMap<>();
4
        /*1.添加*/
5
        //加入單條鍵值對
6
        maps.put(new Student("智多星",30),"吳用");
7
        maps.put(new Student("豹子頭",30),"林沖");
8
        maps.put(new Student("玉麒麟",30),"盧俊義");
9
        maps.put(new Student("小諸葛",25),"富安");
10
        
11
        System.out.println(maps);
12
    }
13
}
14
/*答案
15
16
//由於以年齡age爲排序依據,因此係統誤認爲第一條到第二條是同一條數據
17
//在Student中是設置根據年齡進行排序,TreeMap集合是根據KEY進行排序
18
{Student{name='小諸葛', age=25}=富安, 
19
Student{name='智多星', age=30}=林沖, 
20
Student{name='玉麒麟', age=33}=盧俊義}
21
22
*/
 
 

 

Hahstable

  • 不經常使用

  • 特色

    1. HashTable是map的實現類
    2. 不容許鍵 和 值爲null,會報「空指針異常」
    3. HashTable中的元素沒有順序(與添加的順序無關)
    4. HashTable是線程安全的:查看源碼,用了
相關文章
相關標籤/搜索