最近经历了几次面试,发现Java基础还是很重要的,所以好好弥补之前遗留的漏洞还是很有必要的。基础不牢固,就会越来越浮,无法走的深入。
这篇文章,主要总结了映射、集合等容器的相关联系与区别,会有比较透彻的分析,聪明的你看了定会过目不忘~
1、首先 ,我们来分析Array数组。
Array数组通过下标来实现操作,速度快、效率高,但我们无法判断其中有多少元素,我们只能通过length来明确它的大小。
如果想专门操作Array,我们可以通过Arrays类来实现,它里面有一组static函数。
当我们不知道到底需要多少对象时,数组就显得力不从心了,这时我们就要用到集合。
2、Collection,最基本的集合接口,声明了Set和List的通用方法,Set和List都继承了Collection、Map。
2.1 Set
Set是一种比较简单的集合。它不包含重复对象,且不按特定的方式存储。
Set是一个接口,HashSet和TreeSet对其进行了实现。HashSet类按照哈希算法来存取集合中的对象,存取速度比较快,为快速查找而设计 ;TreeSet类实现了SortedSet接口,是保存次序的Set,底层为树结构,适用于对集合中的对象进行排序。
在Set中,实际存放的是对象的引用,而不是对象本身,这点我们可以实际放入几个字符串及几个引用,再通过size方法来测试。
Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是行为不同(这是继承与多态思想的典型应用:表现不同的行为)。
2.2 List
List也是一个集合,但它可以存放重复对象。它通过索引来操作,不按顺序存储,但通过链表维护了访问顺序。
List也是一个接口,ArrayList和LinkedList、Vector对其进行了实现。ArrayList代表长度可变的数组,可以对元素进行快速随机的访问,但向ArrayList()中插入与删除元素的速度慢。而LinkedList在实现中采用了双向链表数据结构,弥补了ArrayList插入与删除速度慢的缺陷,但无法满足快速随机访问的要求。
3、Map
Map是一种key-value数据结构的集合,也是一个接口,它没有继承与Collection接口。从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
标准的Java类库中包含了几种不同的Map:HashMap, TreeMap, LinkedHashMap。它们都有同样的基本接口Map,但是行为、效率、排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。
HashMap使用了hashCode来取代对键的缓慢搜索。HashCode是“相对唯一”用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。
LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。
小结,来图:
结构图:
集合对比图:
下面整理的比较常用:
HashSet:继承于Set;散列存储,无序;不可重复;
HashMap:继承与Map;散列存储,无序;不可重复;
ArrayList:继承于List;有序存储;可以重复;可以确定访问次序;
LinkList:任意位置进行高效的插入和删除操作;有序序列。