红黑树

JDK7与JDK8中HashMap的实现

天大地大妈咪最大 提交于 2020-02-29 02:59:33
JDK7中的HashMap HashMap底层维护一个数组,数组中的每一项都是一个Entry transient Entry<K,V>[] table; 我们向 HashMap 中所放置的对象实际上是存储在该数组当中; 而Map中的key,value则以Entry的形式存放在数组中 static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; int hash; 而这个Entry应该放在数组的哪一个位置上(这个位置通常称为位桶或者hash桶,即hash值相同的Entry会放在同一位置,用链表相连),是通过key的hashCode来计算的。 final int hash(Object k) { int h = 0; h ^= k.hashCode(); h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } 通过hash计算出来的值将会使用indexFor方法找到它应该所在的table下标: static int indexFor(int h, int length) { return h & (length-1); } 这个方法其实相当于对table.length取模。 当两个key通过

hashMap与concurrentHashMap

杀马特。学长 韩版系。学妹 提交于 2020-02-28 12:22:30
一 功能简介 hashMap与concurrentHashMap 都属于集合,用于存储键值对数据,它两最明显的区别是,hashMap是非线程安全的,concurrentHashMap是线程安全的, concunrrentHashMap还有另外的称呼,如 并发容器 概述 HashMap jdk 1.7 实现方式:底层 数组+链表 jdk 1.8 实现方式:底层 数组+链表+红黑树 初始大小:16 负载因子:0.75 扩容:newSize = oldSize*2; map中元素总数超过Entry数组的75%,触发扩容操作 存放键值对要求:key 和 value 都允许为null,这种key只能有1个 线程安全性:不安全 父类:AbstractMap ConcurrentHashMap jdk 1.7 实现方式:底层 segment数组 + hashEntry数组+链表 segment 数组初始化:在申明 ConcurrentHashMap对象的时候 jdk 1.8 实现方式:底层 node数组+链表+红黑树 node数组初始化:put()第一个元素的时候 默认初始大小 16 负载因子:0.75 线程安全 父类 AbstractMap 二 实现逻辑 2.1 hashMap的内部实现逻辑 JDK1.7 hashmap 里面是一个数组,数组中每个元素是一个Entry类型的实例

HashMap?

…衆ロ難τιáo~ 提交于 2020-02-27 19:08:42
HashMap数据结构是什么? JDK1.7 HashMap由数组+链表组成的,JDK1.8 HashMap由数组+链表+红黑树组成的 数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。 =============================================================================== key-value是通过什么方式存储进去的? key使用set集合来存储的,value使用collection来存储的。 =============================================================================== 解释hashcode、取余、去重等操作? 计算hashcode的值: //这是一个神奇的函数,用了很多的异或,移位等运算

死磕 java集合之TreeMap源码分析(四)-内含彩蛋

流过昼夜 提交于 2020-02-27 08:42:19
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。 二叉树的遍历 我们知道二叉查找树的遍历有前序遍历、中序遍历、后序遍历。 (1)前序遍历,先遍历我,再遍历我的左子节点,最后遍历我的右子节点; (2)中序遍历,先遍历我的左子节点,再遍历我,最后遍历我的右子节点; (3)后序遍历,先遍历我的左子节点,再遍历我的右子节点,最后遍历我; 这里的前中后都是以“我”的顺序为准的,我在前就是前序遍历,我在中就是中序遍历,我在后就是后序遍历。 下面让我们看看经典的中序遍历是怎么实现的: public class TreeMapTest { public static void main(String[] args) { // 构建一颗10个元素的树 TreeNode<Integer> node = new TreeNode<>(1, null).insert(2) .insert(6).insert(3).insert(5).insert(9) .insert(7).insert(8).insert(4).insert(10); // 中序遍历,打印结果为1到10的顺序 node.root().inOrderTraverse(); } } /** * 树节点,假设不存在重复元素 * @param <T> */ class TreeNode<T extends

epoll 接口以及原理说明

我与影子孤独终老i 提交于 2020-02-27 07:09:01
实例代码 : https://github.com/xuchanglong/NtyTCP-v1.0.0-comments 主要接口 int epoll_create(int size) 创建 epoll 对象,同时创建一个空的 红黑树 以及空的 双向链表 ,返回 epoll 对象的文件描述符。 int epoll_ctl(int epid, int op, int sockid, struct epoll_event *event); 向 epoll 对象里面的红黑树中增加、删除、修改指定的节点。 int epoll_wait(int epid, struct epoll_event *events, int maxevents, int timeout); 等待双向链表中是否有节点,若有节点则取得不大于 maxevents 数量的节点并放入 events 中,最后返回。 int epoll_event_callback(struct eventpoll *ep, int sockid, uint32_t event) 有 显卡驱动 调用,判断当前事件(建立连接、断开连接、读写数据)对应的 socket 是否已经在红黑树中挂号,如果是,则将新的事件保存到对应的红黑树节点中并更新到双向链表中。 原理说明 1、上文在说明函数功能时提到了两个 epoll 核心结构: 红黑树 和 双向链表

数据结构:小结(红黑树)

社会主义新天地 提交于 2020-02-26 15:35:30
1、栈: 先进后出 2、队列: 先进先出 3、数组: 查询快 :数组地址连续,可通过数组的首地址找到数组,通过数组的索引查找某一个元素 增删慢 :数组长度固定,要增加或删除一个元素必须新创建一个数组,将原数组数据复制过来 4、链表: 链表中的每一个元素称为一个节点,一个节点包含了一个数据源(存储数组),两个指针域(存储自己的地址,存储下一个节点的地址) 查询慢 :链表中地址不连续。每次查询元素,都必须从头开始查询 增删快 :链表结构增加或删除一个元素,对整体结构没有影响 单向链表 :链表中只有一条链子,不能保证元素的顺序(存储元素和取出元素的顺序可能不一致) 双线链表 :链表中有两条链子,有一条链子是专门记录元素的顺序,是一个有序的集合。 5、红黑树 二叉树 :分支不超过两个:左孩子也叫左子树,右孩子也叫右子树 排序树(查找树) :在二叉树的基础上,元素有大小顺序,左子树小,右子树大 平衡树 :左孩子数量 = 右孩子数量 平衡树 :左孩子数量不等于右孩子数量 红黑树 特点 :趋近于平衡树,查询叶子节点最大次数和最小次数不能超过2倍 查询速度非常快! 约束: 节点可以是红色或者黑色的 根节点是黑色的 叶子节点(空节点)是黑色的 每个红色节点的子节点都是黑色的 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同 来源: CSDN 作者: 有朝一日刀在手 链接: https:/

宅在家的这几天,突然收到(余额宝)视频面试,四面成功拿下offer

↘锁芯ラ 提交于 2020-02-26 02:46:39
关于疫情: 进入主题之前,开篇先闲谈几句,这次的面试来得意外,主要也是因为疫情的缘故,所以心里上是没有准备的,这次肺炎对我们的学习、工作和生活都造成了非常大的影响,很多学校延期开学,企业也延期返工,实际上在闭关的这段时间里,我们正好可以好好利用这段时间,为自己之后想要做得事情充分做好准备,也希望肺炎赶快过去,我们的生活恢复正常。 以下主要分享面经和个人学习方法,会包括很多PDF文档,如面试题库(含答案+解析)、学习笔记、实战文档和脑图等等,均可以免费分享,原文链接: https://www.toutiao.com/i6794422659032547847/ 由于疫情缘故,与阿里的HR沟通过后,采取的是视频面的方式,总共4轮均是通过视频的方式。视频面相比于现场面给人的感觉还是要稍微轻松一些的,过程没有那么紧张,交流方式也比较自然,没有太大的压迫感,只要技术ok,基本上是没什么问题,以致于这次面试顺利通过。 余额宝一面 自我介绍 项目介绍(项目中最大的技术挑战和技术难点) JVM 内存分哪几个区,每个区的作用是什么?JVM有哪些回收算法,对应的收集器有哪些? GC 的两种判定方法 ?CMS 收集器与 G1 收集器的特点。 Java容器有哪些?哪些是同步容器,哪些是并发容器? ArrayList和LinkedList的插入和访问的时间复杂度? HashMap检测到hash冲突后

面试过蚂蚁金服,我知道的这些套路,JavaP7岗

人走茶凉 提交于 2020-02-26 01:29:42
蚂蚁花呗一面(一个小时): Java容器有哪些?哪些是同步容器,哪些是并发容器? ArrayList和LinkedList的插入和访问的时间复杂度? java反射原理, 注解原理? 新生代分为几个区?使用什么算法进行垃圾回收?为什么使用这个算法? HashMap在什么情况下会扩容,或者有哪些操作会导致扩容? HashMap push方法的执行过程? HashMap检测到hash冲突后,将元素插入在链表的末尾还是开头? 1.8还采用了红黑树,讲讲红黑树的特性,为什么人家一定要用红黑树而不是AVL、B树之类的? https和http区别,有没有用过其他安全传输手段? 线程池的工作原理,几个重要参数,然后给了具体几个参数分析线程池会怎么做,最后问阻塞队列的作用是什么? linux怎么查看系统负载情况? 请详细描述springmvc处理请求全流程? spring 一个bean装配的过程? 讲一讲AtomicInteger,为什么要用CAS而不是synchronized? 蚂蚁花呗二面 查询中哪些情况不会使用索引? 数据库索引,底层是怎样实现的,为什么要用B树索引? Mysql主从同步的实现原理? MySQL是怎么用B+树? 谈谈数据库乐观锁与悲观锁? 有使用过哪些NoSQL数据库?MongoDB和Redis适用哪些场景? 描述分布式事务之TCC服务设计?

21.javase-javaAPI-集合之map集合

情到浓时终转凉″ 提交于 2020-02-26 00:31:33
Map map是一种key,value结构,key是键,value是值,也就是键值对结构. 这是Map的继承体系 HashMap(数组+链表+红黑树) 特点: 1.键值对,<key,value>结构 2.key值是根据键的hash值计算的,并且键是唯一的. 3.value是任意类型的. 4.底层是数组加链表的形式.当key’的hash值相同时,发生hash碰撞,再用equals()方法判断是否相同,如果相同则覆盖,如果不同则生成链表.当链表长度大于8时,链表变成红黑树. 5.hashMap为线程不安全的数据结构.如果多线程可能造成hash碰撞时链表中的两个节点互相指定.形成循环链. jdk1.7时hashMap的实现 大方向上,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。上图中,每个绿色的实体是嵌套类 Entry 的实例,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next。 capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。 loadFactor:负载因子,默认为 0.75。 threshold:扩容的阈值,等于 capacity * loadFactor jdk1.8时hashMap的实现 最大的不同就是利用了红黑树,所以其由 数组+链表+红黑 树 组成。 根据 Java7

【数据结构】红黑树详解(插入与删除)

会有一股神秘感。 提交于 2020-02-25 21:58:38
目录 1.红黑树简介 2.红黑树的性质 3.红黑树操作 3.1 旋转操作 3.2 插入 3.2.1 情况一 3.2.2 情况二 3.2.3 情况三 3.2.4 情况四 3.2.5 情况五 3.2.6 插入总结 3.3 删除 3.3.1 情况一 3.3.2 情况二 3.3.2 情况三 3.3.4 情况四 3.3.5 情况五 3.3.6 情况六 3.3.7 删除总结 4.总结 1. 红黑树简介 红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为 对称二叉 B 树(symmetric binary B-trees) 。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的 红黑树 。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业界应用很广泛,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基于红黑树结构实现的。考虑到红黑树是一种被广泛应用的数据结构,所以我们很有必要去弄懂它。 2. 红黑树的性质 学过二叉查找树的同学都知道,普通的二叉查找树在极端情况下可退化成链表,此时的增删查效率都会比较低下。为了避免这种情况,就出现了一些自平衡的查找树,比如 AVL,红黑树等