You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是**迭代HashMap的顺序并不是HashMap放置的顺序**,也就是无序。HashMap的这一缺点往往会带来困扰,因为有些场景,我们期待一个有序的Map。
|
|
|
|
|
这个时候,LinkedHashMap就闪亮登场了,它虽然增加了时间和空间上的开销,但是**通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序**。**该迭代顺序可以是插入顺序或者是访问顺序。**
|
|
|
|
|
|
|
|
|
|
LinkedHashMap可以认为是**HashMap+LinkedList**,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
看一下LinkedHashMap的基本数据结构,也就是Entry:
|
|
|
|
|
```java
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
...
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
列一下Entry里面有的一些属性吧:
|
|
|
|
|
|
|
|
|
|
1、K key
|
|
|
|
|
2、V value
|
|
|
|
|
3、Entry<K, V> next
|
|
|
|
|
4、int hash
|
|
|
|
|
5、Entry<K, V> before
|
|
|
|
|
6、Entry<K, V> after
|
|
|
|
|
|
|
|
|
|
其中5、6相当于前后指针
|
|
|
|
|
|