最近去面试,发现自己好多基础知识都一知半解,明明自己脑子里明白,明白这个知识点的原理,但就是说不出来,也不知道是自己表达能力的问题,还是其实自己对这些知识并没有掌握,趁每天空闲时间,好好再补下基础(闹心,话说有些知识刚学的时候不理解,但是能行记住,用过后理解了,反而记不住了)。(都是看的网上资料,写的乱,仅作为个人笔记使用)
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接口,数据结构是红黑书(自平衡的排序二叉树,还没接触过),是一种Set的变体,可以实现排序等功能的集合,他在添加元素到集合中时,会自动按照某种比较规则将其插入到有序的对象序列中,并保证“升序”排列;
2、HashSet:实现Set接口,其底层是基于HashMap实现的。HashSet底层采用HashMap来保存所有元素,所有放入HashSet中的元素实际上由HashMap的key来保存,而value则存储了一个静态的Object的类;