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); }
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());