- 浏览: 1682340 次
- 性别:
- 来自: 北京
最新评论
-
nucleus:
貌似是因为图片的路径是http的缘故:http://dl2.i ...
spring container 实现分析:BeanWrapper -
nucleus:
nucleus 写道BeanWrapper这一块相关的类结构如 ...
spring container 实现分析:BeanWrapper -
nucleus:
BeanWrapper这一块相关的类结构如下图:文中提到的上述 ...
spring container 实现分析:BeanWrapper -
leshy:
inventory.sort(Comparator.compa ...
java8 lambda表达式学习总结 -
Leisurez:
di1984HIT 写道xuexile~hahaha~
activemq的几种基本通信方式总结
文章列表
前言
想讨论这个话题有一段时间了。记得几年前的时候去面试,有人就问过我一个类似的问题。就是java thread中对于异常的处理情况。由于java thread本身牵涉到并发、锁等相关的问题已经够复杂了。再加上异常处理这些东西,使得它更加特殊。 概括起来,不外乎是三个主要的问题。1. 在java启动的线程里可以抛出异常吗? 2. 在启动的线程里可以捕捉异常吗? 3. 如果可以捕捉异常,对于checked exception和unchecked exception,他们分别有什么的处理方式呢?
现在, 我们就一个个的来讨论。
线程里抛出异常
我们可以尝试一下在 ...
初步理解
我们在看一些多线程代码的时候,有的时候会碰到使用interrupt()方法的时候。从字面的意思来理解,应该就是中断当前正在执行的线程。那么,对于一个我们设计的普通线程来说,如果我们在主线程里调用它的inter ...
前言
关于线程创建的问题,可以说是老生常谈了。在刚开始学习Thread的时候基本上都会接触到,用简单的一两句话就可以概括起来。一个是创建类实现Runnable接口,然后将该类的实例作为参数传入到Thread构造函数中。再调 ...
问题描述:
假设我们有一组排序的元素,希望通过他们来构建一棵平衡的二叉搜索树。那么该如何构建呢?
分析
这是一个比较有意思的问题。通过一些递归的手法可以做很好的实现。我们首先来看,如果要构建一棵平衡二叉树的话,我们理想的情况是相对于一个树的节点来说,它的两个子树的元素是一样多的。这样就从本质上保证他们可以达到平衡。
那么,如果我们现在从定义的角度更加深入一下考虑的话,假定我们要构造一棵树。那么它的根节点就应该取元素列表的中间元素,这样保证两边平衡。在构造了这个节点之后,那么它的左右子节点呢?对于它的左子节点,按照递归的定义,则应该是在元素列表开头到这个节 ...
简介
TreeMap和TreeSet算是java集合类里面比较有难度的数据结构。和普通的HashMap不一样,普通的HashMap元素存取的时间复杂度一般是O(1)的范围。而TreeMap内部对元素的操作复杂度为O(logn)。虽然在元素的存取方面TreeMap并不占优,但是它内部的元素都是排序的,当需要查找某些元素以及顺序输出元素的时候它能够带来比较理想的结果。可以说,TreeMap是一个内部元素排序版的HashMap。这里会对TreeMap内部的具体实现机制和它所基于的红黑树做一个详细的介绍。另外,针对具体jdk里面TreeMap的详细实现,这里也会做详细的分析。
TreeM ...
二叉搜索树的定义
和前面一篇讨论二叉树有一点不一样,二叉搜索树它本身是一种二叉树,但是它有一个特殊的地方。任何一个二叉树中间的节点都是可以比较的。他们有一个key的值用于比较节点之间的大小。而且,对于 ...
简介
二叉树相关的问题和内容一直是一个比较有意思的方面。尤其是结合一些特殊的特性,比如搜索、遍历、高度等,更加让这些问题比想象的复杂。因此,对这些问题的分析也就很有必要。这里先对一些基本定义和操作做一个分析,后续会对一些其他常见的问题进行讨论。对于其中讨论的定义和方法,我们会尽力给出一个比较完备的实现。
二叉树定义
从字面上来理解二叉树,则比较简单,它主要是由一系列的节点组成。每个节点包含有两个分别指向左右子节点的引用。它有一个唯一的节点,称为根节点,在最上面。它的左右引用分别指向同样类型的节点。通过这样递归的定义,我们可以得到一棵二叉树。最常见的二叉树节点如下图:
...
问题描述
假定我们要在一个巨大的数组上面实现一个直接寻址的字典。因为这个数组非常的大,而且一开始可能还包含一些垃圾信息,也就是说,这个建立了的数组是没有被初始化的,它里面可能含有的值不是被都设置为0,而是可能为任意值。而且,如果从头到尾的将这个数组初始化一遍开销太大了,这样又不太现实。现在,假设我们要实现这么一个字典,里面每一个保存的对象使用O(1)的空间,保证search, insert和delete这几种操作的时间复杂度为O(1)。
分析
我们先来简单的看一下这几种操作方法面临的问题。我们采用的是直接寻址的映射方式,比如说,我们给定一个整数k值,那么这个值就是字典里 ...
简介
bitmap在很多海量数据处理的情况下会用到。一些典型的情况包括数据过滤,数据位设置和统计等。 它的引入和应用通常是考虑到海量数据的情况下,用普通的数组会超出数据保存的范围。使用这种位图的方式虽然不 ...
PriorityQueue介绍
在平时的编程工作中似乎很少碰到PriorityQueue(优先队列) ,故很多人一开始看到优先队列的时候还会有点迷惑。优先队列本质上就是一个最小堆。前面一篇文章介绍了堆排序和堆的性质。而堆又是什么呢?它是一个数组,不过满足一个特殊的性质。我们以一种完全二叉树的视角去看这个数组,并用二叉树的上下级关系来映射到数组上面。如果是最大堆,则二叉树的顶点是保存的最大值,最小堆则保存的最小值。
下面是一个典型的优先队列的结构图:
它的每个父节点都比两个子节点要小,但是整个数组又不是完全顺序的。
有了前面的这些铺垫,我们再来 ...
简介
Map和Set是比较常用的两种数据结构。我们在平常的编程中经常会用到他们。只是他们的内部实现机制到底是怎么样的呢?了解他们的具体实现对于我们如何有效的去使用他们也是很有帮助的。在这一篇文章里,已经对HashMap, HashSet的实现做了一个详细的讨论。这里主要是针对Map, Set这两种类型的数据结构规约和典型的HashMap,HashSet实现做一个讨论。
Map
Map是一种典型的名值对类型,它提供一种Key-Value对应保存的数据结构。我们通过Key值来访问对应的Value。和Java集合类里头其他的类不太一样,这个接口并没有继承Collection这 ...
简介
Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约。实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现。还有的适用于多线程的环境。 ...
简介
在List中最常用的两个类就数ArrayList和LinkedList。他们两个的实现代表着数据结构中的两种种典型:线性表和链表。在这里,这个线性表是可以根据需要自动增长的。Java的库里面默认没有实现单链表,LinkedList实际上是一个双链表。这些具体的细节我们会在后续的代码里分析。
实际上,ArrayList和LinkedList他们之间的整体类关系图如下:
有了这个图作为参照,我们在后面就可以很容易的来分析他们的具体实现。前面的图片省略了部分实现接口的细节。
ArrayList
如果我们看过前面一篇文章关于stack和vector ...
简介
我们最常用的数据结构之一大概就是stack了。在实际的程序执行,方法调用的过程中都离不开stack。那么,在一个成熟的类库里面,它的实现是怎么样的呢?也许平时我们实践的时候也会尝试着去写一个stack的实现玩玩。这里,我们就仔细的分析一下jdk里的详细实现。
Stack
如果我们去查jdk的文档,我们会发现stack是在java.util这个包里。它对应的一个大致的类关系图如下:
通过继承Vector类,Stack类可以很容易的实现他本身的功能。因为大部分的功能在Vector里面已经提供支持了。
Stack里面主要实现的有一下几个方法:
方法 ...
简介
binary search是一个几乎大家耳熟能详的问题,只要一提到这个问题,似乎立马就有人把代码都浮现在头脑里了。它本质上就是通过不断的折半查找来缩小范围,这样可以达到一个很理想的运行效率。这个方法本身有几 ...