最近面试发现自己的知识框架有好多问题。明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题。不管了,再巩固下基础知识总是没错的,反正最近空闲时间挺多的,也不打算找工作了。(都是看的网上资料,乱,仅个人笔记)
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
1、Collection:代表一组对象,每一个对象都是它的子元素。
2、Set(集):无顺序,不包含重复元素的Collection。
3、List(队列):有顺序的collection,并且可以包含重复元素。
4、Map(映射):可以把键(key)映射到值(value)的对象,键不能重复。
java集合:数据结构,在C语言的中庸struct描述,而在面向对象的编程中,数据结构用类来描述并且包含了有对该数据结构操作的方法。
再java中,设计者对常用的数据结构和算法做了一些规范和实现,这些统称为 java集合框架。
Collection:最基本的集合接口,一个Collection代表一组Object(对象),一些Collection 允许相同的元素在一起,而又的不行,一些能排序而一些不能排序;
javaSDK不提供直接继承自Collection的类,提供的类都是继承自Collection的“子接口”如List和Set;
List接口:list是有顺序的Collection,使用此接口能够精确的控制每个元素插入的位置,用户能够使用索引(元素在List中的位置,类似于数组的下标)来访问List中的元素;List允许有相同的元素存在;
List的实现类:LinkedList.ArrayList,Vector,Stack;
1、LinkList:数据结构是链式的线性表(在数据结构笔记中),他实现了List接口,允许NULL存在,此外其提供的get,remove,insert,方法能使LinkedList可被用作栈(stack),队列(queue),或者双向队列(deque);
注意:LinkList没有同步方法,如果多个线程同时访问一个List则需要自己实现同步访问,用同步代码块;
2、ArrayList:数据结构是顺序的线性表,他实现了可变大小的数组,他允许所有元素,包括NULL,每个ArrayList实例都与一个容量,即存储元素的数组的大小这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率(自动增判断长度后增长也会浪费时间的呀!)。
同样:ArrayList没用同步;
3、Vector::实现了一个大小可变的数组和ArrayList相似,但不同的是,Vector是同步访问的,其包含的许多传统方法,这些方法不属于集合框架,由Vector创建的迭代器正在使用,此时被另一个线程改变了Vector的状态,会抛异常,必须捕获;
老的动态数组,效率低,一般不用;由于同步问题,ArrayList 效率 高于Vector;
4、Stack:继承自Vector,实现了一个先进后出的栈结构,刚创建时是空栈;
Set接口:实际上Set就是Collection,只是行为不同,Set不保存重复的元素(用equals());存入Set的每个元素都是唯一的,不保证元素的顺序;
1、TreeSet:实现Set接口,基与TreeMap实现的,数据结构是红黑书(自平衡的排序二叉树,还没接触过),是一种Set的变体,可以实现排序等功能的集合,他在添加元素到集合中时,会自动按照某种比较规则将其插入到有序的对象序列中,并保证“升序”排列;
2、HashSet:实现Set接口,其底层是基于HashMap实现的。HashSet底层采用HashMap来保存所有元素,所有放入HashSet中的元素实际上由HashMap的key来保存,而value则存储了一个静态的Object的类;
Map接口:与List、Set接口不同,他是由一系列键值对组成的集合,提供了key到value的映射,他没继承Collection;
Map接口的实现:HashMap、TreeMap、HashTable、Properties、EnumMap;
1、HashMap:以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,他是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将
所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry()的源码他是一个单链表结构;一般用于单线程程序中(单线程安全);Key和Value都可为空;
2、TreeMap:键以某种排序规则排序,内部以red-black(红-黑)树数据结构实现,实现了SortedMap接口;(待学红黑树)
3、HashTabl:以哈希表数据结构实现的,解决冲突时与HashMap一样用了散列链表的形式。性能比HashMap低,一般用于多线程中(多线程安全);Key和value都不可为空;
Queue:队列,主要分为两大类,一类是阻塞式队列主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue;一类是双端式队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。
**对集合类的一些比较:
1、Vector与ArrayList比是线程安全的,考虑到这个原因,一般ArrayList效率比较高;如果集合中的元素数目大于目前集合数组的长度,Vector增长率为目前数组的100%,而ArrayList增长率为50%,如果在集合中使用数据量比较大的数据,用Vector有一定的优势;
如果查找一个数据,Vector和ArrayList是相同的;都是采用数组方式存储;
2、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构;对于随机访问get和set,ArrayList优于LinkedList。因为后者需要移动 指针;对于新增和删除数据,LinkList比较占优势,因为ArrayList要移动数据;分数据量;
3、关于HashMap先不写,先看下哈希表;
4、TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的;TreeMap和TreeSet都是非同步集合,可以使用方法Collections.synchroinzedMap()来实现同步;TreeSet中不能有重复对象,而TreeMap中可以存在;TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value(仅仅key对象有序);
java中数据存储方式最底层的两种结构,一是数组,另一种是链表,数组的特点:连续空间,寻址迅速,增删慢;链表则正好相反;有没有一种数据结构来综合一下数组和链表,以便 发挥他们各自的优势呢?哈希表;
哈希表(也叫散列表):具有较快(常量级)的查询速度,以及相对较快速的增删速度,所以很适合在海量数据的环境中使用。一般实现哈希表的方法采用“拉链法”,我们可以理解为“链表的数组”;