java 集合④

Map集合

  • 集合的两大体系:Collection,Map
    • Conllection:List,set
  • Map存储元素是有一个KV键值对,比如说:
    • 身份证号--------->身份信息
    • 电话薄(姓名)------------>电话号码
  • Map位于java.util包下,接口,常用子类:HashMap(线程不安全的),HashTable(线程安全的),Properties(配置文件)

Map的特点

  1. kv键值对中,key的值唯一,value的值可以相同
  2. 每次添加元素都是先判断key的值,不存在直接添加,存在,key不变,覆盖value 的值
  3. Map中,key可以是任意对象,因为底层源码使用的Object的对象
  4. key的值可以为空,但也只能有一个,再多一个空,视为同一个覆盖value
  5. value可以多个为空
  6. map中的key可以理解为是set集合

HashMap 常用的类

作用: 存储的key-value对

创建:
构造方法:
在这里插入图片描述

常量方法: 增删改查, 集合: 容器

请添加图片描述

put(key,value) 添加元素: 修改value

新元素的key在Map集合中存在, map替换value , 如果key不存在, 添加

请添加图片描述

value remove(key) 根据key删除key-value 对

请添加图片描述

clear() 清空map

请添加图片描述

value get(key) 根据key获取value

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

Entry: key-value 封装成一个对象, Entry(1.7 这个key-value对类: Entry, 1.8 这个key-value对类: Node )

请添加图片描述

请添加图片描述

HashMap原理

  • 存储数据结构:哈希表–>hash算法

  • 请添加图片描述

  • HashMap底层村塾数据的结构是:jdk1.7之前是数组+链表;但是随着需求的不断增加使用链表的查询效率太低了,所以在jdk1.8之后使用数组+链表+红黑树。当一条链表的长度大于8且整个集合的容量大于64时,这条链表将转换为红黑树。

  • 链表的结构

    Node[] table;
    Node{
        key;//存储key值
        value;//存储value值
        Node next;//用来指向下一个元素
        Node pre;//如果是双向链表,用来指向前一个元素
    }
    //所以LinkList的查询查询效率比较低,需要一个一个的遍历查询,但是删除,插入等操作比ArrayList集合要快,他们两个可以应对不同的需求。
    
  • 将链表换成红黑树,主要是链表的查询时间复杂度为O(n)(有多少个就差多少次)

  • 红黑树的时间复杂度logn/log2

HashMap中put()方法添加元素的原理:

  1. put方法是根据元素的hash值来判断元素是否被添加过,然后进行相应的操作。
  2. 添加元素首先调用putVal(),判断是否是第一次添加,如果是第一次添加,那么集合将用resize()进行初始化,给定初始容量
  3. 根据添加元素的hash值,来找到应该存储在数据的那个位置:
    • 如果这个位置为null,所以这个key是唯一的,可以直接添加
    • 如果不为null,但是该位置的key与新增的一样,则覆盖value的值
    • 同上,如果key不一样,然后便遍历后面的key,从中找到一样的key,并覆盖value
    • 同上,如果遍历完整个链表都没有相同,则把这个键值对加到链表的最后。
  4. 添加完对象后,如果链表的长度为8,并且集合的容量大于等于64,则此链表将转会为红黑树。
存储原理:
  • 它的底层调用K的hashCode()方法得出hash值。
  • 通过哈希表函数/哈希算法,将hash值转换成数据的下标。(int一共有32位,而hash算法,就是就这个值右移16位,然后进行异或处理,就相当于,上16位与下16位进行异或,而上16位大多数为0,这么做的目的,是为了发散hash值,这样不至于获得的数据扎堆)
  • 下标位置上如果没有任何元素,就新创建一个Node节点,并添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。
读取原理:
  • 首先调用key的hashCode()方法得到hash值,并通过哈希算法转化为数组的下标。
  • 通过下标,快速的在数组上寻找k,如果没找到则返回null,如果位置上有单向链表,那么他就会拿这个与链表上的key进行比较,如果返回true,那么此节点的value便是想要找到的值,get方法获取这个值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值