面试-集合

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

答:①List以特定索引来存取元素,可以有重复元素。

②Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。

③Map保存键值对映射,映射关系可以是一对一或者是多对一。

Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键构成排序树从而达到排序和去重的效果。

二、阐述ArrayList、Vector、LinkedLIst的存储性能和特性。

答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上比较ArrayList差,因为已经是java中的遗留容器。

LinkedList使用的是双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

Vector属于遗留容器,已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用。

三、请判断LIst、Set、Map是否继承自Collection接口?

答:List、Set是,Map不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素,List是线性结构的容器,适用于按数值索引访问元素的庆幸。

四、请你讲讲你所知道的常用集合类以及主要方法?

答:常用的集合类是List和Map。

LIst的具体实现包括ArrayList和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。

Map提供了一个更通用的元素存储方法。Mqp集合类用于存储元素对,其中每个键映射到一个值。

五、请说明Collection和Collections的区别?

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

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

六、请简要说明ArrayList,Vextor,LinkedList的存储性能和特性是什么?

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

七、请说明ArrayList和LinkedList的区别?

答:ArrayList和LinkedList都实现了List接口,它们有以下的不同点:

ArrayList是基于索引的数据接口,它的底层是数组,它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要想数组那样重新计算大小或者是更新索引。

LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

八、请你说明HashMap和HashTable的区别?

答:①HashMap允许键和值是null,而HashTable不允许键或者值为null。

②HashTable是线程安全的,适合于多线程环境。而HashMap不是线程安全的,适合单线程环境。

九、请你说说Iterator和ListIterator的区别?

答:①Iterator可用来遍历Set和List集合,但ListIterator只能用来遍历List.

②Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

③ListIterator实现了Iterator接口,并包含其他功能,比如:增加元素,替换元素,获取前一个和后一个元素,等等。

十、请你简单说明一下什么是迭代器?

答:Iterator提供了同一遍历操作集合元素的统一接口,Collection接口实现Iterable接口,每个接口都通过实现Iterable接口中的iterator()方法返回Iterator接口的实例,然后对集合的元素进行迭代操作。

十一、 请解释为什么集合类没有实现Cloneable和Serializable接口?

答:克隆或者可序列化的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现类来决定如何被克隆或者是序列化。

实现序列化的作用:将对象的状态保存在存储媒体中以便可以在以后重写创建出完全相同的副本;按值将对象从一个从一个应用程序域发向另一个应用程序域。

实现序列化接口的作用就是可以把对象存在字节流,然后可以恢复。所以你想如果你的对象没有序列化,怎莫才能进行网络传输呐?要网络传输就得传唤为字节流,所以在分布式应用中,你就得实现序列化。如果你不需要分布式应用,把就没必要实现序列化。

十二、请说明java集合类框架的基本接口有哪些?

答:Collection"代表一组对象,每一个对象都是它的子对象。

Set:不包含重复元素的Collection。

List:有顺序的collection,并且可以包含重复元素。

Map:可以把键映射到值的对象,键不能重复。

十三、请你解释一下TreeMap?

答:TreeMap是一个有序的key-value集合,基于红黑树的NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。

TreeMap的特性:

根节点是黑色,每个节点都只能是红色或者是黑色,每个叶节点是黑色的。如果一个节点是红色的,则它两个子节点都是黑色的,也就是说在一条路径上不能出现两个红色的节点。

从仁义节点到其每个叶子的所有路径都包含相同数目的黑色节点。

十四、请说明ArrayList是否会越界?

答:ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构,对于随机访问的get和set,ArrayList要优于LInkedList要移动指针;ArrayList并发add()可能出现数组下表越界异常。

十五、请你说明一个TreeMap的底层实现?

答:TreeMap的实现就是红黑树数据结构,也就是说是一颗自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。

红黑树的插入、删除、遍历时间复杂度都为O(lgN),所以性能上低于哈希表。但是哈希表无法提供键值对的有序输出,红黑树因为是排序插入的,可以按照键的值的大小有序输出。红黑树性质:

①每个节点要么是红色,要么是黑色。

②根节点永远是黑色的。

③所有的叶节点都是空节点,并且都是黑色的。

④每个红色节点的两个子节点都是黑色。

⑤从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。

十六、请你简单介绍一下ArrayList和LinkedList的区别,并说明如果一直在list的尾部添加元素,用哪种方式的效率高?

答:ArrayList采用数组实现的,查找效率比LinkedList采用双向链表实现的,插入和删除的效率比ArrayList要高。一直在list的尾部添加元素,LinkedLIst效率要高。

十七、如果HashMap的key是一个自定义的类,怎么办?

答:使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。

十八、请你解释一下hashMap具体如何实现的?

答:HashMap基于数组实现,通过对key的hascode,数组的长度得到在数组中位置,如当前数组有元素,则数组当前元素next指向要指向要插入的元素,这样要解决hash冲突的,形成了拉链式的结构。put时在多线程情况下,会形成环从而导致死循环。数组长度一般是2n,从0开始编号,所以hashcode&(2n-1),(2n-1)每一位都是1,这样会让散列均匀。

需要注意的是,HashMap在JDK1.8版本中引入了红黑树结构做优化,当链表元素个数大于等于8,链表转换成树结构;若桶中链表元素个数小于等于6时,树结构还原成链表。因为红黑树的平均查找长度是log(n),长度为8的时候,平均查找长度是3,如果继续使用链表,平均查找长度为8/2=4,这才有转换为树的必要。链表长度如果小于等于6,6/2=3,虽然速度是很快的,但是转换为树结构和生成树的时间并不会太短。还有选择6和8,中间有个差值7可以有效防止链表和树频繁转换。假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停地插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表,链表转树,效率就会很低。

发布了17 篇原创文章 · 获赞 26 · 访问量 7430

猜你喜欢

转载自blog.csdn.net/qq_41629684/article/details/104070393
今日推荐