美文网首页
LinkedList、HashMap和LinkedHashMap

LinkedList、HashMap和LinkedHashMap

作者: Richard_7df6 | 来源:发表于2017-11-06 19:57 被阅读0次

一、LinkedList

一、LinkedList概述

LinkedList是一个简单的数据结构,与ArrayList不同的是,他是基于链表实现的。

这样一个简单的操作:

LinkedListlist=newLinkedList();

list.add("语文: 1");

list.add("数学: 2");

list.add("英语: 3");

----以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。按下标访问元素—get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。

插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两头的操作—add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指针的移动。

1.1、get和set函数

这两个函数都调用了node函数,该函数会以O(n/2)的性能去获取一个节点

Nodenode(intindex) {//assert isElementIndex(index);if(index<(size>>1)) {Nodex=first;for(inti=0; ix=last;for(inti=size-1; i>index; i--)            x=x.prev;returnx;    }}

就是判断index是在前半区间还是后半区间,如果在前半区间就从head搜索,而在后半区间就从tail搜索。而不是一直从头到尾的搜索。如此设计,将节点访问的复杂度由O(n)变为O(n/2)。

二、HashMap

2.1、初次见面

当我们执行以下操作时:

HashMapmap=newHashMap();

map.put("语文",1);

map.put("数学",2);

map.put("英语",3);

map.put("历史",4);

map.put("政治",5);

map.put("地理",6);

map.put("生物",7);

map.put("化学",8);

for(Entryentry:map.entrySet()) {System.out.println(entry.getKey()+":"+entry.getValue());}

运行结果时:政治: 5

生物: 7

历史: 4

数学: 2

化学: 8

语文: 1

英语: 3

地理: 6

what!发生了什么,那就上个图吧!

图解

从图中提取几个关键的信息:基于Map接口实现、允许null键/值、非同步、不保证有序(比如插入的顺序)、也不保证序不随时间变化。

2.2、HashMap的put和get

hashmap初始化时会定义一个table。如果是普通的map的话,直接将将item放入到map的对应列当中。但是hashmap呢

三、LinkedHashMap

看下这个代码

LinkedHashMaplmap=newLinkedHashMap();

lmap.put("语文",1);lmap.put("数学",2);lmap.put("英语",3);lmap.put("历史",4);lmap.put("政治",5);lmap.put("地理",6);lmap.put("生物",7);lmap.put("化学",8);

for(Entryentry:lmap.entrySet()) {System.out.println(entry.getKey()+":"+entry.getValue());}

运行结果:语文: 1 数学: 2 英语: 3 历史: 4 政治: 5 地理: 6 生物: 7 化学: 8

图解

我们可以观察到,和HashMap的运行结果不同,LinkedHashMap的迭代输出的结果保持了插入顺序。是什么样的结构使得LinkedHashMap具有如此特性呢?

LinkedHashMap是Hash表和链表的实现,并且依靠着双向链表保证了迭代顺序是插入的顺序。

相关文章

网友评论

      本文标题:LinkedList、HashMap和LinkedHashMap

      本文链接:https://www.haomeiwen.com/subject/esplmxtx.html