Map和Set

​Map

Set

活动地址:CSDN21天学习挑战赛

目录

1.概念

1.1 模型

2. Map 的使用

2.1 关于Map的说明

2.2 关于Map.Entry的说明,>

2.3 Map 的常用方法说明

​编辑

2.4 TreeMap和HashMap的区别

3. Set 的说明

3.1 常见方法说明

4. 示例题 

4.1 给定100个数据,统计每个数据出现的次数


1.概念

Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。

Map和Set是一种适合动态查找的集合容器。

1.1 模型

1)纯key模型,比如

有一个英文词典,快速查找一个单词是否在词典中

快速查找某个名字在不在通讯录中

2)Key-Value 模型,比如:

统计文件中每个单词出现的次数,

统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>

Map中存储的就是key-value的键值对,Set中只存储了Key。

2. Map 的使用

2.1 关于Map的说明

Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复

2.2 关于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

注意:Map.Entry<K,V>并没有提供设置Key的方法

2.3 Map 的常用方法说明

方法解释

V get(Object key)

返回 key 对应的 value

V getOrDefault(Object key, V defaultValue

返回 key 对应的 value,key 不存在,返回默认值

V put(K key, V value)

设置 key 对应的 value

V remove(Object key)

删除 key 对应的映射关系

Set<K> keySet()

返回所有 key 的不重复集合

Collection<V> values()

返回所有 value 的可重复集合

Set<Map.Entry<K, V>> entrySet()

返回所有的 key-value 映射关系

boolean containsKey(Object key)

判断是否包含 key

boolean containsValue(Object value)

判断是否包含 value

注意

1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap

2. Map中存放键值对的Key是唯一的,value是可以重复的

3. 在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空

4. Map中的Key可以全部分离出来,存储到Set来进行访问(因为Key不能重复)。

5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。

6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。

代码示例

public class TestDemo {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("a",2);
        map.put("ac",5);
        map.put("hello",10);//存储元素时,如果key 的相同,value值也会被覆盖
        map.put("df",52);
        System.out.println(map);

        Set<String> set = map.keySet();
        System.out.println(set);

        int ret = map.get("ac");//通过key获取对于的value值
        System.out.println(ret);

        System.out.println(map.getOrDefault("ac", 5));//返回key对于de value

        Integer ret2 = map.remove("a");//移除对于的value
        System.out.println(map);

    }
}

2.4 TreeMap和HashMap的区别

Map底层结构

TreeMap

HashMap

底层结构

红黑树

哈希桶

插入/删除/查找时间

复杂度

O(longN)O(1)

是否有序

关于Key有序

无序

线程安全

不安全

不安全

插入/删除/查找区别

需要进行元素比较

通过哈希函数计算哈希地址

比较与覆写

key必须能够比较,否则会抛出 ClassCastException异常

自定义类型需要覆写equals和 hashCode方法

应用场景

需要Key有序场景下

Key是否有序不关心,需要更高的时间性能

3. Set 的说明

Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。

3.1 常见方法说明

方法解释

boolean add(E e)

添加元素,但重复元素不会被添加成功

void clear()

清空集合

boolean contains(Object o)

判断 o 是否在集合中

Iterator<E> iterator()

返回迭代器

boolean remove(Object o)

删除集合中的 o

int size()

返回set中元素的个数

boolean isEmpty()

检测set是否为空,空返回true,否则返回false

Object[] toArray()

将set中的元素转换为数组返回

boolean containsAll(Collection<?> c)

集合c中的元素是否在set中全部存在,是返回true,否则返回 false

boolean addAll(Collection<? extends E> c)

将集合c中的元素添加到set中,可以达到去重的效果

代码示例

    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        System.out.println(set);
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

注意

1. Set是继承自Collection的一个接口类

2. Set中只存储了key,并且要求key一定要唯一

3. Set的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的

4. Set最大的功能就是对集合中的元素进行去重

5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序

6. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入

7. Set中不能插入null的key。

4. 示例题 

4.1 给定100个数据,统计每个数据出现的次数

给出10个数据,然后随机在十个数据中生成100个,然后统计每个数据重复了多少次

    public static Map<Integer,Integer> func(int[] array) {
        Map<Integer,Integer> map = new HashMap<>();

        for (int x:array) {
            if (map.get(x) == null) {
                map.put(x,1);
            } else {
                int val = map.get(x);
                map.put(x,val+1);
            }
        }
        return map;
    }
    public static void main(String[] args) {
        int[] array = new int[100];
        Random random = new Random();
        for (int i = 0; i < array.length; i++) {
            array[i] = random.nextInt(10);
        }
        Map<Integer,Integer> map = func(array);
        System.out.println(map);

    }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fly upward

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值