• Map集合(TreeMap)的使用


    Map集合

    Map概念:

    特点:无序,键值对,键不能重复,值可以重复,

    键重复则覆盖,没有继承Collection接口

    扩容:初始容量16,负载因子0.75,扩容增量1倍

    遍历:
    先获取所有键的Set集合,再遍历(通过键获取值)
    取出保存所有Entry的Set,再遍历此Set即可

    HashMap概念:

    **特点:**线程不安全,最常用,速度快

    内部采用数组来存放数据
    在这里插入图片描述

    基本原理
    put执行过程&HashMap的实现
    package com.binbin.jaEE;
    
    import java.util.HashMap;
    import java.util.Iterator;
    
    import org.junit.Before;
    import org.junit.Test;
    
    public class JaEE03 {
         
    	  private HashMap< Integer , Object> map=new HashMap<Integer, Object>();
    	@Before
    	 public void Hashmap() {
    	   map.put(1, "李四");
    	   map.put(1, "张三");
    	   map.put(2, "老六");
    	   map.put(4, "老刘");
    	   map.put(3, "乔乔");
    	 }
    	 @Test
    	public void Test() {
    		Iterator<Integer> it = map.keySet().iterator();
    		  while(it.hasNext()) {
    			  int key=it.next();
    			  System.out.println(key);//测试输出
    		  }
    	}
    	 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    ⭐堆内存

    1.8jkd之前的红黑树示意图

    在这里插入图片描述

    流程图中绿色标出的部分为JDK8新增的处理逻辑,目的是在Table[i]中的Node节点数量大于8时,通过红黑树提升查找速度。

    Table数组中的的Node

    ⭐1.8jdk之后红黑树结构示意图

    在这里插入图片描述

    ⭐红黑树理解解析

    这是一个简单的红黑树 的理解很简单 (其实它的逻辑就是 往第一个数据 开始 比它大 就往 (右排)比它小就往(左排))所以当我们 再利用它找数据的时候 就会很快

    比如:我们要找 那个 “21” 它比"8"大 所以它就往右边找 只需要三步就可以找到

    在这里插入图片描述

    ⭐⭐这是红黑树的 编辑官网Red/Black Tree Visualization (usfca.edu)

    HashTable
    线程安全,不太常用

    HashTable的实现

     @Test
    	 public void Test02() {
    		 Map<Integer, Object>table=new Hashtable<Integer, Object>();
    		 table.put(1, "李四");
    		 table.put(1, "张三");
    		 table.put(2, "老六");
    		 table.put(4, "老刘");
    		 table.put(3, "乔乔");
    		 Iterator<Integer> it = table.keySet().iterator();
    		 while(it.hasNext()) {
    			 int key=it.next();
    			 System.out.println(key);
    		 }
    	 }
    //此方法也携带 (去重效果)但是输出结果以 升序的方式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出结果

    在这里插入图片描述

    TreeMap
    特性:

    ​ key值按一定的顺序排序

    ​ 添加或获取元素时性能较HashMap, 因为需求维护内部的红黑树,用于保证key值的顺序

    实现方式:
    	 @Test
      public void Test03() {
          //new Comparator  在括号里 new 一个这个 就是 比较器  可以用来排序
    	  TreeMap<Integer, Object>Treemap=new TreeMap<Integer, Object>(new Comparator<Integer>() {
    		@Override
    		public int compare(Integer o1, Integer o2) {
    			// TODO Auto-generated method stub
    			return o1-o2;//这里是设定一个升序的方法
    		}
    	
    	  });
    	  Treemap.put(1, "李四");
    	  Treemap.put(1, "张三");
    	  Treemap.put(2, "老六");
    	  Treemap.put(4, "老刘");
    	  Treemap.put(3, "乔乔");
    	Iterator<Integer> it = Treemap.keySet().iterator();
    	while(it.hasNext()) {
    		int ket=it.next();
    		System.out.println(Treemap.get(it));
    	}
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    排序方法:
    • Comparator (java.lang.Comparable)
    • Comparable (java.util.Comparator)
    LinkedHashMap
    • ​ 继承HashMap ,LinkedHashMap是有序的,且默认为插入顺序。当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了
    实现方法:
     Map<String, String> linkedHashMap = new LinkedHashMap<>();
    
            linkedHashMap.put("name1", "josan1");
    
            linkedHashMap.put("name2", "josan2");
    
            linkedHashMap.put("name3", "josan3");
    
            Set<Entry<String, String>> set = linkedHashMap.entrySet();
    
            Iterator<Entry<String, String>> iterator = set.iterator();
    
            while(iterator.hasNext()) {
                Entry entry = iterator.next();
               String key = (String) entry.getKey();
    
                String value = (String) entry.getValue();
    
                System.out.println("key:" + key + ",value:" + value);
    
           }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    Linux中sudo命令的添加和操作
    SSM-spring注解式缓存redis
    Jenkins安装多个jdk版本,并在项目中选择对应jdk版本
    JS中字体文件的加载和使用
    idea mybatis-plus之MybatisX插件小知识(代码生成 哦)
    大模型必备算力:CPU&GPU天梯图(2023年最新版)
    四旋翼飞行器基本模型(Matlab&Simulink)
    【Flutter小记5】Isolate && ffi && Method Channel 使用简介与总结
    MC20CB-04-TTS 四频段GSM/GPRS/GNSS MC20模块 应用
    NodeJs - for循环的几种遍历方式
  • 原文地址:https://blog.csdn.net/qq_63130170/article/details/125516565