Java_Map集合

认识Map集合

Map集合称为双列集合,格式:{key1=value,key2=value2,key3=value3,…},一次需要存一对数据作为一个元素。
Map集合的每个元素“Key=value” 称为一个键值对/键值对对象/一个Entry对象,Map集合也被叫做“键值对集合”
Map集合的所有键是不允许重复的,但值可以重复,键和值是一 一对应的,每一个键只能找到自己的对应值(Map集合的键不能重复,Map集合可以重复 )

Map集合体系

Map集合体系

Map集合体系的特点

注意:Map系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的

HashMap(由键决定特点):无序、不重复、无索引(用的最多)
LinkedHashMap(由键决定特点):由键决定的特点:有序、不重复、无索引。
TreeMap(由键决定特点):按照大小默认升序排序、不重复、无索引。

   public static void main(String []args)
   {
      Map<String ,Integer> map = new LinkedHashMap<>();
      map.put("手表"100);
      map.put("手表"200);
      map.put("手机",2);
      map.put("Java",2);
      map.put(null,null);
      System.out.println(map);

      Map<Integer,String> map1 = new TreeMap(); //可排序、不重复、无索引
      map1.put(23,"Java");
      map1.put(23,"MySQL");
      map1.put(19,"李四");
      map1.put(20,"王五");
      System.out.println(map1);

   }

为什么要先学习Map的常用方法?

Map 是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。

 public class MapTest2{
    public static void main(String[] args)
    {
       //1、添加元素:无序、无重复、无索引
        Map<String,Integer> map = new HashMap();
        map.put("手表",100);
        map.put("手表"220);
        map.put("手机"2);
        map.put(null,null);
        System.out.println(map);

        //map = {null=null,手表=220,Java=2,手机=2}
         
         //2、public int size():获取集合的大小
         System.out.println(map.size());

          //3、public void clear();清空集合
          map.clear();
          System.out.println(map);

         //4、public boolean isEmpty():判断集合是否为空,为空返回True,反之。
         System.out.println(map.isEmpty());
         //5、public V get(Object key) 根据键获取对应值
         int v1 = map.get("手表");
         System.out.println(v1);
         System.out.println(map.get("手机"));
         System.out.println(map.get("张三"));

         //6、public V remove(Obejct key):根据键删除整个元素(删除键会返回的值)
         System.out.println(map.remove("手表"));
         System.out.println(map);
         //7、public boolean containsKey(Object key):判断是否包含某个键,包含返回Ture,反之false
        System.out.println(map.containsKey("手表"));
        System.out.println(map.containsKey("手机"));

       //8、public boolean containsValue(Object value):判断是否包含某个信息
       System.out.println(map.containsValue(2));//true
 System.out.println(map.containsValue("2"));//false
 //9、public Set<k> keySet(): 获取Map集合的全部键
 Set<String> keys = map.keySet();
 System.out.println(keys);

//10、public Collection <V> values();获取Map集合的全部值
 Collection<Integer> values = map.values();
 System.out.println(values);

//11、把其它的Map集合的数据倒入到自己的集合中来
  Map<String,Integer> map1 = new HashMap<>();
  map1.put("java1",10);
  map1.put("java2",20);
  Map<String,Integer> map2 = new HashMap<>();
  map2.put("java3",10);
  map2.put("java2",222);
  
  map1.putAll(map2);//putAll: 把Map2集合中的元素全部倒入一份到map集合
  System.out.println(map1);
  System.out.println(map2);
  
         
         
    }
 }


方法名称说明
public V put(K key,V value)添加元素
public int size()获取集合大小
public void clear()清空集合
public void boolean isEmpty()判断集合是否为空,为空返回true,反之false
public V get(Object key)根据键获取对应值
public V remove(Object key)根据键删除整个元素
public boolean containsKey(Object key)判断是否包含某个键
public boolean containsValue(Object value)判断是否包含某个值
public Set keySet()全部键的集合
public Collection values获取Map集合的全部值

Map集合的遍历方式

键值对

Map提供的方法说明
Set<Map.Entry<K,V> entrySet()获取所有“键值对”的集合
public class MapTest2{
 public static void main(String [] args)
 {
   Map<String,Double> map = new HashMap<>();
   map.put("蜘蛛精"169.8);
   map.put("紫霞",165.8);
   map.put("至尊宝",169.5);
   map.put("牛魔王",184.5);

  System.out.println(map);


  //1、调用Map集合提供的entrySet方法,把Map集合转换成键值对象类型的Set集合
   Set<Map.Entry<String,Double>> entries = map.entrySet();
   for(Map.Entry<String,Double> entry :entries)
   {
       String key = entry.getKey();
       double valuel = entry.getValue();
       System.out.println(key+"--=----->"+value);

   }


 }
} 
 

Map 集合的遍历方式三:Lambda

需要用到Map的如下方法

方法名称说明
default void forEach(BiConsumer<? super k, ? super v> action)结合lambda遍历Map集合
public class MapTest2{
 public static void main(String [] args)
 {
   Map<String,Double> map = new HashMap<>();
   map.put("蜘蛛精"169.8);
   map.put("紫霞",165.8);
   map.put("至尊宝",169.5);
   map.put("牛魔王",184.5);

  System.out.println(map);
 //map = {蜘蛛精=169.8,牛魔王=183.9,至尊宝=169.5,紫霞=165.8}

 map.forEach(K,V)->{
    System.out.println(k+"--->>"+v);
    
 });


map.forEach(new BiConsumer<String,Double>(){
   @Override
    public void accept(String k ,Double v)
    {
     System.out.println(k+"----"+v);
     
    }

});
  

HashMap集合的底层原理

HashMap跟HashSet的底层原理是一摸一样的,都是基于哈希表实现的。

实际上:原来学的Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据

 public HashSet()
 {
    map = new HashMap<>();
    
 }
 

哈希表

JDK 8之前,哈希表 = 数组+链表
JDK 8开始,哈希表 = 数组+链表+红黑树
哈希表是一种增删改查数据,性能都较好的数据结构.

HashMap底层是基于哈希表实现的
HashMap集合是一种增删改查的数据,性能都比较好的集合
但是它无序,不能重复,没有索引支持的(由键决定特点)
HashMap的键依赖hashCode方法和equals方法保证键的唯一
如果键存储的是自定义类型对象,可以通过重写hashCode和equals方法,这样可以保证多个对象内容一样时,HashMap集合就能认为是重复的。

   public class Test1HashMap{
      public static void main(String[] args)
      {
         Map<Student,String> map = new HashMap();
         map.put(new Student("蜘蛛精",25,168.5),"蚕丝洞");
         map.put(new Student("蜘蛛精",25,168.5),"水帘洞");
         map.put(new Student("至尊宝",23,163.5),"水帘洞");
         map.put(new Student("牛魔王",28,183.5),"牛头山");
         System.out.println(map);
        
      }
   }

LinkedHashMap 集合的原理

底层数据结构依然是基于哈希实现的,只是每个键值对元素又额外的多了一个双链表机制记录元素顺序(保证有序)
实际上:原来学习LinkedHashSet集合的底层原理就是LinkedHashMap

TreeMap

特点:不重复、无索引、可排序(按照键的大小默认升序排序,只能对键排序)
原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。

TreeMap集合也同样支持两种方式来指定排序规则
让类实现Comparable 接口,重写比较规则。
TreeMap集合也有一个参数构造器,支持创建Comparator比较器对象,以便用来指定比较规则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/697191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

攻防演练之-网络集结号

每一次的网络安全攻防演练都是各个安全厂商期待的网络安全盛会&#xff0c;因为目前的安全生态导致了只有在网络安全攻防演练期间&#xff0c;网络安全的价值才会走向台前&#xff0c;收到相关方的重视。虽然每一次都会由于各种原因不能如期举行&#xff0c;但是这一次的推迟总…

Anaconda配置环境

查看存在的环境 conda list创建环境 #创建 名称为python38的python环境 conda create -n python38 python3.8 #激活 conda activate python38 #退出当前环境 conda deactivate安装python包 #安装numpy包 conda install numpy #安装指定版本 conda install numpy1.0.2 #安装指…

内存卡执行格式化数据还能恢复吗?

众所周知&#xff0c;内存卡对各类电子产品的正常使用至关重要。但在日常使用过程中&#xff0c;错误操作可能导致珍贵资料丢失或意外格式化。相较于其它的删除方式&#xff0c;执行格式化导致的相关问题&#xff0c;想要去恢复的话难度是很高的。那么&#xff0c;内存卡执行格…

Java数组的定义 ,基本概念与使用

数组的定义 1.问题:想将一个数据保存起来,我们可以使用变量,但是变量一次只能存储一个数据,所以我们想能不能一次存多个数据2.数组概述:是一个容器,数组本身属于引用数据类型3.作用:一次存储多个数据4.特点:a.既可以存储基本类型的数据,还能存储引用类型的数据b.定长(定义数组…

wx小程序自定义tabbar

1.在app.json文件中&#xff0c;添加自定义tabbar配置&#xff1a;"custom": true "tabBar": {"custom": true,"backgroundColor": "#fafafa","borderStyle": "white","selectedColor": &quo…

k8s——pod控制器

一、pod控制器定义 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启策略无效&#xf…

字符串常量简单介绍

C/C内存四区介绍 如前文所示&#xff0c;字符串常量存储在静态存储区的字符串常量区&#xff0c;这样做的好处是 当程序使用到多个相同的字符串常量时&#xff0c;实际上都是使用的同一份&#xff0c;这样就可以减小程序的体积。注意字符串常量是只读的不能被修改。 如图所示&…

Simscape Multibody与RigidBodyTree:机器人建模

RigidBodyTree&#xff1a;主要用于表示机器人刚体结构的动力学模型&#xff0c;重点关注机器人的几何结构、质量和力矩&#xff0c;以及它们如何随时间变化。它通常用于计算机器人的运动和受力情况。Simscape Multibody&#xff1a;作为Simscape的一个子模块&#xff0c;专门用…

网络学习(二)DNS域名解析原理、DNS记录

目录 一、为什么要使用DNS&#xff1f;二、因特网的域名结构三、DNS域名解析原理【含详细图解】四、DNS记录&#xff08;A记录、AAAA记录、CNAME记录等&#xff09; 一、为什么要使用DNS&#xff1f; 我们知道&#xff0c;TCP/IP 协议中是使用 IP 地址和端口号来确定网络上的某…

React中的 Scheduler

为什么需要调度 在 React 中&#xff0c;组件最终体现为 Fiber&#xff0c;并形成 FiberTree&#xff0c;Fiber 的目的是提高渲染性能&#xff0c;将原先的 React 渲染任务拆分为多个小的微任务&#xff0c;这样做的目的是可以灵活的让出主线程&#xff0c;可以随时打断渲染&a…

Ffmpeg安装和简单使用

Ffmpeg安装 下载并解压 进入官网 (https://ffmpeg.org/download.html)&#xff0c;选择 Window 然后再打开的页面中下滑找到 release builds&#xff0c;点击 zip 文件下载 环境变量配置 下载好之后解压&#xff0c;找到 bin 文件夹&#xff0c;里面有3个 .exe 文件 然后复制…

高德地图简单实现点标,和区域绘制

高德地图开发文档:https://lbs.amap.com/api/javascript-api/guide/abc/quickstart 百度搜索高德地图开发平台 注册高德地图开发账号 在应用管理中 我的应用中 添加一个Key 点击提交 进入高德地图开发文档:https://lbs.amap.com/api/javascript-api/guide/abc/quickstart …

CTE-6作文

第一段 现象 引出原因 第二段 感受 举例 意义 危害 第三段 建议 展望

使用MFC DLL

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 应用程序与DLL链接后&#xff0c;DLL才能通过应用程序调用运行。应用程序与DLL链接的方式主要有如下两种&#xff1a;隐式链接和显式链接。 隐式链接又称为静态加载&…

【python】python化妆品销售logistic逻辑回归预测分析可视化(源码+课程论文+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Apache Pulsar 从入门到精通

一、快速入门 Pulsar 是一个分布式发布-订阅消息平台&#xff0c;具有非常灵活的消息模型和直观的客户端 API。 最初由 Yahoo 开发&#xff0c;在 2016 年开源&#xff0c;并于2018年9月毕业成为 Apache 基金会的顶级项目。Pulsar 已经在 Yahoo 的生产环境使用了三年多&#…

AI服务器相关知识

在当今社会&#xff0c;人工智能的应用场景愈发广泛&#xff0c;如小爱同学、天猫精灵等 AI 服务已深入人们的生活。随着人工智能时代的来临&#xff0c;AI 服务器也开始在社会各行业发挥重要作用。那么&#xff0c;AI 服务器与传统服务器相比&#xff0c;究竟有何独特之处&…

速度位置规划实现精确定位的问题

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

npm install 的原理

1. 执行命令发生了什么 &#xff1f; 执行命令后&#xff0c;会将安装相关的依赖&#xff0c;依赖会存放在根目录的node_modules下&#xff0c;默认采用扁平化的方式安装&#xff0c;排序规则为&#xff1a;bin文件夹为第一个&#xff0c;然后是开头系列的文件夹&#xff0c;后…

汇聚荣科技有限公司实力怎么样?

汇聚荣科技有限公司&#xff0c;一家专注于高新技术研发和应用的企业&#xff0c;在业界享有一定的声誉。那么&#xff0c;这家公司的实力究竟如何?我们将从公司概况、技术研发、市场表现、企业文化和未来展望五个方面进行详细探讨。 一、公司概况 汇聚荣科技有限公司经过多年…