目录
1.1 按照实现的接口不同可以分为实现Collection接口和实现Map接口
1. JAVA集合的分类
1.1 按照实现的接口不同可以分为实现Collection接口和实现Map接口
对于Collection接口下的集合类型主要有三类,分别是Set,List,Queue这三类,常用到的实现类是Set的实现类主要有HashSet,TreeSet。List的主要实现类有ArrayList,LinkedList,Stack这三个实现类,Queue接口的实现类主要有PriorityQueue和ArrayDeque这两个实现类。
对于Map的实现类有HashMap,Hashtable,TreeMap实现类。
1.2 按照是否是线程安全进行划分
java中线程安全的集合有Vector和Hashtable其他的都是非线程安全的。另外在java.util.concurrent下的类都是线程安全的。
2. 关于List接口下的数据结构在算法中的应用
List接口下的ArrayList的底层实现是Object[]数组,Vector的实现也是Object[]数组,LinkedList的底层实现是双向链表。
List接口下的ArrayList和LinkedList数据结构是我们在进行数据处理时最常用的数据结构,因为该接口下的方法较多,而且存取数据较为方便。
如果需要对一组数据进行复杂的操作,例如对一组数据的第n个进行修改,或者是删除第n个数据等。而且这组输入又没有先入先出或者其他的一些场景需求,我们可以使用List接口下的实现类。
3. 关于Set集合在算法中的适用场景
HashSet的底层是基于HashMap实现的,采用HashMap保存元素。
对于Set这个数据结构,我们可以巧妙地利用他集合中元素唯一的特性,解一些算法题。例如力扣中的剑指Offer49求丑数这道题,具体的题目如下所示:
因为只包含质因子2、3、5所以我们可以将这几个质因子和已经找到的丑数相乘得到的还是丑数,但是在乘的时候可能会得到两个值相同的丑数,比如2*3*5=30,3*2*5=30,所以为了不将这些已经遍历过的丑数加入到我们的遍历中。就可以用Set这个数据结构进行储存遍历过的丑数,具体的解法如下所示。
对于二叉树的DFS,BFS,还有图的DFS,BFS中为了不存储已经遍历过的结果,或者为了避免图的遍历中的死循环,通常也可以采用Set这个数据结构存储已经遍历过的数据。
4. 关于Queue接口的数据结构在算法中的应用
Queue接口中的PriorityQueue(优先队列)是采用Object[]数组实现二叉堆,而ArrayQueue是采用Object[]+双指针实现双端队列。
Queue接口下的实现类主要有PriorityQueue类和ArrayDequeue类。PriorityQueue(优先队列)在算法中的应用较为广泛。可以解决一些如求最小的K对数字,第m个最大的数等这些问题。具体的一道题如力扣373所示:
我们可以使用一个优先队列的数据结构存储遍历到的数据的较小值:
5. 关于Map接口在算法中的应用
Map数据结构可以描述两个数据之间的联系,能够通过一个数据映射到另外一个数据。这是Map数据结构的主要特性。利用这一特性,可以很方便解决一些算法题,如下面的剑指Offer33这道题,这道题的本质是要将一个字符数组中使用相同字符的不同的字符串归纳到一个字符串数组中。
这道题看起来有些难度,但是如果使用哈希表Map数据结构进行做的话就会很简单。我们将字符数组中出现的每一个构成字符串的所有的字符的从小大的排列作为哈希表的键,字符数组中每一个字符串如果能用哈希表中的键构成就把他加到键对应的值上。
对于一些一个数据与另外一个数据或者一组数据有映射关系的算法题,我们利用哈希表的数据结构可以十分快捷高效地解决。