Map集合与Set集合

【前言】Map集合与Set集合都是专门用来进行搜索的容器或者数据结构(尤其适合动态查找,什么是动态查找呢,就是可能在查找时进行插入、删除的操作,如生活中的根据姓名查找考试成绩)

目录

一、Map集合

1.官方文档:

2.常用方法

3.Map集合的遍历

4.TreeMap 与 HashMap的区别

5.LinkedHashMap ?

二、Set集合

1.官方文档

2.常用方法

?3.TreeSet 与 HashSet 的区别

关键点小总?


一、Map集合

1.官方文档:

  • 首先值得注意的就是,Map并没有继承自Collection接口,而是独立的一块数据结构;
  • Map是一个接口类,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复;
  • Map接口下有两个普通子类,HashMap和TreeMap,其中,HashMap就是我们通常所说的哈希表(底层基于哈希桶),而TreeMap则是二分搜索树BST的实现(底层基于红黑树)

2.常用方法

import java.util.Map;
import java.util.TreeMap;

public class Map_Test {
    public static void main(String[] args) {
        Map<String,Integer> treeMap = new TreeMap<>();
//        添加键值对
        treeMap.put("a",1);
        treeMap.put("b",5);
        treeMap.put("c",7);
//        删除键值对,并返回删除的val值
        int a = treeMap.remove("b");
//        得到key值对应的value值
        int c= treeMap.get("a");
        boolean d = treeMap.containsKey("a");
        boolean e = treeMap.containsValue(3);
        System.out.println(a);
        System.out.println(c);
        System.out.println(d);
        System.out.println(e);
    }
}

输出结果:

3.Map集合的遍历

(1)获取所有的key值集合

因为key值是唯一不重复的,所以把遍历到的key集合存储到Set集合中

Set keySet() 返回所有 key 的不重复集合

(2)获取所有的value集合

因为value是可以重复的,所以我们把遍历到的value集合存储到Collection集合中

Collection values() 返回所有 value 的可重复集合

(3)获取所有的键值对

键值对也是不重复的,也返回Set集合

【注意】因为Set集合不能存储一对键值对,所以这里我们使用Map.Entry<>将键值对存入一个对象中,Entry就是一个存储key值,value值的类

Set<Map.Entry<K, V>> entrySet() 返回所有的 key-value 映射关系

    public static void main(String[] args) {
        Map<String,Integer> treeMap = new TreeMap<>();
//        添加键值对
        treeMap.put("a",1);
        treeMap.put("b",5);
        treeMap.put("c",7);
//        删除键值对,并返回删除的val值
        int a = treeMap.remove("b");
//        key值集合
        Set<String> s = treeMap.keySet();
        System.out.println(s);
//        遍历打印所有key值集合
        for(String s1 : treeMap.keySet()){
            System.out.print(s1 + " ");
        }
        System.out.println();
//        val值集合
        Collection<Integer> cc = treeMap.values();
        System.out.println(cc);
//        遍历打印所有val集合
        for(Integer i : treeMap.values()){
            System.out.print(i + " ");
        }
        System.out.println();
//        键值对集合
        Set<Map.Entry<String,Integer>> entry = treeMap.entrySet();
        System.out.println(entry);
//        遍历打印键值对
        for(Map.Entry<String,Integer> temp : treeMap.entrySet()){
            System.out.print(temp.getKey() + "=" + temp.getValue() + " ");
        }
        System.out.println();


    }

输出结果:

[a, c]
a c
[1, 7]
1 7
[a=1, c=7]
a=1 c=7

4.TreeMap 与 HashMap的区别

除上表外,我们还应知道,对于HashMap,key值和value值都可以为Null

而对于TreeMap,key值不可以为空,value值可以为空,TreeMap中的元素必须是Comparable的子类或者传入比较器

5.LinkedHashMap

对于HashMap和TreeMap,插入顺序和输出顺序并无太大关联,有时候我们可能需要保证我put的顺序和最后输出的顺序一致,这时候我们就要使用inkedHashMap类,该类可以保证put顺序和输出顺序一致L

public class LinkedHashMap_Practice {
    public static void main(String[] args) {
        Map<String,Integer> order = new LinkedHashMap<>();
        Map<String,Integer> map = new HashMap<>();
//        HashMap
        map.put("yiyi",1);
        map.put("sansna",8);
        map.put("ww",2);
        System.out.println(map);
        
//        LinkedHashMap
        order.put("yiyi",1);
        order.put("sansna",8);
        order.put("ww",2);
        System.out.println(order);
    }
}

输出顺序:

{ww=2, sansna=8, yiyi=1}
{yiyi=1, sansna=8, ww=2}

二、Set集合

1.官方文档

  • Set集合继承自Collection接口;
  • Set中只存储了key值,且key值是不重复的,故而经常用Set集合实现去重;
  • 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,同Map接口一样,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序
  • Set的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的;

2.常用方法

public class Set_Practice {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(4);
        set.add(6);
        set.add(8);
        set.add(4);
//        可以发现,重复元素4只存储一次
        System.out.println(set);
//        set集合可以直接使用for-each循环遍历
        for(Integer i : set){
            System.out.println(i);
        }
//        删除元素
        boolean a = set.remove(7);
        System.out.println(a);
        set.remove(8);
        System.out.println(set);
    }
}

输出结果:

[4, 6, 8]
4
6
8
false
[4, 6]

3.TreeSet 与 HashSet 的区别

其实可以发现,Set基本与Map一样,只是Map存储的是键值对,而Set只存储key值,故经常用于去重,更实际,Set集合下的子类就是Map下的子类,在Set中只是将key值对应的value值全部设为null而已

如下图,为HashSet的源码,可以看到,其内部就是HashMap

再如其add方法:

关键点小总

  • 综上,Set集合只存储了key值,常用于去重操作,而Map集合则存储的是key-value的键值对;
  • 其子类,HashMap/HashSet基于哈希表+红黑树结构,而TreeMap/TreeSet基于红黑树结构(红黑树是非严格平衡的二分搜索树);
  • 为了使插入顺序与输出顺序一致,可以用LinkedHashMap / LinkedHashSet 类,这两个子类又维护了一个双向链表来记录元素的插入次序,所以可以保证插入顺序与输出顺序一致;
  • TreeMap/TreeSet 的key值要能够比较,所以元素必须是Comparable的子类或者传入比较器;
  • 最后,Map集合遍历键值对的方法经常易忘,要记住用Map.Entry<>类和entrySet()方法呀!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值