容器

1.Java容器有哪些?

  Collection

List

  • ArrayList
  • LinkedList
  • Vector
  • Stack

Set

  • HashSet
  • LinkedHashSet
  • TreeSet

  Map

  • HashMap
  • LinkedHashMap
  • TreeMap
  • ConcurrentHashMap
  • Hashtable

2.Collection和Collections是有什么区别?

  Collection:是一个集合接口,它提供了对集合对象进行进步操作的通用接口方法,所有集合都是它子类,比如List、Set等。

  Collentions:是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法:Collentions.sort(list)。

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

  List:元素是有序的,允许重复。

  Set:元素是无序的,不允许重复。

  Map:元素是无序的,key(是唯一的)不允许重复value允许重复。

4.HashMap和Hashtable有什么区别?

储存:HashMap允许key和value为null,Hashtable不允许。

线程安全:Hashtable是线程安全的,HashMap是非线程安全的。

  Hashtable是保留类不建议使用,推荐在单线程的情况下使用HashMap替代,多线程的情况下使用ConcurrentHashMap替代。

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

  对于在Map中插入、删除、定位一个元素这些操作,HashMap是最好的选择,因为HashMap的插入会比TreeMap快,但要对key集合进行有序的遍历,那么TreeMap则是更好的选择。

6.说一下HashMap实现原理

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

7.说一下HashSet的实现原理

  HashSet是基于HashMap实现的,HashSet底层使用HashMap保存所有元素,因此HashSet的实现比较简单,相关HashSet操作基本都是直接调用底层HashMap的相关方法来完成,HashSet不允许值重复。

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

数据结构实现:ArrayList是动态数组的数据结构实现,LinkedList是双向链表的数据结构实现。

随机访问效率:ArrayList比LinkedList在随机访问的时候效率要高,因为LinkedList是线性的存储方法,所以需要移动指针从前往后依次查找。

新增和删除效率:在非首尾的新增和删除操作,LinkedList比ArrayList效率要高,因为ArrayList的增删操作会影响数组内的其他数据下标。

  需要频繁读取集合中的元素时,推荐使用ArrayList,而在新增和删除操作较多时,更推荐使用LinkedList。

9.如何实现数组和ArrayList的转换?

  数组转List:使用Arrays.asList(array)进行转换。

  List转数组:使用List自带的toArray()方法。

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

  线程安全:ArrayList是非线程安全的,Vector使用了Synchronized来实现线程同步,是线程安全的。

  性能:ArrayList在性能方面要优于Vector。

  扩容:Vector每次扩容都会增加一倍,而ArrayList只会增加50%。

11.Array和ArrayList有什么区别?

Array可以存储基本数据类型和对象,ArrayList只能存储对象。

Array是指定固定大小的,而ArrayList大小可以自动扩展。

Array内置方法没有ArrayList多,比如addAll、removeAll。

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

相同点:都是返回第一个元素,并在队列中删除。

不同点:如果没有元素poll方法会返回一个null,remove方法会直接抛出NoSuchElementException(无此元素)异常。

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

  Vector、Hashtable、Stack和JDK1.5之后提供的ConcurrentHashMap都是线程安全的。

14.迭代器Iterator是什么?

  Iterator接口提供了遍历任何Collection的接口,可以从Collection中使用迭代器方法获取Iterator实例,迭代器允许调用者在迭代过程中删除元素。

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

  Iterator的使用示例如下

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext){
  String obj = it.next();
  System.out.pringln(obj);      
}
View Code

  Iterator的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException(并发修改)异常。

16.Iterator和ListIterator有什么区别?

Iterator可以遍历List、Set集合,而ListIterator只能遍历List集合。

Iterator只能单向遍历,ListIterator可以双向遍历(向前/向后)。

ListIterator从Iterator接口继承,然后添加了一些额外的功能,例如添加一个元素、替换一个元素等。

17.怎么确保一个集合不能被修改?

  可以使用Collections.unmodifiableCollection(Collection c)(Collections的不可修改的集合)方法创建一个只读集合,这样改变集合的任何操作都会抛出java.lang.UnsupportedOperationException(不支持的操作)异常。

  示例如下

List<String> list = new ArrayList<>();
list.add("x");
Collection<String> clist = Collections.unmodifiableCollection(list);
clist.add("y");
System.out.println(list.size());
View Code
原文地址:https://www.cnblogs.com/bl123/p/14979434.html