面试_容器

1.Java容器有哪些?

java容器分为Collection和Map两大类,其下又有很多子类


2.Collection和Collections有什么区别?

  • Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List,Set等
  • Collections是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,提供了很多方法,比如排序

3.List、Set、Map之间的区别是什么?

List、Set、Map的区别主要体现在两个方面:元素是否有序、是否允许元素重复
三者之间的区别,如下表:
在这里插入图片描述

3.HashMap和Hashtable的区别?

  • 存储:HashMap允许key和value为null,而Hashtable不允许
  • 线程安全:Hashtable是线程安全的,而HashMap是线程不安全的

推荐使用:在Hashtable的类注释中,我们发现Hashtable是保留类不建议使用,推荐在单线程环境下使用HashMap替代,如果多线程则使用ConcurrentHashMap代替


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

对于在Map中插入、删除、定位一个元素这类操作,HashMap是最好的选择,因为相对而言HashMap的插入会更快,但如果你要对一个key集合进行有序的遍历,那TreeMap是更好的选择.
Java中HashMap和TreeMap的区别深入理解


5.HashMap实现原理

基于Hash算法实现,通过put(key,value)存储,通过get(key)获取,当传入key时,会根据key.hashCode()计算出hash值,根据hash值将value保存到bucket里,当计算出的hash值相同时,我们称之为hash冲突,hashMap的做法是用链表和红黑树存储相同hash值的value(当hash冲突个数比较少时,使用链表否则使用红黑树)


6.HashSet实现原理

HashSet是基于HashMap实现的,HashSet底层用了HashMap来保存所有元素,因此HashSet的实现比较简单


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

  • 数据结构实现:ArrayList是动态数组的数据结构实现,而LinkedList是双向链表的数据结构实现
  • 随机访问效率:ArrayList比LinkedList的随机访问效率高
  • 增删效率:在非首尾的增加和删除操作,LinkedList的效率比ArrayList高,因为ArrayList增删操作影响数组内其他数据的下标

总结:
在频繁读取集合中元素时,推荐使用ArrayList,而当频繁增删时,推荐使用LinkedList


8.实现数组和List间转换

  • 数组转List:使用Arrays.asList(array)进行转换
  • List转数组:使用List自带的toArray()方法

9.ArrayList和Vector的区别是什么?

  • 线程安全:Vector使用Synchronized来实现线程同步,是线程安全的,而ArrayList是非线程安全的
  • 性能:ArrayList在性能方面要优于Vector
  • 扩容:ArrayList和Vector都会根据实际的需要动态的调整容量,只不过在Vector扩容每次会增加一倍,而ArrayList只会增加50%

10.Array和ArrayList有何区别?

  • Array可以存储基本数据类型和对象,ArrayList只能存储对象
  • Array指定固定大小,ArrayList大小是自动扩容
  • Array内置方法没有ArrayList多,比如addAll,removeAll,iteration等方法只有ArrayList有

11.Queue中poll()和remove()有什么区别?

  • 相同点:都是返回第一个元素,并在队列中删除返回的对象
  • 不同点:如果没有元素,poll()会返回null,而remove()会直接抛出NoSuchElementException

12.哪些集合类是线程安全的?

Vector、Hashtable、Stack都是线程安全的,而像HashMap则是线程不安全的,在JDK 1.5之后,我们也有了线程安全的集合,比如ConcurrentHashMap.


13.迭代器Iterator是什么?

Iterator接口提供遍历任何Collection的接口,我们可以从一个Collection中使用迭代器方法来获取迭代器实例,迭代器取代了Java集合框架中Enumeration,迭代器允许调用者在迭代过程中移出元素.


14.Iterator怎么使用?有什么特点?

在这里插入图片描述
Iterator的特点是更安全,因为他确保了在当前遍历的集合元素被更改时,会抛出ConcurrentModificationException,如果使用常用的for循环遍历,是无法检测到多线程问题的


15.Iterator和ListIterator的区别?

  • Iterator可以遍历set和list集合,而ListIterator只能遍历list
  • Iterator只能单向遍历,而ListIterator可以双向遍历(向前/后遍历)
  • ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素,替换一个元素,获取前面或者后面元素的索引位置

16.怎么保证一个集合不能被修改?

可以使用Collections.unmodifiableCollection(Collection c)方法创建一个只读集合,之后改变集合的任何操作都会抛异常
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_24099547/article/details/90323580