对于高级语言来说,集合(容器)是非常的重要的知识点,也是非常基础的,相信很多刚毕业的同学包括初级程序员和求职的过程中,经常会被问到集合相关的知识。我觉得该文只是对集合的一个简单的介绍,更加深的学习还是要大家查找一些资料去学习。
场景1(自己经历过的):
谈谈你对集合的理解?(已经开始挖坑了!)
霹雳哗啦的说完自己当时所懂的!
说一下List、set、map的区别?
---------------------
聊一下ArrayList和LinkedList的区别和实现原理?
---------------------
hashMap用过吧,说一下它的实现原理吧!
--------------------
对于科班(计算机)的同学对这些应该是很了解 --> 《数据结构与算法导论》,而对于许多非科班培训出来的,我觉得可能对这些知识有些缺失。不过这都不是事,无非就是花时间。
下面是我对集合的一些理解(比较基础)。
容器分类:
首先我建议大家去看一看java编程思想这本书17章中完整的容器分类图,能够学到很多。下图是自我理解画出的分类图,比较简单且是较常用的(其中有一些接口省略掉了)。
通过上图可以看出,Collection是最基本的集合接口,子接口有List、Map、Set、Queue,它支持Iterator,具有一个Iterator()方法。具体还定义了什么方法可可以去看一看它的源码。
List接口:List接口继承Collection接口,因此它也包含了Collection接口的所有办法(isEmpty、clear、add等等),外加自己的一些方法。下图是List接口的代码。ListIterator()方法应该是实现遍历功能,我记得具有ListIterator()方法就可以使用foreach遍历元素。记得不是很清楚了。
public interface List<Anytype> extends Collection<Anytype>{
Anytype get(int idx);
Anytype set(int idx, Anytype newVal);
void add(int idx, Anytype x);
void remove(int idx);
ListIterator<Anytype> listIterator(int pos);
}
上面的方法我就不再说了。List接口有两种流行的实现方式。ArrayList类是一种可增长数组的实现。LinkedList类是一种双链表的实现。
在介绍ArrayList类和LinkedList之前我觉得应该介绍一下数组和链表。
数组:数组是一个简单的线性序列,存储区间是连续的,占用内存严重,故空间复杂度很大。但数组的二分查找时间复杂度小,为O(logn);特点:访问元素快,插入和删除慢。
链表:链表是由一系列节点组成(存储区间离散,占用内存宽松。但是查找元素时,时间复杂度大,为O(N))。每个节点含有一个结构体(元素)和指向下一个节点的链(可以理解为下标),最后一个单元的存储的节点的链则是null。双向链表中节点存储的则是一个结构体、一个指向下个节点的链和一个指向上一个节点的链。
ArrayList类:ArrayList的优势在于访问元素快,因为它提供了像数组一样的下标,缺点就是在进行中间插入和移除元素时会比较慢(原因是因为当删除某中间元素时,后面项的坐标全部要发生改变。)。 有兴趣的建议去看一看它的源码!
LinkedList类:LinkedList的优点是新项的插入和现有项的删除非常快(当LinkedList删除某一元素时发生改变的只有上一个节点指向下一个节点的链和下一个节点指向上一个节点的链),缺点就是访问元素较慢。
Vector类:Vector和ArrayList一样是通过数组实现的,所以它的优缺点可以参照ArrayList,访问元素速度较ArrayList慢,这也是重要的一个不同点即Vector支持线程同步,所以花费的时间长一些。提一下Stack集合吧,后进先出的特点。
在介绍Set和Map时它们的实现类HashSet和HashMap需要一些Tree的知识,例如红黑树的与原理,这个在之前的推荐"数据结构"方面会介绍,还需要一些散列的知识。下面是我看过的一篇关于hashcode方法的介绍
https://www.cnblogs.com/dolphin0520/p/3681042.html
Set接口:不保存重复的元素这是Set的一个重点。Set具有和Collection完全一样的接口,没有新增任何新的功能。
Map接口:Map(映射表)的基本思想是维护键值对关联即通过Key来查找value。实现Map接口的常用类我们这里只提HashMap和TreeMap。
常常会有人将HashMap和HashSet来比较,我觉得放在一起比较更方便理解吧,在理解HashSet时,需较好的理解HashMap。
HashMap实质:
HashMap中的两个非常重要的方法,HashCode()方法和Equals()。推荐大家去看下面这篇博客。再去看下面的知识。
http://blog.csdn.net/lizhuchao88/article/details/64123459
HashSet实质
1)HashSet是set的一个实体类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品。
2)HashSet以对象作为元素,而HashMap以(key-value)的一组对象作为元素,且HashSet拒绝接受重复的对象。HashMap可以看做三个视图:Key的Set,Value的Collection,Entry的Set。这里HashSet就是HashMapde 一个视图。
HashSet内部就是使用HashMap实现的,和HashMap不同的是它不需要Key和Value的值。
同样的我们将TreeMap和TreeSet一起介绍,很多人所TreeSet是TreeMap的另一个马甲,TreeSet通过封装HashMap的成员变量来实现。下面是详细介绍
http://blog.csdn.net/u010366748/article/details/52021600