Java 中的 Set 和 Map

本文深入探讨了Java集合框架中的Map和Set,详细介绍了它们的官方文档、常用方法及其实现原理。通过具体示例,展示了如何使用Map进行键值对映射操作,以及Set如何实现元素的去重和判断。此外,还提供了完整的代码示例,帮助读者更好地理解和应用这些集合类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Map

Map的官方文档

常用方法
Map<K, V> 即 Map 中定义的 K 类型的 key 和 V 类型的 value 的映射关系的类。

方法解释
K.getKey()返回 entry 中的 key
V.getValue()返回 entry 中的 value
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 对应的映射关系
boolean containsKey(Object key)判断是否包含 key
boolean containsValue(Object value)判断是否包含 value

一个 Map 只能维护一组映射关系,如果有多组映射,就需要多组 Map

2、Set

Set 的官方文档

常用方法
Set< K > 即 Set中定义的 K 类型的 key 的类

方法解释
boolean add(E e)添加元素,但重复元素不会被添加成功
void clear()清空集合
boolean contains(Object o)判断 o 是否在集合中
Iterator < E> iterator()返回迭代器
boolean remove(Object o)删除集合中的 o

Set 的 add 方法加入多个相同元素,在 Set 中只能保存一份,可以用来去重

3、代码示例

map 的示例代码

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

class Student {
    public String name;
    public int age;
    public String grade;
    public String school;

    public Student(String name, int age, String grade, String school) {
        this.name = name;
        this.age = age;
        this.grade = grade;
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", grade='" + grade + '\'' +
                ", school='" + school + '\'' +
                '}';
    }
}
public class TestMap {
    public static void main(String[] args) {
        Student s1 = new Student("初一", 18, "大一","清华");
        Student s2 = new Student("初二", 19, "大二","北大");
        Student s3 = new Student("初三", 20, "大三","哈佛");

       Map<String,Student> studentMap = new HashMap<>();
       studentMap.put(s1.name,s1);
       studentMap.put(s2.name,s2);
       studentMap.put(s3.name,s3);

       String name = "初三";
        System.out.println(studentMap.get(name));

        Student s4 = new Student("初二",22,"大四","陕科大");
        studentMap.put(s4.name,s4);
        String name2 = "初二";
        System.out.println(studentMap.get(name2));

        Student ss = studentMap.getOrDefault("初五",new Student("初五",12,"一年级","小学"));
        System.out.println(ss);

        // 遍历 Map
        for (Map.Entry<String,Student> entry : studentMap.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }

        // 用迭代器来遍历
        Iterator<Map.Entry<String,Student>> iterator = studentMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String,Student> entry = iterator.next();
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }
}

Set 的示例代码

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class TestSet {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        // 加入元素,add 加入多个相同元素,在 Set 中只有一份,作用:去重
        set.add("初一");
        set.add("初二");
        set.add("初三");
        set.add("初四");
        set.add("初五");

        // 看某元素是否在 Set 中存在
        System.out.println(set.contains("初一"));

        // 删除某元素
        set.remove("初一");
        System.out.println(set.contains("初一"));

        System.out.println(set);
        for (String s:set) {
            System.out.println(s);
        }

        // 用迭代器来遍历
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
<think>嗯,用户问的是JavaSetMap的区别。首先,我得回想一下这两种集合的基本概念用途。SetMap都是Java集合框架的一部分,但它们的用途结构不同。 Set应该是一个不包含重复元素的集合,对吧?比如HashSet、TreeSet这些实现类。而Map是键值对的集合,每个键对应一个值,键不能重复,但值可以重复。比如HashMap、TreeMap。那它们的区别应该从存储结构、元素特性、用途等方面来展开。 首先,存储结构方面,Set只存储元素,而Map存储的是键值对。这点很关键,用户可能需要知道什么时候用Set,什么时候用Map。比如需要检查元素是否存在,用Set;需要根据键快速查找值,用Map。 然后元素特性,Set里的元素是唯一的,而Map的键是唯一的,值可以重复。这点也需要强调,因为有时候用户可能会混淆两者的唯一性保证对象。 接下来是接口实现。Set实现的是Collection接口,而Map是独立的接口。这意味着Set可以使用Collection的方法,比如add、remove,而Map有自己的方法,比如put、get。 用途方面,Set常用于去重成员检查,Map用于键值关联存储,比如缓存、配置项。例子可能会有帮助,比如用HashSet去重,用HashMap存储学生成绩。 还有迭代方式的不同,Set可以直接迭代元素,而Map需要先获取键集合、值集合或条目集合。这可能影响用户如何遍历它们的数据结构。 另外,查找效率方面,虽然两者都基于哈希或树结构,但Map的查找是通过键直接访问值,而Set是检查元素是否存在。这可能涉及到时间复杂度的差异,但具体实现可能影响实际性能。 可能需要考虑用户是否有常见的误区,比如试图用Set来存储键值对,或者用Map来单纯存储元素,这时候需要指出他们的不同适用场景。 还需要检查是否有其他区别,比如是否允许空元素或空键值,不过这可能取决于具体实现类,比如TreeSetTreeMap不允许空,如果使用自然排序的话。 最后,总结两者的主要区别,帮助用户明确在什么情况下选择哪种集合。可能需要用例子来进一步说明,比如Set用于存储唯一用户名,Map用于用户名到用户信息的映射。</think>### JavaSetMap的核心区别 #### 1. **存储结构不同** - **Set** 仅存储**唯一元素**的集合,内部元素无明确关联。 例如:`Set<String> names = new HashSet<>();` 用途:去重、快速判断元素是否存在。 - **Map** 存储**键值对(Key-Value)**,键唯一,值可重复。 例如:`Map<String, Integer> scores = new HashMap<>();` 用途:通过键快速查找关联值(如字典、缓存)。 --- #### 2. **元素特性** - **Set** 直接保存元素,通过`equals()``hashCode()`保证唯一性。 示例: ```java Set<Integer> set = new HashSet<>(); set.add(1); // 成功 set.add(1); // 被拒绝 ``` - **Map** 键唯一,值可重复。键的哈希决定存储位置。 示例: ```java Map<String, Integer> map = new HashMap<>(); map.put("Alice", 90); // 键"Alice"唯一 map.put("Bob", 90); // 值90可重复 ``` --- #### 3. **接口与功能** - **Set** 实现`Collection`接口,支持集合操作(如并集、交集)。 核心方法:`add()`, `contains()`, `remove()`。 - **Map** 独立接口,提供键值映射操作。 核心方法:`put()`, `get()`, `keySet()`, `values()`。 --- #### 4. **遍历方式** - **Set** 直接遍历元素: ```java for (String name : names) { System.out.println(name); } ``` - **Map** 需通过键、值或条目遍历: ```java for (Map.Entry<String, Integer> entry : scores.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); } ``` --- #### 5. **典型应用场景** - **Set** - 去重:`new ArrayList<>(new HashSet<>(list))` - 黑白名单检查:`if (allowedUsers.contains(username))` - **Map** - 缓存:`Map<URL, CacheData>` - 配置项:`Map<String, String> config` --- ### 总结对比表 | 特性 | Set | Map | |--------------------|------------------------------|------------------------------| | **存储内容** | 唯一元素 | 键值对(键唯一) | | **接口** | 继承`Collection` | 独立接口 | | **查找依据** | 元素自身 | 键 | | **典型实现类** | `HashSet`, `TreeSet` | `HashMap`, `TreeMap` | | **去重方式** | 自动去重 | 键重复时覆盖旧值 | --- ### 如何选择? - 需要存储**独立元素且去重** → **Set** - 需要建立**键到值的映射关系** → **Map**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值