数据结构,Map和Set的使用

简介: 本文讲解:Java数据结构中的Map和Set的使用

1. Map的使用

通过上方Map和Set的模型我们知道了,Map中存储的是一个<Key,Value>的键值对结构。那么Map它是一个接口,底层有HashMap和TreeMap使用了这个接口。

image.gif编辑

因此,我们不能直接实例化(new)一个Map对象,SortedMap也是一个接口,也不能实例化。但可以实例化Map底层的HashMap和TreeMap。因此,我们使用Map来操作数据时,使用的就是HashMap和TreeMap了。

image.gif编辑


1.1Map的说明

在Map这个集合中,Map中Key值是唯一的,Value值可不唯一,借助以下代码来理解:

public static void main(String[] args) {
        Map<Character,Integer> map = new HashMap<>();
        map.put('A',3);//键值对A,3
        map.put('B',3);//键值对B,3
        map.put('A',6);//键值对A,6
        System.out.println(map);//输出map集合
}

image.gif

输出:

image.gif编辑通过输出结果我们发现到,第一行的键值对A,3没有输出。只输出了第二行键值对B,3和第三行的键值对A,6。因此我们可以确定Map集合中Key值唯一、Value值不唯一


1.2 Java中Map常用的方法

方法 返回类型及参数类型 说明
get() get(Object key) 返回key对用的value
getOrDefault() getOrDefault(Object key, V defaultValue) 返回key对应的value,key不存在时返回默认值
put() put(K key, V value) 设置key对应的value
remove() remove(Object key) 删除key对应的映射关系
keySet()  Set<K> keySet()  返回所有key的不重复集合
values()  Collection<V> values()  返回所有的value的可重复集合
entrySet()  Set<Map.Entry<K, V>> entrySet() 返回所有的key,value映射关系
containsKey(Object key)  boolean containsKey(Object key) 判断是否包含key
containsValue(Object value)  boolean containsValue(Object value) 判断是否包含value

以下为这些方法的实例演示:

public static void main(String[] args) {
        //实例化一个HashMap对象为map这个集合
        Map<Character,Integer> map = new HashMap<>();
        //put方法
        map.put('A',3);//put方法给map集合添加键值对A,3
        map.put('B',3);//put方法给map集合添加键值对B,3
        System.out.println("put两个键值对后map集合为: "+map);
        System.out.println("输出A对应的value值: "+map.get('A'));//get方法
        System.out.println("输出C对应的value值没有则输出默认值666: "+map.getOrDefault('C', 666));
        //remove方法
        map.remove('A');
        System.out.println("删除A后的map集合为: "+map);
        //keySet方法
        System.out.println("map集合中Key不重复值组成的集合: "+map.keySet());
        //entrySet方法
        System.out.println("map集合中的所有Key=Value映射(键值对)关系:"+map.entrySet());
        //containsKey方法
        System.out.println("判断map集合中是否包含Key为A的值: "+map.containsKey('A'));
        //containsValue方法
        System.out.println("判断map集合中是否包含Value为3的值: "+map.containsValue(3));
    }

image.gif

输出以下内容:

image.gif编辑


通过上方所有知识点的学习,我们能总结以下几点:

    1. Map是一个抽象类,不能被实例化,只能实例化底层的HashMap和TreeMap
    2. Map中存储的键值对Key是唯一的,Value是不唯一的
    3. Map中的Key可以全部分离出来,存储在Set中的任何一个子集合中(通过Set<K> keySet()方法)。因为Key不能重复!
    4. Map中的Value也可以全部分离出来,存储在Collection的任何一个子集合中(通过方法Collection<V> values()方法),因为Value可以重复!
    5. Map中的键值对Key值不能直接修改,Value可修改,如果要修改Key只能先删除Key值再重新插入。

    2. Set的使用

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

    image.gif编辑


    2.1Java中Set的常用方法

    方法 返回类型及参数类型 说明
    add() boolean add(E e) 添加元素,但重复元素不会被添加成功
    clear() void clear() 清空集合
    contains() boolean contains(Object o)  判断 o 是否在集合中
    iterator() Iterator<E> iterator()  返回迭代器
    remove() boolean remove(Object o)  删除集合中的 o
    size() int size() 返回set中元素的个数
    isEmpty() boolean isEmpty() 检测set是否为空,空返回true否则返回false
    toArray() Object[] toArray() 将set中的元素转换为数组返回
    containsAll() boolean containsAll(Collection<?> c) 集合c中的元素是否在set中全部存在,是返回true否则返回false
    addAll() boolean addAll(Collection<? extends
    E> c)
    将集合c中的元素添加到set中,可以达到去重效果

    大家可以下来自行测试一番。

    相关文章
    |
    2月前
    |
    存储 缓存 JavaScript
    Set和Map有什么区别?
    Set和Map有什么区别?
    237 1
    |
    6月前
    |
    编译器 C++ 容器
    【c++丨STL】基于红黑树模拟实现set和map(附源码)
    本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
    168 2
    |
    3月前
    |
    存储 JavaScript 前端开发
    for...of循环在遍历Set和Map时的注意事项有哪些?
    for...of循环在遍历Set和Map时的注意事项有哪些?
    97 0
    |
    3月前
    |
    存储 C++ 容器
    unordered_set、unordered_multiset、unordered_map、unordered_multimap的介绍及使用
    unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。在unordered_set中,元素的值同时也是唯一地标识它的key。在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。它的迭代器至少是前向迭代器。前向迭代器的特性。
    176 0
    |
    3月前
    |
    编译器 C++ 容器
    用一棵红黑树同时封装出map和set
    再完成上面的代码后,我们的底层代码已经完成了,这时候已经是一个底层STL的红黑树了,已经已符合库里面的要求了,这时候我们是需要给他穿上对应的“衣服”,比如穿上set的“衣服”,那么这个穿上set的“衣服”,那么他就符合库里面set的要求了,同样map一样,这时候我们就需要实现set与map了。因此,上层容器map需要向底层红黑树提供一个仿函数,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。我们就可以使用仿函数了。
    43 0
    |
    3月前
    |
    存储 编译器 容器
    set、map、multiset、multimap的介绍及使用以及区别,注意事项
    set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
    190 0
    |
    11月前
    |
    存储 Java
    告别混乱!用Java Map优雅管理你的数据结构
    【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
    195 2
    |
    11月前
    |
    存储 Java 开发者
    Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
    【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
    228 2
    |
    7月前
    |
    编译器 容器
    哈希表模拟封装unordered_map和unordered_set
    哈希表模拟封装unordered_map和unordered_set