【Java】Map & Set

baa392a6732c4d05a0bd92744c3537df.png

 

这篇文章所要讲的内容与上述图片紧密相关。有了该图,便可以理解许多问题了。 

目录

Map

概念

使用

常用方法

Map.Entry,>

Set 

概念

使用

常用方法:


 

Map

概念

Map是一个接口类,如上图,它没有继承Collection,Map存储的是<key,val>结构的键值对,key是唯一的,不能重复。

使用

因为Map是一个接口类,所以不能直接单独实例化,所以通常实现TreeMap或者HashMap(实现了Map接口的类)。

常用方法

增加:V put(K key, V value)

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

public class TestMap {
    public static void main(String[] args) {
        //通过TreeMap来演示
        Map<String, Integer> map = new TreeMap<>();
        
        //增加
        map.put("张三", 8);
        map.put("李四", 2);
        
    }
}

删除:V remove(Object key)

        //增加
        map.put("张三", 8);
        map.put("李四", 2);
        System.out.println(map);
        //删除
        map.remove("李四");
        System.out.println(map);

d7c91005684946a8bbd8dab5369e5b27.png

查找Key的Val:

V get(Object key)
V getOrDefault(Object key, V defaultValue)
        //增加
        map.put("张三", 8);
        map.put("李四", 2);
        System.out.println(map);
        //查找
        //该方法返回key所对应的val,如果没有找到,则返回null
        Integer find1 = map.get("张三");
        Integer find2 = map.get("王五");
        //该方法返回key所对应的val,如果没有找到,则返回给的默认值
        Integer find3 = map.getOrDefault("王五", -1);
        System.out.println(find1);
        System.out.println(find2);
        System.out.println(find3);

 4e0d109a5707479da3eedeabffeb7262.png

 查找是否包含Key 或者 Val:

boolean containsKey(Object key)
boolean containsValue(Object value)
        map.put("张三", 8);
        map.put("李四", 2);
        System.out.println(map);

        System.out.println(map.containsKey("张三"));
        System.out.println(map.containsKey("王五"));
                                         //自动装包了
        System.out.println(map.containsValue(2));
        System.out.println(map.containsValue(6));

a931d7d072c545bbaf13a71f5dce548c.png

 返回所有Key 或者 Val

Set<K> keySet()
Collection<V> values()

30c03bc897ae421ba74d7436aa904f08.png

 86c903c9ffd04d918032730a2ec6d4cb.png

 返回Key和Val

Set<Map.Entry<K, V>> entrySet()
        map.put("张三", 8);
        map.put("李四", 2);
        System.out.println(map);

        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        
        for (Map.Entry<String, Integer> x: entrySet) {
            System.out.println(x);
        }

ccf8e2e93d7646d48ea666b6715dc481.png

Map.Entry<K, V>

Map.Entry<K, V> Map 内部实现的用来存放 <key, value> 键值对映射关系的内部接口类,该内部类中主要提供了
<key, value>的获取,value的设置以及Key的比较方式。

 

方法说明
K getKey()
返回 entry 中的 key
V getValue()
返回 entry 中的 value
V setValue(V value)
将键值对中的value替换为指定value

因为Key不可变,所以没有提供替换Key的方法。


Set 

概念

Set是一个接口类,它继承了Collection。Set存储Key值,并且Key都不相同

使用

因为Set是一个接口类,所以不能直接单独实例化,所以通常实现TreeSet或者HashSet(实现了Map接口的类)。

常用方法:

增加某个值,或某个集合:

boolean add(E e)

boolean addAll(Collection<? extends E> c)
import java.util.Set;
import java.util.TreeSet;

public class TestSet {
    public static void main(String[] args) {
        //通过TreeSet举例
        Set<String> set = new TreeSet<>();

        //增加
        set.add("abc");
        set.add("aaa");
        set.add("abc");
        System.out.println(set);
    }
}

 

526502aaaa2142679f6a282b4fb0ff6b.png

        Set<String> set = new TreeSet<>();
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("aaa");
        arrayList.add("abc");
        arrayList.add("abc");
        set.addAll(arrayList);
        System.out.println(set);

 a3db398011334838b85a2257ef7e4649.png

 

删除:

boolean remove(Object o)

        //增加
        set.add("abc");
        set.add("aaa");
        set.add("abc");
        System.out.println(set);
        
        System.out.println(set.remove("aaa"));
        System.out.println(set.remove("a"));
        System.out.println(set);

c467907922394810a14ea671316ef427.png

 转成数组:

Object[] toArray()

        set.add("abc");
        set.add("aaa");
        System.out.println(set);

        String[] arr = set.toArray(new String[0]);
        System.out.println(arr[1]);

3331714cd3c9421389eb78a9199dc3d4.png

 返回迭代器:

Iterator<E> iterator()

为什么Map没有这个方法,是因为Map没有继承于Collection,Collection是继承在Iterable下的。所以这就是为什么Map为什么有Set<Map.Entry<K, V>> entrySet()方法,就是为了转成Set好使用迭代器。for each底层是迭代器,所以上面打印的时候直接使用的是for each

        set.add("abc");
        set.add("aaa");
        System.out.println(set);

        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }

 b570350f9971440c939b78e078bc67c6.png

 是否包含某个值,某个集合:

boolean contains(Object o)
boolean containsAll(Collection<?> c)
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("aaa");
        arrayList.add("abc");

        //增加
        set.add("abc");
        set.add("aaa");
        System.out.println(set);

        System.out.println(set.contains("a"));
        System.out.println(set.contains("aaa"));
        System.out.println(set.containsAll(arrayList));

d65ff051397145c8a195e2083011eceb.png

 


Map和Set的关系

Set的底层是Map,通过下面的源码可以知道。

1174e0ccecf646dfbdc71847036e0684.png

 有什么错误评论区指出,希望可以帮到你。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值