B+树Java代码实现以及测试
摘要:M阶B+树的定义: B+树是对B树的一种变形树,它与B树的差异在于: 有k个子结点的结点必然有k个关键码; 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。 如下图,是一个B+树: 下图是B+树的插入动画: 代码如下:
阅读全文
posted @
2019-10-26 04:28
kosamino
阅读(3182)
推荐(2) 编辑
TreeMap核心源码实现解析
摘要:TreeMap实现了SotredMap接口,它是有序的集合。而且是一个红黑树结构,每个key-value都作为一个红黑树的节点。如果在调用TreeMap的构造函数时没有指定比较器,则根据key执行自然排序,如果指定了比较器则按照比较器来进行排序。 一、数据结构 1、继承关系 2、实现接口 3、基本属
阅读全文
posted @
2019-10-25 04:57
kosamino
阅读(666)
推荐(0) 编辑
B树Java代码实现以及测试
摘要:B树定义 B 树又叫平衡多路查找树。一棵m阶的B 树 (m叉树)的特性如下: 根节点至少有两个孩子 每个非根节点至少有M/2(上取整)个孩子,至多有M个孩子。 每个非根节点至少有M/2-1(上取整)个关键字,至多有M-1个关键字。并以升序排列。 key[i]和key[i+1]之间的孩子节点的值介于k
阅读全文
posted @
2019-10-25 04:07
kosamino
阅读(3086)
推荐(1) 编辑
二叉树BinaryTree构建测试(无序)
摘要:此测试仅用于二叉树基本的性质测试,不包含插入、删除测试(此类一般属于有序树基本操作)。
阅读全文
posted @
2019-10-24 18:22
kosamino
阅读(470)
推荐(0) 编辑
HashMap、HashTable差异详解
摘要:HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。 代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 10.0.1。 1. 时间 HashTable产生于JDK
阅读全文
posted @
2019-10-24 13:00
kosamino
阅读(519)
推荐(0) 编辑
TreeMap源码实现类中文全解析
摘要:/** * 基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序, * 或者根据创建映射时提供的Comparator 进行排序,具体取决于使用的构造方法。 * * 此实现为 containsKey、get、put 和 remove 操作提供受保证的 log(n) 时间开销。 * 这些算法是 Cormen、Leiserson和 Rivest
阅读全文
posted @
2019-10-24 12:16
kosamino
阅读(379)
推荐(0) 编辑
ConcurrentHashMap底层实现原理(JDK1.8)源码分析
摘要:ConcurrentHashMap数据结构 ConcurrentHashMap相比HashMap而言,是多线程安全的,其底层数据与HashMap的数据结构相同,数据结构如下: 说明:ConcurrentHashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树是为了
阅读全文
posted @
2019-08-10 03:03
kosamino
阅读(715)
推荐(0) 编辑
HashMap和ConcurrentHashMap实现原理及源码分析
摘要:HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对
阅读全文
posted @
2019-08-10 02:39
kosamino
阅读(2497)
推荐(2) 编辑
CopyOnWriteArrayList实现原理及源码分析
摘要:CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器",Java并发包中类似的容器还有CopyOnWriteSet。本文会对C
阅读全文
posted @
2019-08-09 09:28
kosamino
阅读(396)
推荐(0) 编辑
HashMap闭环(死循环)的详细原因(转)
摘要:为何出现死循环简要说明 HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行HashMap.get时进入死循环,将CPU的消耗到100%。 HashMap采用链表解决Hash冲突。因为是链表结构,那么就很容易形成闭合的链路,这样在循环的时候只要有线程对这个HashMap进行
阅读全文
posted @
2019-08-08 09:16
kosamino
阅读(7708)
推荐(2) 编辑
Vector、HashTable线程不安全示例
摘要:下面这样写法是Vector线程不安全的写法: 尽管Vector get()、remove()、get() 方法是I同步的 但运行上面程序会出现以下错误: HashTable线程不安全写法: 会出现很多null值,但不错,因为没有那个key ,但不会报错 在多线程环境中,如果不在方法调用端做额外的同步
阅读全文
posted @
2019-08-06 00:07
kosamino
阅读(353)
推荐(0) 编辑
红黑树原理图示详解(转)
摘要:一.为什么要有红黑树这种数据结构? 我们知道ALV树是一种严格按照定义来实现的平衡二叉查找树,所以它查找的效率非常稳定,为O(log n),由于其严格按照左右子树高度差不大于1的规则,插入和删除操作中需要大量且复杂的操作来保持ALV树的平衡(左旋和右旋),因此ALV树适用于大量查询,少量插入和删除的
阅读全文
posted @
2019-08-05 03:04
kosamino
阅读(2007)
推荐(0) 编辑
B树与B+详解
摘要:一、前言 动态查找树主要包括:二叉查找树,平衡二叉树,红黑树,B树,B-树,查找的时间复杂度就为O(log2N),通过对数就可以发现降低树的深度就会提高查找效率。在大数据存储过程,大量的数据会存储到外存磁盘,外存磁盘中读取与写入某数据的时候,首先定位到磁盘中的某一块,这就有个问题:如何才能有效的查找
阅读全文
posted @
2019-08-04 18:38
kosamino
阅读(556)
推荐(0) 编辑
Java并发编程之并发容器
摘要:解决并发情况下的容器线程安全问题的。给多线程环境准备一个线程安全的容器对象。 线程安全的容器对象: Vector, Hashtable。线程安全容器对象,都是使用 synchronized 方法实现的。 concurrent 包中的同步容器,大多数是使用系统底层技术实现的线程安全。类似 native
阅读全文
posted @
2019-04-19 01:22
kosamino
阅读(861)
推荐(0) 编辑
HashTable和HashMap的区别详解(转)
摘要:一、HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHash
阅读全文
posted @
2019-04-18 11:29
kosamino
阅读(391)
推荐(0) 编辑
HashMap、Hashtable、ConcurrentHashMap的原理与区别(简述)
摘要:HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 初始size为11,扩容:newsize = olesize*2+1 计算index的方法:
阅读全文
posted @
2019-04-17 20:58
kosamino
阅读(462)
推荐(0) 编辑
遍历Map的四种方法
摘要:Map的遍历有四种方法,以下面这个Map为例:
阅读全文
posted @
2017-11-14 20:11
kosamino
阅读(308)
推荐(0) 编辑
Collections.shuffle()源码分析
摘要:Java.util.Collections类下有一个静态的shuffle()方法,如下: 1)static void shuffle(List<?> list) 使用默认随机源对列表进行置换,所有置换发生的可能性都是大致相等的。 2)static void shuffle(List<?> list,
阅读全文
posted @
2017-06-21 23:14
kosamino
阅读(3626)
推荐(0) 编辑
java集合继承关系图
摘要:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象。 集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同
阅读全文
posted @
2017-06-21 01:24
kosamino
阅读(58509)
推荐(13) 编辑
ArrayList和LinkedList的区别
摘要:ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。 LinkedList使用了循环双向链表数据结构。与基于数组ArrayList相比,这是两种截然不同的实现技术,这也决定了它
阅读全文
posted @
2017-06-21 00:14
kosamino
阅读(685)
推荐(0) 编辑