Java容器面试题——查缺补漏

目录

18.Java容器都有哪些?

19.Collection 和 Collections 有什么区别?

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

21.HashMap 和Hashtable 有什么区别?

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

23.说一下HashMap的实现原理?

24.说一下HashSet的实现原理?

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

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

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

28.Array 和ArrayList有什么区别?

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

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

31.迭代器Iterator是什么?

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

33.Iterator和ListIterator有什么区别?

 另附个人总结常见集合表:


18.Java容器都有哪些?

 

19.Collection 和 Collections 有什么区别?

(1)java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义在于为各种具体的集合提供最大化的同一操作方式,其直接继承接口有List 和 Set

(2)Collections是集合类的一个工具类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

 

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

21.HashMap 和Hashtable 有什么区别?

(1)HashMap非线程安全的;Hashtable是线程安全的

(2)HashMap是非同步的;Hashtable是同步的

(3)HashMap允许空键值;Hashtable不允许空键值

(4)HashMap去掉了Hashtable的contains( )方法,但是加上了containsValue( )和containsKey( )方法

(5)HashMap初始化容量为16,扩容是原来的两倍;HashMap初始化容量为11,扩容是原来的 *2+1

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

对于Map中插入、删除和定位元素这类操作,HashMap是最好的选择。

然而假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择

23.说一下HashMap的实现原理?

(1)HashMap概述:是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许键值使用null。此类不保证映射的顺序,也就是无序的!   特点即:无序不可重复!

(2)HashMap的数据结构:“哈希表单向链表”数据结构,即数组和链表的结合体

(3)map.put(k, v)实现原理:先将k,v封装到Node对象上,如何调用k的hashCode()方法得出哈希值,然后通过哈希算法转换为数组的下标。如果下标位置上没有元素,就把Node添加到这个位置;如果说下标位置上有链表,此时会拿着k和链表上每一个节点的k进行equals(),如果所有的equals()都返回false,则新节点将被添加到链表的末尾;如果其中一个equals()返回true,那么这个节点的value将会被覆盖。

(4)map.get( k )实现原理:先调用k的hashCode()方法得出哈希值,通过哈希算法转换为数组的下标,通过数组下标可以快速定位到某个位置上,如果这个位置上什么也没有,则get方法返回null;如果这个位置上有单向链表,那么会拿着k和链表上的每个节点的k进行equals(),如果都返回false,那么get方法返回null;只要其中一个节点的k跟参数k的equals()返回true,那么这个节点的value就是我们要找的value,get方法最终返回这个value。

(5)注意jdk1.8对HashMap进行了优化:如果单向链表的节点个数超过八个,则会转变为红黑树来提高查询效率,从原来的 O( n )到 O( logn );当红黑树上节点少于六个的时候,重新将红黑树转换为单向链表。

24.说一下HashSet的实现原理?

(1)HashSet底层由HashMap实现

(2)HashSet的值放在HashMap的key上

(3)HashMap的value统一为PRESENT

(4)特点:无序不可重复

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

(1)最明显的区别就是底层数据结构不同:ArrayList底层是数组、LinkedList底层是双向链表。

(2)ArrayList 查找的时间复杂度为O( 1 ) ; LinkedList 查找的时间复杂度为 O( n )

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

(1)List转换为数组:调用ArrayList的toArray( )方法

(2)数组转换为List:调用Arrays的asList( )方法

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

(1)ArrayList是非线程安全的;Vector是线程安全的

(2)ArrayList比Vector效率高。

(3)ArrayList更加通用,我们可以通过Collections工具类轻易的获取同步列表和只读列表

28.Array 和ArrayList有什么区别?

(1)Array可以容纳基本类型和对象;ArrayList只能存储对象

(2)Array是指定大小的,而ArrayList大小是固定的

(3)Array没有提供ArrayList那么多功能,比如addAll( )、removeAll( )、iterator( )等

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

poll( ) remove( )都是从队列中取出一个元素,但是poll( )在获取失败的时候会返回空,而remove( )失败会抛出异常。

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

(1)Vector:效率太低

(2)Statck:堆栈类,先进后出

(3)Hashtable:比HashMap多了一个线程安全

(4)Properties:key-value只支持String类型

(5)enumeration:枚举,相当于迭代器

31.迭代器Iterator是什么?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

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

特点:单向移动!!

(1)使用方法iterator( ) 要求容器返回一个Iterator。第一次调用Iterator的next()方法时,返回的是第一个元素。注意:iterator() 是java.lang.Iterable接口,被Collection继承。

(2)使用next()获取下一个元素

(3)使用hasNext()检查序列是否还有下一个元素

(4)使用remove()将迭代器新返回的元素删除。

注意:Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

33.Iterator和ListIterator有什么区别?

(1)Iterator用来遍历Set和List集合。但是ListIterator只能用来遍历List

(2)Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向

(3)ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素、替换元素、获取前一个后后一个的索引.....

 另附个人总结常见集合表:

发布了42 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43930694/article/details/105399130
今日推荐