数据结构

本文介绍了二叉排序树、平衡的AVL树、红黑树以及B树和B+树的基础概念。重点讨论了HashMap、LinkedHashMap和ConcurrentHashMap在Java中的实现,包括它们的特点、线程安全性和哈希策略。同时提到了LRU元素过期机制在LinkedHashMap中的应用。
摘要由CSDN通过智能技术生成
二叉树基础

二叉排序树BST:左子树 < 根节点 < 右子树

平衡二叉树AVL:在BST基础上有自己的插入fixup、删除fixup方法,左右子树严格平衡,高度差不超过1

红黑树:在BST基础上有自己的插入fixup、删除fixup方法,左右子树不严格平衡,根节点黑色,任意相邻结点不能是红色

红黑树.png

B树:一个节点可以有多个关键字且可以有多个孩子的树。每一个元素在该树中只出现一次

image.png

B+树:在B树的基础上把叶子结点连起来,因此通过根指针和链表指针能够实现范围查询。叶结点包含了全部关键字,非叶结点中的关键字也会出现在叶结点中。

image.png

HashMap

HashMap存储结构.png

  • HashMap采用数组+链表/红黑树(注: 红黑树能够保证平衡的二叉查找树)

  • HashMapLinkedHashMap是线程不安全的,ConcurrentHashMap是线程安全的

  • HashMap的key为对象时,必须重写对象的hashcode()和equals()方式,因为判断对象是否重复时,先判断hashcode()

  • 默认的hashcode方法返回的是对象的内存地址经过哈希算法转换后的一个整数,两个不同的对象hashcode也可能相同

  • @EqualsAndHashCode(callSuper = false):默认只使用本类的非静态属性生成 equals/hashcode方法,callSuper = true,将使用父类中的属性和本类中的属性 生成equals/hashcode方法

  • 当HashMap中元素个数超过 数组大小*loadFactor 时就会扩容。默认数组大小Capacity为16,每次扩容就把数组大小扩大一倍;loadFactor为负载因子,默认为0.75,负载因子的大小决定了HashMap的数据密度

    当HashMap中一个链的对象个数达到8个,并且数组容量capacity达到64,这个链表就会用红黑树表示,如果没有达到64就先扩容解决。如果树中结点个数低于6个,树就会转换为链表

LinkedHashMap

1.png

  • LinkedHashMap采用的是数组+链表/红黑树+循环双向链表,HahMap中的元素是无序的,LinkedHashMap的元素是有序的,默认最先插入的元素被添加到尾部,LinkedHashMapHashMap都是线程不安全的

  • LinkedHashMap有一个accessOrder属性,可以在new LinkedHashMap的时候传进去. accessOrder默认为false,表示访问元素不会改变其在双向链表中的顺序;如果accessOrder为true,则访问元素的时候 (即get一个元素的时候),会把该元素移动到双向链表的末尾,也就是说为true时,经常访问的元素会被放在链表尾部,不经常访问的元素放在头部

  • 当有新元素加入Map的时候会调用removeEldestEntry方法删除头部最老的元素,默认的情况下removeEldestEntry方法只返回false表示永远不删除旧元素,这就是实现LRU元素过期机制的地方

ConcurrentHashMap

jdk1.8采用 Node数组+链表/红黑树,和HashMap结构相同,synchronized 只锁定当前链表或红黑树的首节点,这样只要 hash 不冲突,就不会阻塞

HashMap存储结构.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值