1.java 容器都有哪些?
2.Collection 和 Collections 有什么区别?
- java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
- java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
3.List、Set、Map 之间的区别是什么?
- List:有序集合
- Set:不重复集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet无序
- Map:键值对集合
4.HashMap 和 Hashtable 有什么区别?
- 1. 线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
- 2. 效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
- 3. 对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
- 4. 初始容量大小和每次扩充容量大小的不同 : ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的 tableSizeFor() 方法保证,下面给出了源代码)。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。
- 5. 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
5.说一下 HashMap 的实现原理?
- HashMap由数组+链表组成的,HashMap是基于Hash算法实现的,我们通过put(key,value)存储数据,通过get(key)来获取数据
- 当传入key时,HashMap会根据Key.hashCode()计算出Hash值,根据Hash值将value保存在bucket里。
- 当计算出相同的Hash值时,我们称之为Hash冲突,HashMap 的做法是用链表和红黑树存储相同Hash值的value,
- 当hash冲突的个数比较少时,使用链表存储,否则使用红黑树。
6.说一下 HashSet 的实现原理?
HashSet是基于HashMap实现的,HashSet 底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet 的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet不允许有重复的值,并且元素是无序的。
7.ArrayList 和 LinkedList 的区别是什么?
- 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
8.如何实现数组和 List 之间的转换?
- List转数组:toArray(arraylist.size()方法
- 数组转List:Arrays的asList(a)方法
9.ArrayList 和 Vector 的区别是什么?
- Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
- 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
10.Array 和 ArrayList 有何区别?
- Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
- Array大小是固定的,ArrayList的大小是动态变化的。
11.在 Queue 中 poll()和 remove()有什么区别?
poll()和remove()都将移除并且返回对头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。
12.哪些集合类是线程安全的?
- Vector
- Stack
- Hashtable
- java.util.concurrent包下所有的集合类,例如,ConcurrentHashMap
13.迭代器 Iterator 是什么?
- 首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。
- Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
- 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。
14.Iterator 和 ListIterator 有什么区别?
(1)所属关系,ListIterator是一个Iterator的子类型。
(2)局限:只能应用于各种List类的访问。
(3)优势:Iterator只能向前移动,而ListIterator可以双向移动。还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引nextIndex()、previousIndex()方法。还可以通过set()方法替换它访问过的最后一个元素。还可以通过调用listIterator()方法产生一个指向List开始处的ListIterator,当然也可以有参数,即指向索引为参数处的ListIterator。
(4)ListIterator 有 add() 方法,可以向 List 中添加对象,而 Iterator 不能。
15.怎么确保一个集合不能被修改?
可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。