目录
19.Collection 和 Collections 有什么区别?
25.ArrayList 和 LinkedList的区别是什么?
29.在Queue中poll( )和remove( )有什么区别?
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接口,并包含其他的功能,比如:增加元素、替换元素、获取前一个后后一个的索引.....
另附个人总结常见集合表: