博主好久没写博客了,正当最近要找暑假实习,要把之前学过的Java基础拿出来好好复习一下。
刚刚看牛客网,看到一道有关集合的题目,现在把学习到的Java集合只是总结下来。
1)我们看一下这张图
首先在最顶端就是两个接口类,分别是Collection和Map
解释:Collection就是集合的意思,他存放的就是一个一个对象,这些对象可以是自己定义的JavaBean对象,也可以是Java本身API就是存在的Interger,String等对象
而Map呢,就是以Key-Value形式存储的数据结构,Key和Value可以自定义对象
如: Map<Integer,String> map = new HashMap<>();
2)大致了解了两个接口后,我们一刀一刀的切入他们
首先是Colletion集合,子类为List接口和Set接口
相比这个我也无需多讲,就比如Set集合,在我们高一的数学课本中其实就已经学到了,这个集合是无序的,不可重复的。
相反,List集合就是有序的,可重复的。
2.1 List列表下有三个接口
最常用的是LinkList和ArraryList,这两个列表区别在他们的存储方式不同,一个在内存中是以顺序存储,一个在内存中是以链表存储。
相信学过数据结构的童鞋,这个难不倒你们,我也不在这里解释顺序存储和链表存储了,有需要的同学的去学学数据结构,这是一门好课程,程序员必备!!!
反正要记住一点,如果只是查找数据,首先顺序存储
如果是在List表中有大量的删除和插入数据,那么选择链表存储。
于此同时这两种列表是非线程安全
2.2 常被忽视的Vetctor
Vetcor有三个构造方法,其中值得我们注意的是下面这个构造方法
vector(int initialcapacity,int capacityIncrement)
参数1:initialcapacity代表初始化的容量
参数2:capacityIncrement代表增长量
容量扩充策略:如果capacityIncrement大于0,则将Object数组的大小扩大为现有size加上capacityIncrement的值;如果capacity等于或小于0,则将Object数组的大小扩大为现有size的两倍,这种容量的控制策略比ArrayList更为可控。
Vector是基于Synchronized实现的线程安全的ArrayList,但在插入元素时容量扩充的机制和ArrayList稍有不同,并可通过传入capacityIncrement来控制容量的扩充。
Stack是Vector的子类,他实现了栈的理念,即先进后出的思想,于此同时,他也是线程安全的!
记得博主写过一到leetcode题,题目的要求是实现编译器的{ 是否匹配的算法,这里面的算法实现,就可以用到栈
2.3 Set下面有两个实现类,分别是HashSet和SortedSet
HashSet的原理,就是在内部创建一个HashMap
其中add其进入的值,作为Map的key,value值用一个默认的object对象
HastSet无法get某个值,毕竟他是无序的,无法查找
所以要得到Set里面的值,只能使用iterator来遍历
该类是非线程安全
SortedSet是接口类型,TreeSet是基础TreeMap实现,底层的二叉树
他对集合实现类了排序,即为排序二叉树。
线程安全。
3.刚刚在说Set的时候提高了Map,Map是面试经常考到的知识点
3.1其实HashMap是最为重要
HashMap就是以Key值,计算出HashCode值,形成一个散列表,每个HashCode值对应一个或多个value值(链表存储)
其中查询的时间复杂度为O(1)
非线程安全
3.2TreeMap 是基于红黑树
红黑树有一定难度,涉及到一些规则,还包括变色和旋转,有一定难度,这里就不再讨论
我们这里只要知道,TreeMap是有序的,线程安全的就行。
好了,今天就分享到这里,谢谢大噶!