首页 > 其他分享 >Map集合

Map集合

时间:2023-11-21 21:00:29浏览次数:28  
标签:Map HashMap map value put key 集合 public

Map集合

Map集合总存放的元素是Entry类型的,该元素包含key和value。它是所有键值对集合的根类。它的子类HashMap便是今天需要掌握的重点。

HashMap集合

 创建HashMap的语法:

①HashMap  名称  = new  HashMap();
②HashMap  名称  = new  HashMap(初始化容量);

举个例子:

1 public class Test {
2     public static void main(String[] args) {
3         //通过调用无参构造方法生成HashMap对象
4         HashMap map = new HashMap();
5         //使用有参构造方法,提供初始化容量
6         HashMap map1 = new HashMap(10); 
7     }
8 }

HashMap中常见的方法。

存放元素

语法:

V put(K key, V value)  :是将元素添加到Map集合中

举个例子:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //创建一个Map对象
 4         HashMap map = new HashMap();
 5         //添加元素,里面的key不能重复,如果重复则后者替换前者的value值
 6         map.put(1,"a");
 7         map.put(2,"b");
 8         map.put(1,3);
 9         System.out.println(map);
10     }
11 }

效果展示:

 可以看见当两个key值相同时,后者的value值会替换前者的value值。

移除元素

语法:

V remove(Object key)  :根据key值来移除value值,并返回value值

举个例子:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //创建一个Map对象
 4         HashMap map = new HashMap();
 5         //添加元素,里面的key不能重复,如果重复则后者替换前者的value值
 6         map.put(1,"a");
 7         map.put(2,"b");
 8         Object remove = map.remove(1);
 9         System.out.println("remove = " + remove);
10     }
11 }

效果展示:

修改元素

HashMap中有两种修改元素的方法,但是底层使用的仍是put方法

语法:

①V put(K key, V value)  :将key值相同时修改value值
②V replace(K key, V value)  :将key值相同时修改value值

举个例子:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //创建一个Map对象
 4         HashMap map = new HashMap();
 5         //添加元素,里面的key不能重复,如果重复则后者替换前者的value值
 6         map.put(1,"a");
 7         map.put(2,"b");
 8         //使用put方法,将相同的key值中的value值进行修改
 9         map.put(1,"你好啊,我要将1中的value值替换了");
10         //使用replace方法,将相同的key值中的value值进行修改
11         map.replace(2,"你好啊,我要将2中的value值替换了");
12         System.out.println(map);
13     }
14 }

效果展示:

 可以看出两者方法实现的结果都是一样的。(一般建议使用put方法,这样可以少记一个方法)。

查询元素

语法:

①V get(Object key)  :根据key获取对应的value值
②V getOrDefault(Object key, V defaultValue)  :如果指定的key存在,则获取对应的value值,否则获取defaultValue值
③Set<K> keySet()  :获取所有的key
④Collection<V> values()  :获取所有的value值

举个例子:

 1 public class Test {
 2     public static void main(String[] args) {
 3         //创建Map对象
 4         HashMap map=new HashMap();
 5         map.put(1,"a");
 6         map.put(2,"b");
 7         map.put(3,"c");
 8 
 9         //根据指定的key获取对应的值
10         Object o = map.get(1);
11         System.out.println("key为1对应的值" + o);
12         //如果指定的key存在,则获取对应的value值,否则defaultValue值
13         Object value = map.getOrDefault(8, "0");//8这个key值是不存在的
14         System.out.println("key为8对应的值" + value);
15 
16         //获取map中所有的key
17         Set set = map.keySet();
18         System.out.println("map中所有的key:" + set);
19 
20         //获取map中所有的value值
21         Collection values = map.values();
22         System.out.println("map中所有的value:" + values);
23     }
24 }

效果展示:

遍历元素

HashMap有两种遍历的方法,一种是根据key遍历,另一种是使用增强循环

方法一:根据key遍历

 1 public class Test {
 2     public static void main(String[] args) {
 3         //创建Map对象
 4         HashMap map=new HashMap();
 5         map.put(1,"a");
 6         map.put(2,"b");
 7         map.put(3,"c");
 8 
 9         //遍历
10         //1.获取map中所有的key
11         Set set = map.keySet();
12         //2.遍历key
13         for(Object key:set){
14             //3.根据key值获取map对应的value
15             Object value = map.get(key);
16             System.out.println(key+"---->" + value);
17         }
18     }
19 }

效果展示:

 方法二:使用增强循环遍历

 1 public class Test {
 2     public static void main(String[] args) {
 3         //创建Map对象
 4         HashMap map=new HashMap();
 5         map.put(1,"a");
 6         map.put(2,"b");
 7         map.put(3,"c");
 8 
 9         //1.获取map中的所有元素
10         Set<Map.Entry> set = map.entrySet();
11         for(Map.Entry entry:set){
12             //遍历获取key以及对应的value
13             System.out.println(entry.getKey()+"----->"+entry.getValue());
14         }
15     }
16 }

效果展示:

可以看见两者都可以遍历出map中的所有键值对,但是第一种方法是阿里巴巴不推荐使用的方法。因为它需要循环遍历两次map集合性能上比第二种方法要差得多,所以在开发的时建议使用第二种方法

HashMap底层原理

jdk1.7之前,HashMap底层使用的是数组+链表。而且链表是通过头部插入数据。

jdk1.8之后,HashMap底层使用的是数组+链表+红黑树。而且链表是通过尾部插入数据。

将(key1,value1)添加到map中过程:

①首先需要调用key1所在类的hashCode()方法,计算出key1对应的哈希值1,此时哈希值1仍需要经过hash()之后获取哈希值2。

②哈希值2再经过indexFor()之后,确定(key1,value1)在数组table中的索引位置 i 

      1.1  如果索引位置 i 的数组上没有元素时,则(key1,value1)添加成功  ----------->情况1

      1.2  如果索引位置 i 的数组上存在元素(key2,value2),则需要比较key1和key2的哈希值2  ------------>哈希冲突

             2.1  如果key1的哈希值2与哈希值2不相同,则(key1,value2)添加成功 -------->情况2

             2.2  如果key1的哈希值2与哈希值2相同,则需要继续比较key1和key2的equals()方法。-------------->哈希冲突

                   3.1  如果调用equals()方法,返回false:则(key1,value1)添加成功  --------->情况3 

                   3.2  如果调用的equals()方法,返回true:则认为key1和key2是相同的。这种情况下,value1替换为原有的value2。

说明:情况1,将(key1,value1)存放到数组的索引 i 位置。

   情况2,情况3(key1,value1)元素与现有的(key2,value2)构成单向链表结构

 HashMap通过链表和红黑树解决hash冲突的问题,当hash冲突少时,使用链表。当数组索引位置上的hash冲突多时 [个数超过8且数组长度大于64位],把链表变成红黑树。

如果数组索引位置上的hash冲突少于6个时,将把红黑树转换成链表。

标签:Map,HashMap,map,value,put,key,集合,public
From: https://www.cnblogs.com/gzyhrc/p/17843661.html

相关文章

  • @ComponentScan和@MapperScan的作用
    本文根据文章:https://blog.csdn.net/weixin_45693551/article/details/132302689进行修改@ComponentScan@ComponentScan("com.xa")注解用于指定Spring容器在启动时需要扫描的包路径。在这个例子中,Spring容器会扫描com.xa包及其子包下的所有类,将带有@Component、@Service、@Re......
  • Java单列集合Set:HashSet与LinkedHashSet详解,为什么它比List接口更严格?
    上篇我们介绍了单列集合中常用的list接口,本篇我们来聊聊单列集合中的另外一个重要接口Set集合。1、Set介绍java.util.Set接口和java.util.List接口一样,同样实现了Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口......
  • HDFS与MAPREDUCE操作
     HDFS文件操作在分布式文件系统上验证HDFS文件命令,如下。hadoopfs[genericOpitions][-ls<path>] //显示目标路径当前目录下的所有文件[-lsr<path>] //递归显示目标路径下的所有目录及文件(深度优先)[-du<path>] //以字节为单位显示目录中所有文件的大小,或该文......
  • Spring5学习随笔-整合MyBatis(持久层)、连接池、Mapper文件
    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】Spring持久层整合第一章、持久层整合1.Spring框架为什么要与持久层技术进行整合JavaEE开发需要持久层进行数据库的访问操作。JDBCMyBatis、Hibe......
  • 封装实现unordered_map和set
    什么是哈希思想首先哈希是一个关联式容器,各个数据之间是具有关系的,和vector那些序列式容器不一样。首先unordered_map中的迭代器是一个单向的迭代器。其次在unorderede_map和set中是无序的(因为底层不是红黑树,而是哈希了)不再进行排序了。用法和set/map一样(除了不能使用--之外)。然后......
  • java反序列化----CC6利用链学习笔记(HashMap和HashSet)
    目录java反序列化----CC6利用链学习笔记环境配置利用链java反序列化----CC6利用链学习笔记环境配置jdk8(无版本要求)pom.xml中写入<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId>......
  • 【洛谷 P1125】[NOIP2008 提高组] 笨小猴 题解(字符串+映射+集合)
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设是单词中出现次数最多的字母的出现次数,是单词中出现次数最少的字母的出现次数,......
  • es定制 dynamic mapping template(type)
    定制dynamicmappingtemplate(type)PUT/my_index{"mappings":{"my_type":{"dynamic_templates":[{"en":{"match":"*_en","match_mapping_type":"string","mapping&quo......
  • 集合框架(二)
    Set集合Set集合是一个无序不重复的接口,里面有两个实现类HashSet和TreeSetHashSet类 创建HashSet的语法:①HashSet名称=newHashSet();②HashSetset1=newHashSet(初始化容量数);③HashSetset2=newHashSet(初始化容量数,负载因子);负载因子:当数量到达容量的多少时进行......
  • Java中的Set集合之TreeSet
    TreeSet:TreeSet是一个有序集合,它扩展了AbstractSet类并实现了NavigableSet接口。以下是此实现最重要方面的快速摘要:它存储唯一的元素它不保留元素的插入顺序它按升序对元素进行排序它不是线程安全的在该实现中,对象根据其自然顺序以升序排序和存储。该TreeSet中使用的是一......