以下回答均为个人的一些理解和看法,本人才疏学浅,如有错误,恳请指出。
1.java 容器都有哪些?
2.Collection 和 Collections 有什么区别?
Collection
是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection
接口在Java
类库中有很多具体的实现。Collection
接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List
与Set
。
Collections
则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
3.List、Set、Map 之间的区别是什么?
List
:元素有序、可重复的集合
Set
:元素无序、不可重复的集合
Map
:双列数据,保存具有映射关系“key-value”键值对的集合
4.HashMap 和 HashTable 有什么区别?
HashTable
是线程安全的。
HashTable
不允许key
和value
为null
。
5.如何决定使用 HashMap 还是 TreeMap?
当集合存储大量无序对象时,使用HashMap
。
当集合存储对象需要排序有序时,使用TreeMap
。
6.说一下 HashMap 的实现原理?
7.说一下 HashSet 的实现原理?
8.ArrayList 和 LinkedList 的区别是什么?
ArrayList
对应数据结构中的顺序表
。
其底层是一个数组。
由于顺序表的特点,随机访问方便,时间复杂度为O(1)
,但增加和删除复杂度较高。
LinkedList
对应数据结构中的链表
。其底层是一个双向链表。增加和删除方便,只需修改指针
(索引)即可。但查找时需遍历,单链表需从头遍历,时间复杂度O(n)
,故引入双向链表牺牲一部分指针(引用)域
,来增加效率。
9.如何实现数组和 List 之间的转换?
/**
* 数组转换为ArrayList
* 注意:ArrayList中只能存对象
* java.util.Arrays.ArrayList下有一个ArrayList子类,不能直接强转类型。
* asList方法返回的是一个List,所以可以通过两步来将它转换成java.util.ArrayList的类型。
*/
public ArrayList arrToList(Integer [] arr) {
return new ArrayList(Arrays.asList(arr));
}
/**
*ArrayList转换为数组
*/
public Object[] listToArr(ArrayList list){
return list.toArray();
}
10.ArrayList 和 Vector 的区别是什么?
Vector
是同步的,而ArrayList不是。然而,如果寻求在遍历的时候对列表进行改变,应该使用CopyOnWriteArrayList
。
ArrayList
比Vector
快,它因为有同步,不会过载。
ArrayList
更加通用,Collections
工具类轻易地获取同步列表和只读列表。
11.Array 和 ArrayList 有何区别?
Array
可以容纳基本类型和对象,而ArrayList
只能容纳对象。
Array
是指定大小后不可变的,而ArrayList
大小是可变的。
Array
没有提供ArrayList
那么多功能,比如addAll
、removeAll
和iterator
等。
12.在 Queue 中 poll()和 remove()有什么区别?
poll()
和 remove()
都是从队列中取出一个元素。
poll()
在获取元素失败的时候会返回空。
remove()
失败的时候会抛出异常。
13.哪些集合类是线程安全的?
Vector
、HashTable
、Enumeration
、Statck
14.迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Iterator
仅用于遍历集合,Iterator
本身并不提供承装对象的能力。
如果需要创建Iterator
对象,则必须有一个被迭代的集合。
集合对象每次调用iterator()
方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
15.Iterator 怎么使用?有什么特点?
terator
功能比较简单,并且只能单向移动:
(1) 使用方法iterator()
要求容器返回一个Iterator
。第一次调用Iterator
的next()
方法时,它返回序列的第一个元素。注意:iterator()
方法是java.lang.Iterable
接口,被Collection
继承。
(2) 使用next()
获得序列中的下一个元素。
(3) 使用hasNext()
检查序列中是否还有元素。
(4) 使用remove()
将迭代器新返回的元素删除。
Iterator
是Java
迭代器最简单的实现,为List
设计的ListIterator
具有更多的功能,它可以从两个方向遍历List
,也可以从List
中插入和删除元素。
16.Iterator 和 ListIterator 有什么区别?
Iterator
可用来遍历Set
和List
集合,但是ListIterator
只能用来遍历List
。
Iterator
对集合只能是前向遍历,ListIterator
既可以前向也可以后向。
ListIterator
实现了 Iterator
接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
17.怎么确保一个集合不能被修改?
使用如下方法创建集合
Collections. unmodifiableCollection(Collection c)
Arrays.asList