【Map vs Set】:Java数据存储的“双子星”对决

【Map vs Set】:Java数据存储的“双子星”对决

 个人主页♡喜欢做梦

欢迎  👍点赞  ➕关注  ❤️收藏  💬评论


目录

🍰一、搜索

🍮1.概念

🍮2.模型

🍰二、Map

🍨1.什么是Map?

🍨2.Map的实例化

🍨3.Map的常见方法

🍨4.Map方法的使用

🍰三、Set

🍯1.什么是Set?

🍯2.Set的常见方法

🍯3.Set方法的使用

🍰四、Map和Set的区别


🍰一、搜索

🍮1.概念

搜索:是指在数据集合过程中查找特定元素或满足特定条件元素的过程。如:在一组数组中查找特定的数字。常见的搜索有直接遍历和二分查找.....

直接遍历和二分查找比较适合静态类型的查找,即一般不会对区间进行插入和删除操作。

所以当需要动态查找时,即查找时要进行一些插入和删除,上述的方法并不适用 。如:在学生系统中,快速查找学生的成绩、统计单词出现的次数、确保用户名唯一(去重)。

Map和Set是一种专门用来进行搜索的容器或者数据结构,是一种适合动态查找的集合容器。

🍮2.模型

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

  • 1.纯key模型:由唯一的键(key)组成,没有与键直接关联的特定值(value)。

      特点:重点在于对键的管理和操作,常用于判断某个元素是否存在。

      应用场景:数据去重,黑名单过滤等......

  • 2.key-value模型:是一种键(key)和值(value)进行相关联的数据组织形式。每个键都对应着一个特定的值,通过键可以快速查找、更新与之关联的值。如查找在一串字符串中查找,某个单词在该字符串中出现的次数。

       特点:键是唯一的,用于快速定位和访问对应的值,其值可以是各种类型的数据。

       应用场景:广泛应用于配置文件、数据库等,比如,以用户ID为键,存储用户姓名等为值。

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

🍰二、Map

🍨1.什么是Map?

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

🍨2.Map的实例化

Map<K,V>是将键(key)与值(value)进行关联的数据结构,K代表键的类型,V代表值的类型。

Map的实现类主要有HashMap,TreeMap

实例化的实现:

 public static void main(String[] args) { Map<String,Integer> map1=new HashMap<>(); Map<String,Integer> map2=new TreeMap<>(); }
  •  Map是一个接口,不能直接实例化对象,如果要实例化对象只能通过其实现类TreeMap或者HashMap来实现

🍨3.Map的常见方法

方法解释
V put(K key,V value)

设置key值与value值相关联

V remove(Object key)将key对应的映射关系删除
V remove(Object key,Object value)只有指定的键与指定的值相匹配时才可以删除
V get(Object key)返回key对应的value值
V getOrDefault(Object key,V defalutValue)返回key对应的value,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

🍨4.Map方法的使用

public static void main(String[] args) { Map<String,Integer> map=new HashMap<>(); //map:设置k,v值 map.put("a",2); map.put("c",5); map.put("s",21); //get:获取key对应的value值 System.out.println(map.get("a"));//2 System.out.println(map.get("b"));//不存在key值,其默认值为null //getOrDefault: //如果map中有key值,返回key对应的value1值,否则返回设置的默认值 System.out.println(map.getOrDefault("a",1));//2 System.out.println(map.getOrDefault("b",3));//3 //remove1:如果key值与指定的值相匹配,删除;否则,不删除 map.remove("a",1);//不匹配不删除 System.out.println(map.get("a"));//a对应的value还是2 //remove2:删除key对应的value值 map.remove("a"); System.out.println(map.get("a"));//null //containsKey:判断是否包含key System.out.println(map.containsKey("c"));//true //containsValue:判断是否包含value值 System.out.println(map.containsValue(10));//false Map<String,Integer> map1=new TreeMap<>(); map1.put("a",2); map1.put("a",3); map1.put("b",3); map1.put("c",6); //Set<K> keySet:返回key中不重复的集合 Set<String> keySet=map1.keySet(); System.out.println(keySet);//[a, b, c] //Collection<V> values:返回value中可重复的集合 Collection<Integer> value=map1.values(); System.out.println(value);//[3, 3, 6] //Set<K,V>> entrySet:返回key-value所有的映射关系 Set<Map.Entry<String,Integer>> entrySet=map1.entrySet(); System.out.println(entrySet);//[a=3, b=3, c=6] }

注意事项:

  • Map中存放键值对的Key是唯一的,value是可重复的,当put相同的key,不同的value值时,只是将key所对应的value值进行替换,以最后存放的value为主; 
public static void main(String[] args) { Map<String,Integer> map=new HashMap<>(); map.put("a",11); map.put("a",24); map.put("a",15); System.out.println(map.get("a"));//15 }
  • 在HashMap中存放的key和value可以都为空,在TreeMap中插入键对值时,key不能为空,value可以为空;
HashMap

 TreeMap

  •  Map中键值对的key不能直接修改,可以直接修改value值,如果要修改key,只能将key删除,在进行重新插入。
  •  HashMap和TreeMap是Map的接口实现类,用于存储键对值数据,以下是他们的区别:
Map的底层结构TreeMapHashMap
底层结构红黑树哈希表(数组+链表/红黑树)
插入/删除/查找时间复杂度O(log2N)O(1)
是否有序关于Key有序无序
允许null键不允许,需可比较允许null键
线程安全不安全不安全
插入/删除/查找区别需要进行元素比较通过哈希函数计算哈希地址
比较与覆写key必须能够比较,否则会抛出异常自定义类型需要覆写equals和hashCode方法
应用场景需要key有序无序有序,需要更高的时间性能

🍰三、Set

🍯1.什么是Set?

Set是一个接口,继承自Collection接口,有HashSet、TreeSet等实现类,HashSet基于哈希表实现,不保证元素有序;TreeSet基于红黑树实现,会对元素进行排序。

🍯2.Set的常见方法

方法解释
boolean add(E e)添加元素,但元素重复不添加
boolean remove(Object o)删除集合中元素o
boolean contains(Object o)判断o是否包含在集合中
boolean isEmpty()检测是否为空,为空返回false,否则返回true
void clear()清空
Iterator<E> iterator()使用迭代器遍历集合中的对象
int size()返回set中元素个数
Object[] toArray()将set中的元素转换为数组返回
boolean containsAll(Collection<?>c)集合中的元素是否在set中的全部存在,是返回true,否则返回false
boolean addAll(Collection<? extend)将集合c中的元素添加到set中,可以达到去重的效果

🍯3.Set方法的使用

 public static void main(String[] args) { public static void main(String[] args) { Set<Integer> set1=new HashSet<>(); //add:添加元素 set1.add(5); set1.add(20); set1.add(15); set1.add(8); //remove:移除元素 set1.remove(20); //是否包含该元素 System.out.println(set1.contains(5));//true System.out.println(set1.contains(2));//false //Iterator:遍历集合 Iterator<Integer> iterator=set1.iterator(); while(iterator.hasNext()){ System.out.print(iterator.next()+" ");//5 8 15 } System.out.println(); //isEmpty:判断是否为空 System.out.println(set1.isEmpty());//false:不为空 //size:计算元素个数 System.out.println(set1.size());//3 //toArray:将set中的元素转换为数组 Integer[] toArray=set1.toArray(new Integer[0]); for (Integer x:toArray) { System.out.print(x+" ");//5 8 15 } System.out.println(); //containsAll:set是否包含指定集合的所有元素 Set<Integer> set2=new HashSet<>(); set2.add(1); set2.add(2); set2.add(3); Set<Integer> set3=new HashSet<>(); set3.add(1); set3.add(2); //看set2中是否都包含set3集合中的元素 boolean containsAll=set2.containsAll(set3); System.out.println(containsAll);//true //addAll:将集合中的元素添加到set中 Set<Integer> set4=new TreeSet<>(); set4.add(1); set4.add(5); set4.add(19); Set<Integer> set5=new TreeSet<>(); set5.add(2); set5.add(1); set5.add(6); boolean addAll=set4.addAll(set5); Iterator<Integer> iterator1=set4.iterator(); while(iterator1.hasNext()){ //如果是HashSet那么不自动排序,如果是TreeSet就自动排序 System.out.print(iterator1.next()+" ");//1 2 5 6 19 }

注意:

  •  Set只存储了key,并且要求key一定要唯一,其key值不能进行修改,如果要进行修改需要删除后再插入。
  • Set可以对集合进行去重;
  • TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中;
  • TreeSet和HashSet的区别
Set底层结构TreeSetHashSet
底层结构红黑树哈希表
插入/删除/查找时间复杂度O(log2N)O(1)
是否有序key有序不一定有序
允许null键不允许,需可比较允许null键
线程安全不安全不安全
插入/删除/查找区别按照红黑树的特性来进行插入和删除1.先计算key哈希地址2.然后进行插入和删除
比较与覆写key必须能够比较,否则会抛出ClassCastException异常

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

应用场景需要key有序无关有序,需要更高的时间性能

🍰四、Map和Set的区别

区别MapSet
存储形式是一种键对值(key-value)集合是值的集合,值存在单一的值,不存在重复元素
访问方式get(key)方法没有键对值的映射,一般通过for循环或者迭代器遍历
唯一性键是唯一的,不用重复,值可以重复所有元素都是唯一的
应用场景需要建立映射关系的场景需要确保元素唯一的场景

Read more

苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * 多所高校要求警惕 OpenClaw 安全风险,部分严禁校内使用 * 荣耀 CEO 李健:荣耀机器人全栈自研,将聚焦消费市场 * 马化腾凌晨 2 点发声:还有一批龙虾系产品陆续赶来 * 前快手语言大模型中心负责人张富峥,已加入智源人工智能研究院,负责 LLM 方向 * 最新全球 AI 应用百强榜发布,豆包/DeepSeek/千问上榜 * 苹果折叠 iPhone 将于九月亮相,融合 iPhone 与 iPad 体验

By Ne0inhk
不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

编译 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) “如果你周日去旧金山的咖啡馆,会发现几乎每个人都在工作。” 这是 AI 创业公司 Mythril 联合创始人 Sanju Lokuhitige 最近最直观的感受。去年 11 月,他特地搬到旧金山,只为了更接近 AI 创业浪潮的中心。但很快,他也被卷入了这股浪潮带来的另一面——一种越来越极端的工作文化。 Lokuhitige 坦言,他现在几乎每天工作 12 小时,每周 7 天。除了每周少数几场刻意安排的社交活动(主要是为了和创业者们建立联系),其余时间几乎都在写代码、做产品。 “有时候我整整一天都在编程,”他说,“我基本没有什么工作与生活的平衡。”而这样的生活,在如今的 AI 创业圈里并不算罕见。 旧金山 AI 创业圈的真实日常 一位在旧金山一家 AI

By Ne0inhk
黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

AI 究竟是什么?在 NVIDIA CEO 黄仁勋看来,它早已不只是聊天机器人或某个大模型,而是一种正在迅速成形的“新型基础设施”。 近日,黄仁勋在英伟达官网发布了一篇长文,提出一个颇具形象的比喻——AI 就像一块“五层蛋糕”。从最底层的能源,到芯片、基础设施、模型,再到最上层的应用,人工智能正在形成一整套完整的产业技术栈,并像电力和互联网一样,逐渐成为现代社会的底层能力。 这也是黄仁勋自 2016 年以来公开发表的第七篇长文。在这篇文章中,他从计算机发展史与第一性原理出发,试图解释 AI 技术栈为何会演化成如今的形态,以及为什么全球正在掀起一场规模空前的 AI 基础设施建设。 在他看来,过去几十年的软件大多是预先编写好的程序:人类设计好算法,计算机按指令执行,数据被结构化存储在数据库中,通过精确查询调用。而 AI 的出现打破了这一模式——计算机开始能够理解图像、文本和声音,并根据上下文实时生成答案、推理结果甚至新的内容。 正因为智能不再是预先写好的代码,而是实时生成的能力,支撑它运行的整个计算体系也必须被重新设计。

By Ne0inhk
猛裁1.6万人后,网站再崩6小时、一周4次重大事故!官方“紧急复盘”:跟裁员无关,也不是AI写代码的锅

猛裁1.6万人后,网站再崩6小时、一周4次重大事故!官方“紧急复盘”:跟裁员无关,也不是AI写代码的锅

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 过去几年里,科技公司几乎都在同一件事上加速:让 AI 参与写代码。 从自动补全、自动生成函数,到直接修改系统配置,生成式 AI 已经逐渐走进真实生产环境。但最近发生在亚马逊的一连串事故,却给整个行业泼了一盆冷水——当 AI 开始真正参与生产环境开发时,事情可能远比想象复杂。 最近,多家媒体披露,本周二亚马逊内部紧急召开了一场工程“深度复盘(deep dive)”会议,专门讨论最近频繁出现的系统故障——其中,一个被反复提及的关键词是:AI 辅助代码。 一周 4 次严重事故,亚马逊内部紧急复盘 事情的起点,是最近一段时间亚马逊系统稳定性明显下降。 负责亚马逊网站技术架构的高级副总裁 Dave Treadwell 在一封内部邮件中坦言:“各位,正如大家可能已经知道的,最近网站及相关基础设施的可用性确实不太理想。” 为此,公司决定把原本每周例行举行的技术会议

By Ne0inhk