- 浏览: 631157 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
d1438138:
[img][/img]
google api 的一些神奇使用 -
waykingeye:
[i][b][u]引用[list]
[*][img][url] ...
No result defined for action and result input -
tss0823:
...
No result defined for action and result input -
yahier:
有什么办法能够捕捉,然后给出自定义的提示呢
No result defined for action and result input -
chen_lian:
恩恩 按照上面的代码测试一下觉得很对
java创建目录
说完HashMap,这个Map家族中最耀眼的明星后,再来看看HashMap的几个兄弟,首先要介绍的就是LinkedHashMap,这个直接继承HashMap的小弟
private transient Entry<K,V> header; /** * The iteration ordering method for this linked hash map: <tt>true</tt> * for access-order, <tt>false</tt> for insertion-order. * * @serial */ private final boolean accessOrder;
LinkedHashMap特有的的两个实例变量,一个是header,这个就是LinkedHashMap能选择是以插入顺序还是访问顺序的关键,一个是accessOrder用来记录LinkedHashMap到底是以插入顺序还是访问顺序,默认的是false,即插入顺序,当然也可以利用构造函数来实现访问顺序
private static class Entry<K,V> extends HashMap.Entry<K,V> { // These fields comprise the doubly linked list used for iteration. Entry<K,V> before, after; Entry(int hash, K key, V value, HashMap.Entry<K,V> next) { super(hash, key, value, next); } /** * Removes this entry from the linked list. */ private void remove() { before.after = after; after.before = before; } /** * Inserts this entry before the specified existing entry in the list. */ private void addBefore(Entry<K,V> existingEntry) { after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; } /** * This method is invoked by the superclass whenever the value * of a pre-existing entry is read by Map.get or modified by Map.set. * If the enclosing Map is access-ordered, it moves the entry * to the end of the list; otherwise, it does nothing. */ void recordAccess(HashMap<K,V> m) { LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m; if (lm.accessOrder) { lm.modCount++; remove(); addBefore(lm.header); } } void recordRemoval(HashMap<K,V> m) { remove(); } }
以保存插入顺序为例,这个LinkedHashMap之所以能存储插入顺序,关键就在于LinkedHashMap的Entry的实现中包括了Entry<K,V> before, after;这样实际上LinkedHashMap的存储上还是依托于父类的Entry[] table,但是他同时保证了Entry中保存了他插入时的前后元素,这样的实现比起sortedMap完全采用双向列表,在效率要好很多,同时也有了插入顺序的保证,具体说:
void addEntry(int hash, K key, V value, int bucketIndex) { createEntry(hash, key, value, bucketIndex); // Remove eldest entry if instructed, else grow capacity if appropriate Entry<K,V> eldest = header.after; if (removeEldestEntry(eldest)) { removeEntryForKey(eldest.key); } else { if (size >= threshold) resize(2 * table.length); } }
父类中当put一个新的Entry时,最后会调用addEntry,这样子类LinkedHashMap override这个方法,
void createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry<K,V> old = table[bucketIndex]; Entry<K,V> e = new Entry<K,V>(hash, key, value, old); table[bucketIndex] = e; e.addBefore(header); size++; } private void addBefore(Entry<K,V> existingEntry) { after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; }
LinkedHashMap 中调用了createEntry,这个方法同样是override了父类的方法,比起父类的createEntry,LinkedHashMap加了主要加了 e.addBefore(header);实际上这就是关键,它把新加的元素加到了Header的头上,addBefore完成了双向列表的指向改变。
Entry<K,V> nextEntry() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); if (nextEntry == header) throw new NoSuchElementException(); Entry<K,V> e = lastReturned = nextEntry; nextEntry = e.after; return e; }
这是LinkedHashMap 中LinkedHashIterator的nextEntry()方法,这是map各个set的iterator方法的next的核心,在这个方法中可以看到,实际上就是利用了header和双向列表的after,从而实现了输出有序的iterator。
另外下面这段代码是实现访问顺序的关键,recordAccess同样是LinkedHashMap override了父类的方法 ,这个recordAccess将在put(已有键值),get,putForNullKey中调用,从而实现了一有访问,被访问元素置于header,
void recordAccess(HashMap<K,V> m) { LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m; if (lm.accessOrder) { lm.modCount++; remove(); addBefore(lm.header); } }
发表评论
-
struts2远程执行漏洞学习(四)
2013-05-23 00:12 23410x01 最近又有了一个新的struts2漏洞,http:/ ... -
纯转一篇关于方法句柄的,对理解很多java poc帮助很大
2013-04-19 15:16 4342http://book.2cto.com/20130 ... -
CVE-2013-1493 学习
2013-03-25 16:06 30000x01 这个又是一个java CVE,效果前几个一样, ... -
myeclipse崩溃多处理的一个小窍门
2013-01-15 20:23 31830x01 如果大家用了myeclipse10以上版本,忽然间 ... -
CVE-2013-0422 分析2
2013-01-11 23:47 34980x01 http://wcf1987.iteye.c ... -
CVE-2013-0422 学习
2013-01-11 16:26 41630x01 这个是这两天爆出来的,我构建了一个本地测试代码,主 ... -
CVE 2012 0507 分析
2012-12-17 16:00 35680x01 https://github.com/wche ... -
<找工作 十一>生产者消费者 组赛队列
2012-09-25 17:39 1527用阻塞队列实现 import java.util.co ... -
<找工作 十>生产者 消费者模型
2012-09-25 16:54 1160今天被问了个这个问 ... -
<找工作 九> 字符串全排列问题
2012-09-23 22:01 1386public class StringTest { ... -
<找工作 七>leetcode Add Two Numbers
2012-09-13 22:24 3141Add Two Numbers 链表相加 p ... -
<找工作 六>leetcode Median of Two Sorted Arrays
2012-09-13 21:25 3248http://www.leetcode.com/onlinej ... -
java+jfreechart 做股票日线数据查看系统
2012-07-02 19:56 2364如标题所说,有需要jfreechart做股票日线之类的东西的人 ... -
struts2远程执行漏洞学习(三)
2012-02-24 16:27 5125这个是终结部分了。 除了#_memb ... -
struts2远程执行漏洞学习(二)
2012-02-24 13:38 2902http://commons.apache.org/ogn ... -
struts2远程执行漏洞学习(一)
2012-02-23 16:46 2288首先,这个漏洞已经是比较早的一个了,大概影响范围是 ... -
String和input Stream的转换问题
2011-07-27 17:05 3571问题的背景是需求要生 ... -
关于apache解压zip和sleep程序程序退出问题
2011-03-02 16:26 1487前两天写了 http://wcf1987.iteye.com ... -
zip与unzip
2011-01-24 22:39 7579大家在用java做zip压缩解压缩时,java提供了原生的zi ... -
java调用外部程序控制(三)进阶
2011-01-23 16:25 1570接上次的内容,我们在用java调用外部exe,有时会发生exe ...
相关推荐
本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, `TreeMap`以及`HashTable`之间的区别。 #### 1. HashMap `HashMap`是一种基于哈希表实现的`Map`接口,提供了一个非同步的、允许使用`null`键和...
其中,HashMap, HashTable, LinkedHashMap, TreeMap 是四种常用的 Map 实现类,每种类都有其特点和用途。本文将对这四种 Map 实现类进行比较和分析。 HashMap HashMap 是 Java 中最常用的 Map 实现类,它根据键的 ...
HashMap和LinkedHashMap 描述 该项目提供了可在Node.js和浏览器上运行的HashMap和LinkedHashMap类。 它们都是像一样的简化实现 它使用改进的算法生成哈希。 这样可确保在所有铲斗上尽可能广泛地散布。 根据规范,...
在Java编程语言中,`HashMap`、`TreeMap`和`LinkedHashMap`都是`java.util.Map`接口的实现,它们提供了不同的数据存储和访问策略。本文将深入探讨这三种数据结构的特点、工作原理以及适用场景。 1. **HashMap** `...
在 Java 中,HashMap、LinkedHashMap、TreeMap 都实现了 Map 接口,都是 Map 的子类,每个子类都有其特点和使用场景。 HashMap HashMap 是最常用的 Map 实现类,它根据键的哈希码值存储数据,能够快速地存储和获取...
2. 使用LinkedHashMap:LinkedHashMap是另一种Map实现,它保持了元素插入的顺序。如果你想按照插入顺序或者访问顺序对值进行排序,可以考虑使用LinkedHashMap。但是请注意,这并不意味着值本身会被排序,而是插入或...
List、ArrayList、Vector及map、HashTable、HashMap分别的区别 List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List...
在Java编程中,HashMap是一个非常重要的数据结构,它实现了Map接口,提供了键值对的存储功能,具有快速存取和高效查找的特点。HashMap基于哈希表(也称为散列表)原理,通过键对象的哈希码来定位元素,进而实现O(1)...
在Java编程中,`HashMap`是一种常用的数据结构,它实现了`Map`接口,提供了基于哈希表的存储方式,允许我们快速地查找、插入和删除键值对。对于`HashMap`的遍历,是进行数据处理和分析时不可或缺的操作。本文将深入...
4. **删除**:`删除`方法允许从HashMap中移除指定键的键值对。这个操作涉及到重新调整哈希表中受影响的部分,以保持哈希表的完整性。 5. **清空**:`清空`方法可以一次性清除HashMap中的所有键值对,释放内存资源。...
在Java编程中,Map接口是用于存储键值对的数据结构,而Java提供了多种Map的实现,包括TreeMap、HashMap和ConcurrentSkipListMap。本文主要比较了这三种Map的性能,尤其是在插入和查找操作上的效率。 1. **TreeMap**...
**HashMap与LinkedHashMap的区别** HashMap是Java集合框架中的一员,它是基于哈希表实现的,提供了快速的插入、删除和查找操作,平均时间复杂度为O(1)。然而,HashMap不保证元素的顺序,迭代时元素的顺序可能与插入...
《java编程思想》,Map结合HashMap获取键相关联的值
LinkedHashMap是HashMap的一个子类,它维护了元素的插入顺序或者访问顺序。如果想要按照插入顺序排序,直接使用LinkedHashMap即可。如果需要按照访问顺序排序,可以在构造时传入`true`参数,这样每次访问元素时都会...
本篇文章将深入讲解Map的使用实例,包括插入、读取和遍历操作,以及HashMap、LinkedHashMap和TreeMap这三种常见的Map实现类之间的区别。 首先,让我们看看如何创建和插入键值对。在Java中,我们通常通过调用`put()`...
java.util.map接口,Java集合框架,hashmap、LinkedHashMap
首先,创建一个名为`Map_ValueGetKey`的类,并实例化一个HashMap对象`map`。然后定义一个`getKey`方法,该方法接受一个值作为参数,其目的是找到与该值相匹配的所有键。 方法的核心在于调用`entrySet()`方法,它...
Map 的实现类有 Hashtable、HashMap、LinkedHashMap 和 TreeMap。Hashtable 是一种线程安全的哈希表,HashMap 是一种线程不安全的哈希表,LinkedHashMap 是一种链表哈希表,TreeMap 是一种树形哈希表。 在实际应用...