当前位置: 代码网 > it编程>编程语言>Java > 一文详解Java中Map和Set接口的使用方法

一文详解Java中Map和Set接口的使用方法

2024年08月05日 Java 我要评论
map与set的基本概念与场景map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有:1. 直接遍历,时间复杂度为o(n),元素如果比较多效

map与set的基本概念与场景

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

1. 直接遍历,时间复杂度为o(n),元素如果比较多效率会非常慢。
2. 二分查找,时间复杂度为o(log2^n),但搜索前必须要求序列是有序的。

上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:

1. 根据姓名查询考试成绩
2. 通讯录,即根据姓名查询联系方式
3. 不重复集合,即需要先搜索关键字是否已经在集合中

可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的map和set是一种适合动态查找的集合容器。

模型概念

一般把搜索的数据称为关键字(key),和关键字对应的称为值(value),将其称之为key-value的键值对,所以模型会有两种:

  1. 纯 key 模型,例如:
  • 有一个英文词典,快速查找一个单词是否在词典中
  • 快速查找某个名字在不在通讯录中
  1. key-value 模型,例如:
  • 统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数

map接口的性质

在java中,map接口是一个用于存储键值对(key-value pairs)的对象,它属于java collections framework的一部分。map接口的主要特点包括:

  1. 键值对存储map存储的数据是以键值对的形式组织的,每个键(key)唯一对应一个值(value)。可以通过键来快速获取对应的值。

  2. 无序性:大多数实现类(如hashmap)不会保证元素的顺序,除非使用特定的实现(如linkedhashmap,它可以保持插入顺序,或者treemap,它会按照键的自然顺序或指定的比较器进行排序)。

  3. 键的唯一性:在同一个map中,不能有重复的键。如果试图将一个新的值与已有的键关联,原有的值将被新值替换。

  4. 实现类:java提供了多种map接口的实现,例如:

    • hashmap:基于哈希表的实现,允许null值和null键,查找速度快。
    • treemap:基于红黑树的实现,支持排序的键,查找速度相对较慢。
    • linkedhashmap:结合了hashmap的哈希表和链表特性,维护插入顺序。
  5. 常用方法map接口提供了一系列的方法,例如:

    • put(k key, v value):将指定的值与指定的键关联。
    • get(object key):返回指定键所映射的值。
    • remove(object key):移除指定键的键值对。
    • containskey(object key):检查是否存在指定的键。
    • keyset():返回map中所有键的集合。
    • values():返回map中所有值的集合。

总之,map接口是java中重要的数据结构之一,方便有效地进行数据的存储和检索,广泛应用于各种场景中。

map接口的使用方法

put(k key, v value):将指定的值与指定的键关联。

public class main {
    public static void main(string[] args) {
        map<string,integer> map = new treemap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
    }
}

get(object key):返回指定键所映射的值。

public class main {
    public static void main(string[] args) {
        map<string,integer> map = new treemap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        system.out.println(map.get("two"));
    }
}

v getordefault(object key, v defaultvalue) :返回 key 对应的 value,key 不存在,返回默认值

public class main {
    public static void main(string[] args) {
        map<string,integer> map = new treemap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        system.out.println(map.getordefault("five",-1));
    }
}

set<k> keyset() :返回所有 key 的不重复集合,用 set 容器接收

public class main {
    public static void main(string[] args) {
        map<string,integer> map = new treemap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        set<string> strings = map.keyset();
        
    }
}

collection<v> values() :返回所有 value 的可重复集合 ,用 collection 容器接

public class main {
    public static void main(string[] args) {
        map<string,integer> map = new treemap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        collection<integer> values = map.values();
        system.out.println("==");
    }
}

set<map.entry<k, v>> entryset() :返回所有的 key-value 映射关系

public class main {
    public static void main(string[] args) {
        map<string,integer> map = new treemap<>();
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        set<map.entry<string, integer>> entries = map.entryset();
        for (map.entry<string, integer> entry : entries) {
            system.out.println("key = "+entry.getkey()+" val = "+entry.getvalue());
        }
    }
}

注意: 

  1. map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类treemap或者hashmap
  2. map中存放键值对的key是唯一的,value是可以重复的
  3. 在treemap中插入键值对时,key不能为空,否则就会抛nullpointerexception异常,value可以为空。但是hashmap的key和value都可以为空。
  4. map中的key可以全部分离出来,存储到set中来进行访问(因为key不能重复)。
  5.  map中的value可以全部分离出来,存储在collection的任何一个子集合中(value可能有重复)。
  6. map中键值对的key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。

set接口的性质

在java中,set接口是一个用于存储唯一元素的集合,它也是java collections framework的一部分。set接口的主要特点包括:

  1. 唯一性set中不允许重复的元素,这意味着集合中的每个元素都是唯一的。如果试图添加重复元素,操作将被拒绝,集合的状态不会改变。

  2. 无序性set通常不保证元素的顺序。尤其是使用hashset时,元素的存储顺序是随机的。而linkedhashset可以维护元素的插入顺序,treeset则会按自然顺序或自定义的比较器进行排序。

  3. 实现类:java提供了多种set接口的实现,包括:

    • hashset:基于哈希表的实现,允许null元素,查找速度快,但不保证元素的顺序。
    • linkedhashset:结合了哈希表和链表的特性,保持元素的插入顺序。
    • treeset:基于红黑树的实现,按升序排序元素,不允许null值。
  4. 常用方法set接口提供了一系列的方法,例如:

    • add(e e):向集合中添加元素,如果元素已存在,则返回false。
    • remove(object o):移除指定元素。
    • contains(object o):检查集合中是否包含指定元素。
    • size():返回集合中元素的数量。
    • clear():移除集合中的所有元素。
    • iterator():返回一个迭代器,用于遍历集合中的元素。
  5. 应用场景set常用于需要存储不重复元素的场景,比如去重、集合运算(如交集、并集和差集)等。

总之,set接口是java中重要的数据结构,适合用于处理唯一性要求的数据集合,具有高效的存储和检索特性。

set接口的使用方法

set 接口中的方法和 map 接口中的常见方法大差不差,就不一 一介绍了。

import java.util.treeset;
import java.util.iterator;
import java.util.set;
public static void testset(){
   set<string> s = new treeset<>();
   // add(key): 如果key不存在,则插入,返回ture
   // 如果key存在,返回false
   boolean isin = s.add("apple");
   s.add("orange");
   s.add("peach");
   s.add("banana");
   system.out.println(s.size());
   system.out.println(s);
isin = s.add("apple");
   // add(key): key如果是空,抛出空指针异常
   //s.add(null);
   // contains(key): 如果key存在,返回true,否则返回false
   system.out.println(s.contains("apple"));
   system.out.println(s.contains("watermelen"));
   // remove(key): key存在,删除成功返回true
   //             key不存在,删除失败返回false
   //             key为空,抛出空指针异常
   s.remove("apple");
   system.out.println(s);
   s.remove("watermelen");
   system.out.println(s);
   iterator<string> it = s.iterator();
   while(it.hasnext()){
       system.out.print(it.next() + " ");
  }
   system.out.println();
}

以上就是一文详解java中map和set接口的使用方法的详细内容,更多关于java map和set使用方法的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com