数据结构
文章平均质量分 95
归海一刀之渔舟唱晚
这个作者很懒,什么都没留下…
展开
-
Map中的hash()
你知道HashMap中hash方法的具体实现吗?你知道HashTable、ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8中hash方法实现的不同以及区别吗?如果你不能很好的回答这些问题,那么你需要好好看看这篇文章。文中涉及到大量代码和计算机底层原理知识。绝对的干货满满。整个互联网,把hash()分析的如此透彻的,别无二...转载 2018-03-13 10:35:20 · 5846 阅读 · 2 评论 -
java排序---快速排序
一.简介 在排序算法中,快速排序算是里面的佼佼者。它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。这里提到了分割成两部分,使我们想到了分而治之的思想,其实就是让另外两部分分别去实现之前的排序而已。因为要找出关键字,用关键字来分割两部分,所以最好的情...原创 2018-04-27 01:30:58 · 340 阅读 · 2 评论 -
一个队列如何找出倒数第k个值
问题:一个队列如何找出倒数第k个值?解:第一种:如果这个队列是一个单项指针的队列,里面的结构如下 这样的话,可以建两个指针,一个循环到底的时候,控制两次指针相差k个元素,一个指针指向队列尾,另一个指针指向队列倒数第k个元素。第二种:如果这个队列是一个单项指针的队列,里面的结构如下 ...原创 2018-04-19 13:14:30 · 1171 阅读 · 0 评论 -
源码解读--LinkedBlockingDeque讲解
在上一遍线程池的讲解中,如果线程的大小大于核心线程的大小,就会放到缓冲队列里面,这个队列就是LinkedBlockingDeque。下面就来深入讲解一下这个队列。java源码系列。一.LinkedBlockingDequ的定义首先看下图谱它是一个队列,而且还是阻塞式的,还可以告诉你,它是线程安全的。LinkedBlockingDeque用的是一个双向的链表,Node的声明如下:static ...原创 2018-04-19 12:50:26 · 806 阅读 · 0 评论 -
源码解读--LinkedList
一.序言在上一篇队列中,只讲解了基本原理,今天就来聊聊队列的一个实现,也是面试中经常和ArrayList对比的一个类--LinkedList。java源码系列。他们的不同点:1.实现结构不同。ArrayList 是基于数组的list。LinkedList是基于链表的list。2.初始容量不同。ArrayList初始容量是10,之后按1.5倍扩容。LinkedList没有初始容量一说。3.访问方式。...原创 2018-04-05 23:32:28 · 268 阅读 · 0 评论 -
源码解读--Queue
上一篇讲了栈,这一篇来简单讲讲队列,这java中,队列比栈啰嗦一点,queue被设计成了一个接口,它分为阻塞式和非阻塞式。阻塞队列与非阻塞队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直...原创 2018-04-04 23:23:47 · 248 阅读 · 0 评论 -
源码解读--HashMap(jdk8)
一.基础知识之前写过一篇jdk7版的HashMap,今天在此基础上面讲讲jdk8中的HashMap。先来看看他们的不同。java源码系列。1.jdk7中,扩容插入使用的是前插法,jdk8中使用的是尾插法。2.jdk7中使用的是数组+链表的数据结构,查找时间复杂度取决于链表的长度为 O(n)。jdk8中使用的是数组+链表+红黑树(链表的个数大于8的时候,扩展为红黑树)的数据结构,将查找的...原创 2018-04-10 20:19:27 · 450 阅读 · 0 评论 -
两个队列实现栈,两个栈实现队列详细解析
栈和队列是两种常用的数据结构,他们的地城实现基本也就两种:数组和链表。数组是是将元素在内存中连续存放,链表是用指针来索引数据。具体请自行google,不是要讲的重点。第一个问题:栈是一种先进后出的数据结构,如何用两个队列来实现栈的功能呢? 要先符合栈的先进后出(后进先出),用一个队列是不行的,必需数量大于1。主要思想如下: 假设有个一串数字a,b,c,d顺序入栈,出来的结果应该是...原创 2018-04-02 13:22:24 · 7554 阅读 · 0 评论 -
理解B树
为什么要B树磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行...转载 2018-04-09 09:41:16 · 243 阅读 · 0 评论 -
理解红黑树
介绍红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完成查找的数据结构。这个时候,红黑树站了出来。 阅读以下需要了解普通二叉树的插入以及删除操作。 红黑树是在普通二叉树上,对没个节点添加一个颜色属性形成的,同时整个红黑二叉树需要同时满足一下...转载 2018-04-08 23:17:17 · 180 阅读 · 0 评论 -
源码解读--HashSet
一.序言 先说一下HashSet的特性:添加的是对象;值不会重复;内部实现用的是HashMap。java源码系列。老套路,看看图谱,看它是何方神圣。简单的来说,好像没发现什么,就是Set集合而已。二.源码精简一点,和之前一样,只讲解一两个增删查的方法,更深的需要同学们去发掘。1初始化它有五个初始化方法HashSet(),HashSet(Collection),HashSet(int),HashSe...原创 2018-04-07 23:34:10 · 262 阅读 · 1 评论 -
为什么Java中的字符串被定义为不可变的
字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建一个字符串对象,其中保存了一个字符数组,该数组中保存了字符串的内容。上面的箭头可以理解为“存储他的引用”。当我们在代码中连续创建两个相同的字符串的时候,其实会指向同一个对象。因为当一个字符串被被创建的时候,首先会去这个字符串池中查找,如果找到,直接返回对该...转载 2018-03-13 11:20:57 · 236 阅读 · 0 评论 -
java排序--堆排序
一.简介 上一篇讲了快速排序,这一篇来讲讲堆排序。堆可以借助借助完全二叉树来理解,数值排列按照广度优先算法输出的顺序给出。堆排序分按大堆排序和小堆排序。堆排序就是一趟排序完,最大的值在最前面;而按小堆排序就是一趟排序完,最小的值在最前面。 排序过程为使记录序列按关键字非递减有序排序,则在堆排序的算法中,先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录...原创 2018-04-29 21:48:48 · 577 阅读 · 1 评论