面试必问 Java集合框架

集合

1. java有哪些常用容器?

核心: java容器分为Conllection和Map两大类
>分支1:
           Conlllection有List集合和Set集合
分支1-1-0:
           List集合:ArrayList集合(基于数组实现的有序集合),LinkedList(基于链表实现的有序集合),AbstractList(有序集合的最小化抽象实现),Vector
分支1-1-1:
           Set集合:AbstratSet(不重复集合的最小化抽象实现),HashSet(基于hash实现的不重复集合,无序),LinkedHashSet(基于hash实现的不重复集合,有序),TreeSet(基于红黑树实现的可排序不重复集合)
           Queue------略
分支2:
           Map集合
分支2-1-0:
           AbstratMap(键值映射集合最小化抽象实现),Hashtable(基于哈希表实现的健值映射集合,key,value均不可为null),HashMap(类似于Hashtable,但是方法不同步,key,value可为null),LinkedHashMap(根据插入顺序实现的健值映射集合)。

2. ArrayList和Vector的联系和区别是什么?

相同点:
底层都是使用数组进行实现的,他们的功能相同,增删改查等操作的方法相似,都是长度可变的数组结构
不同点:
Vector是早期JDK版本提供的,ArrayList是新版本替代Vector的。
Vector的方法都是i同步的,线程安全;ArrayList是非线程安全的,但是性能比Vector好
默认初始容量都是10,Vecotor扩容默认会翻倍,可指定扩容的大小;ArrayList只增加50%

3. Collection和Collections有什么区别?
Collection是JDK中集合层次结构中的最根本的接口。定义了集合类的基本方法。Collections是一个包装类。它包含了各种有关的集合操作的静态多态方法,不能实力话,它是Collection集合框架的工具类。
4. List Set Map之间的区别是什么?
List是有序集合,元素可以重复
Set是不可重复集合,LinkedhashSet按照插入排序,HashSet无序。
Map是键值对集合,存储健,值,和之间的映射;key无序,唯一。value不要求有序,允许重复

5.HashMap和Hashtable有什么区别?

线程安全性不同。HashMap是非线程安全的,Hashtable是线程安全的
key,value是否允许null值。HashMap的key,value允许null,Hashtable的key和value都不允许null值。
迭代器不同。HashMap使用的是fail-fast迭代器;Hashtable还使用了enumertor迭代器。
hash的计算方式不同。HashMap计算了hash值;hashtable使用了key的hashCode方法。
默认的初始大小和扩容方式不同。HashMap默认初始大小为16,容量必须是2的整数次的幂,扩容时将同量变为原来的2倍;Hashtable默认初始大小是11,扩容将容器变为原来的2倍+1
是否有conatins方法。HashMap有,Hashtable没有
他们俩不是同一个爹。HashMap的爹是AbstratMap;Hashtable的爹是Dictionary。

6. 如何决定使用HashMap还是TreeMap?

HashMap基于散列桶(数组+链表)实现;TreeMap基于红黑树实现。
HashMap不支持排序;TreeMap默认是按照Key值升序排序的,可指定排序的比较器,主要用于存入元素进行自动排序。
HashMap大多数情况下有更好的性能,尤其是读数据。在没有排序要求的情况下,使用HashMap。

7. ArrayList和LinkedList的区别是什么?

底层:
区别1-----实现。ArrayList基于数组实现的,LinkedList基于链表进行实现的
区别2-----扩容。ArrayList初始化长度10,扩容之后是原来的1.5倍。LinkedList不存在扩容空间,新增元素放在集合尾部,修改响应的指针节点即可。
区别3----内存。LinkedList比ArrayList更占内存空间,因为LinkedList为咩一个节点存储了两个引用节点,一个指向前一个元素,一个指向下一个元素。
区别4-----查找,删除。ArrayList是根据数组下边直接找到元素,所以这个集合查找数据比较快。LinkedList如果要是查找的话是遍历每个元素直到找到为止。当对数据更改的时候LinkedList要比ArrayList强势,毕竟他是使用链表进行存储数据的,当我们进行新增或者删除数据的时候,他是直接修改元素的指针就可以了,但是ArrayList 新增 也好 删除也罢,往后的数据都得重新进行更改。

这俩集合都是非线程安全的,允许存放null

  1. 如何实现数组和List之间的转换?

数组->List (java.util.Arrays的 asList方法)
List->数组(List的toArray方法)

8.迭代器iterator是什么?

迭代器他是Java中常用的设计模式之一。用于顺序访问集合对象的元素,无序知道集合对象的底层实现。
itrator是可以便利集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
缺点就是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

上一篇:Java 为什么不支持泛型数组?


下一篇:第二章 链表 逆序输出带头结点的节点值