集合源码解析
文章平均质量分 86
虚客
这个作者很懒,什么都没留下…
展开
-
通过分析 JDK 源代码研究 TreeMap 红黑树算法实现
HashSet 实现的接口规范不同,但 TreeSet 底层是通过 TreeMap 来实现的,因此二者的实现方式完全一样。而 TreeMap 的实现就是红黑树算法。 TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。 TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 TreeSet 之间的关系,下面先看 TreeSet 类的部分源代码: public class TreeSet<E原创 2010-09-01 22:17:01 · 192 阅读 · 0 评论 -
ArrayList源码解析
blic class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 内部结构是一个Object类型的数组 private transient Object[] elementData; ArrayList的大小,也就是元素个数原创 2010-09-02 22:10:56 · 51 阅读 · 0 评论 -
通过分析 JDK 源代码研究 Hash 存储机制
现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 HashMap 来实现的。 通过 HashMap、HashSet 的源代码分析其 Hash 存储机制 集合和引用就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量。 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 H原创 2010-09-03 10:38:04 · 60 阅读 · 0 评论 -
深入理解HashMap
构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap也不例外。Hashmap实际上是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“),请看下图(横排表示数组,纵排表示数组元素【实际上是一个链表】)。 从图中我们可以看到一个hashmap就是一个数组结构,当新建一个hashmap的时候,就会初始化一个数组。我们来看看java代码: Java代码 /** * The table, resized as原创 2010-09-04 11:24:11 · 152 阅读 · 0 评论 -
Java5 Concurrent包中的锁机制
持并发环境的,也就是说多线程安全的,那两者有什么区别呢? 分析 其实简单的说是同步机制有区别,具体区别又在那里呢? 请看HashTable的put方法: /** * Maps the specified <code>key</code> to the specified * <code>value</code> in th原创 2010-09-04 19:58:04 · 69 阅读 · 0 评论 -
ConcurrentHashMap之实现细节
够了。但是在经过一次惨痛的面试经历之后,我觉得必须深入研究它的实现。面试中被问到读是否要加锁,因为读写会发生冲突,我说必须要加锁,我和面试官也因此发生了冲突,结果可想而知。还是闲话少说,通过仔细阅读源代码,现在总算理解ConcurrentHashMap实现机制了,其实现之精巧,令人叹服,与大家共享之。 实现原理 锁分离 (Lock Stripping) ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的原创 2010-09-04 20:06:49 · 61 阅读 · 0 评论 -
Map 四种同步方式的性能比较
.get(key); } JDK1.2 提供了 Collections.synchronizedMap(originMap) 方法,同步方式其实和上面这段代码相同。 2、使用 JDK1.5 提供的锁(java.util.concurrent.locks.Lock)。代码如下 lock.lock(); value = map.get(key); lock.unlock(); 3、实际应用中,可能多数操作都是读操作,写操作较少。针对这种情况,可以使用 JDK1.5 提供的读写锁原创 2010-09-04 20:25:37 · 93 阅读 · 0 评论 -
Set中如何保证元素的唯一性
能保证唯一性。当然,在这种情况下,你不想重写hashCode()方法,也没有错。但是,对于良好的编程风格而言,你应该在重写equals()方法的同时,也重写hashCode()方法。 然后再说说必须重写hashCode()的情况: 如果你的对象想放进散列存储的集合中(比如:HashSet,LinkedHashSet)或者想作为散列Map(例如:HashMap,LinkedHashMap等等)的Key时,在重写equals()方法的同时,必须重写hashCode()方法。 在Set里如果保证原创 2010-09-04 21:11:05 · 223 阅读 · 0 评论 -
java.util.HashMap源码要点浅析
sh值对应的槽位;开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。java.util.HashMap采用的链表法的方式,链表是单向链表,因此在删除过程中要自己维持prev节点,我想不采用双向链表是从节省空间考虑。一个典型的查找过程: for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e原创 2010-09-04 21:54:16 · 66 阅读 · 0 评论