LinkedList、HashMap和LinkedHashMap初探

一、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表和链表的实现,并且依靠着双向链表保证了迭代顺序是插入的顺序。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,296评论 0 16
  • 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算...
    曹振华阅读 2,532评论 1 37
  • 1.什么是HashMap 基于哈希表的Map接口的非同步实现 此实现提供所有可选的映射操作,并允许使用null值和...
    苍賢阅读 525评论 0 1
  • Collection & Map Collection 子类有 List 和 Set List --> Array...
    任教主来也阅读 3,212评论 1 9
  • 你走过的地方 有什么遗落 并且,开出一朵清浅的花 岁月的河床上 一群一群的鱼儿游过 泛起的泡沫让人迷惑 我试图打捞...
    水晶心语阅读 378评论 2 9