天天看点

集合常见问题总结

集合整体框架图

集合常见问题总结

Collection接口:它是一组允许重复的对象

Map接口:是一组以键值为对象,不能有重复的Key,有自己的内部排列机制。

Set接口:继承Collection接口,但不允许重复,且是无序的,它有自己内部的一个排列机制。

List接口:继承Collection 接口,允许重复,而且是有序的,它是以元素的安插次序来放置元素,不会重新排列。

Heap(堆)和stack(栈)的区别

栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享

堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢

简单来说栈的存储数据比堆快,栈的数据大小与生命周期是确定的,而堆是动态分配的。栈的数据是可以共享的,而堆不是。

List, Set, Map是否继承自Collection接口? 

List,Set是,Map不是

Collection 和 Collections的区别

Collection是集合类的上级接口,继承与他的接口主要有Set 和List

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快

HashMap和Hashtable的区别

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异

简单来说: hashMap是hashtable的轻量级实现,hashMap是非线程安全的,是允许有空的key值,hashtable是线程安全的,不允许有空值。

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

set里的元素是不能重复的,Iterator()区分重复与否,用equals()判断两个set时候相等,==比较的是2个对象的地址,而equals比较的是2个对象的内容。

==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

List、Map、Set三个接口,存取元素时,各有什么特点?

List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值

什么是HashSet和HashMap的负载因子?

容量Capacity:哈希表中桶的数量

初始容量Initial Capacity:创建对象时桶的数量

大小Size:元素的数目

负载因子Load Factor:等于Size/Capacity