集合之Map(一)

今天接着看看源码,Map是一个抽象接口,和昨天的Set很像。

常见接口:

size(),isEmpty(),containsKey(有个s),containsValue(s),V get(Object key)(根据key获取value),V put(K key,V value);(传入值),V remove(Object key)根据key删除,如果map包含null,那么如果没找到,则会抛出UnsupportedOperation。

经常遇见的是Hashmap和ConcurrentHashMap区别

特性

HashMap

ConcurrentHashMap

线程安全性

非线程安全

线程安全

性能

适用于单线程,高并发时出问题

适用于高并发环境

数据结构

数组 + 链表(JDK 1.8 后加红黑树)

数组 + 链表 + 红黑树

加锁机制

无锁

JDK 1.7: 分段锁,JDK 1.8: CAS + synchronized

读取效率

读取快,但线程不安全

读取快,并发读取无锁

写入效率

并发写入会导致数据异常

并发写入局部加锁,性能优越

适用场景

单线程应用,非高并发环境

高并发环境,如缓存、计数器

唉,看别人博客学习破防了,他们写的太好了,我写不下去了,给一些看博客的建议吧。

走进HashMap的源码世界

:这个看源码看的很仔细,也有注释,我不用手打了,特别好,主要看了一下put方法,resize方法,然后就因为源码看tree去了。

红黑树、B树、B+树各自适用的场景

:红黑树更适合内存存储,B 树更适合键值对存储,B+ 树适合范围查询;根据这个去看实现感觉比较好。同时里面“B+树所有的Data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。在数据库中基于范围的查询是非常频繁的,而B树不支持这样的遍历操作。”解决了我之前面试被问到不会的问题。然后在节点大小差不多的情况下,树的高度严重影响了磁盘IO次数,所以数据量大的时候一个二叉树的查询效率是比不过多节点树的。但我也有点搞懂里面说的内存了,一般服务器的内存都是几百G,更别说分布式了。所以那种存个几亿条消息还是很有可能在内存中的。同时红黑树的增删改也很快,B+主要用来读取,同时内存需要持久化才可以,不然内存断点就失去。基本用内存和硬盘混用来存储数据现在。

同时问AI完善了一些树的概念,比较散,后面看有没有时间整理:

本来打算看HashMap和concurrentHashMap的具体实现的

一:HashMap的底层确实是一个数组,其核心结构为数组 + 链表/红黑树
数组类型
  Node[] tab是HashMap的底层存储数组,tab里面每个元素称为桶(Bucket)
  数组类型为Node,用于存储键值对节点的对象。
  Node类包含四个属性:hash(哈希值)、key(键)、value(值)、next(指向下一个节点的指针)。
  数组的初始化与传值
  初始化时机:在首次插入数据时,通过resize()方法创建数组(如构造方法未显式初始化则默认容量为16)。
  传值方式:数组是HashMap的成员变量table,putVal方法中通过tab = table直接引用内部数组,无需外部传参。同时当多个键映射到同一个桶的时候,冲突的键值对用后面的链表/红黑树存储。(用node里面的next指向冲突节点)

你可能感兴趣的:(java,spring,开发语言)