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