package
audaque
.
com
.
pbting
.
collection
.
test
;
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Iterator
;
import
java
.
util
.
LinkedHashMap
;
import
java
.
util
.
List
;
import
java
.
util
.
Map
.
Entry
;
/**
* 这里稍微理清一下LinkedHashMap 对于访问排序的原理:
*
* 当我们指定了按访问的顺序进行排序的时候,那么这个时候LinkedHashMap 会这样来处理,就是
* 移除当前的这个key,然后将这个key 放到最后,以此来实现访问的顺序。所以说如果最后一次访问的元素
* 他总是在链表中的末尾。为什么他要基于HashMap 来实现这么一个链表呢?那是因为基于他的查找因素很快,然后直接
* 移除,并将它添加到末尾。它相比与传统的LinkedList的不同就在于他查找所要移除的元素比较快,而LinkedList
* 要是移除宇哥元素的话还要一次遍历这个链表然后在做移除的操作。所以如果以后还想要使用ArrayList或者LinkedList
* 来存储数据的话,不妨做好改用LinkedHashMap,它不仅提供了类似于ArrayList 基于角标查询的速度,又有LinkedList
* 快速删除的特点。此外他还有一个更强大的功能就是可以基于访问的次序进行排序。即最后一次访问的元素总是放于最后的。对访问的频率
* 不做影响。
*
*
*
*
@author
Administrator
*
*/
public
class
LinkedHashMapTest
{
/**
*
@param
args
*/
public
static
void
main(
String
[]
args
)
{
//
TODO
Auto-generated method stub
LinkedHashMap
<String,
String>
lm
=
new
LinkedHashMap<String,String>(
16
,
0
.
75f
,true);
lm
.put("key-1",
"val-1");
lm
.put("key-2",
"val-2");
lm
.put("key-3",
"val-3");
lm
.put("key-4",
"val-4");
for(
Entry
<String,
String>
entry
:
lm
.entrySet()){
System
.out.println(
entry
.getKey()+"--"+
entry
.getValue());
}
lm
.get("key-3");
lm
.get("key-3");
lm
.get("key-2");
System
.out.println("---------------");
for(
Entry
<String,
String>
entry
:
lm
.entrySet()){
System
.out.println(
entry
.getKey()+"--"+
entry
.getValue());
}
Iterator
<String>
keyIt
=
lm
.keySet().iterator();
List
<String>
targetkeys
=
new
ArrayList<String>();
while(
keyIt
.hasNext()){
String
key
=
keyIt
.next();
/**
* 这里会抛出异常,那是因为当你在迭代key 时他要保证key 的同步关系,即key 在集合中的顺序
* 是不能发生改变的。因此在一开始迭代时,他会给这个路口上一个锁,来标识当前我在迭代key,如果
* 有其他操作想更改key的顺序,我是不允许的。那么在迭代key 时还有什么意思和相关的应用场景呢?
* 如果仅仅是想过的我们想要的key,然后再去取值操作,那为什么不直接使用HashMap提供的get(key)
* 方法来去呢?这个时候我目前想到的一个应用场景就是:
* 当这个集合中的数据不是有我们所管理的时候,我们仅仅是由读取的权限,那么这个时候我们就可以使用便利
* key的方法来处理我们想要的操作。比如说底层处理好的操作给我们传一个LinkedHashMap,然后我们就可以对我们
* 感兴趣的key进行相关的操作。
*/
if(
key
.equals("key-2")
||
key
.equals("key-3"))
targetkeys
.add(
key
);
}
//然后再在这里做相关的处理
for(
String
key
:
targetkeys
){
System
.out.println(
lm
.get(
key
));
}
}
}
运行结果: