Java面试题------集合
1.Java容器都有哪些?
- List: ArrayList、LinkedList、Vector、Stack
- Set: HashSet、TreeSet
- Queue(队列)
- Map: HashMap、TreeMap、hashtable
2.Collection和Collections有什么区别?
- Collection是所有集合的超类,是一个集合接口,提供了对集合对象进行基本操作的接口方法。
- Collections是集合的工具类,它提供了各种有关集合的操作的静态方法。此类不能实例化,服务于java的集合框架。
3.List、Set、Map之间的区别是什么?
- List集合是单列数据集合,存储的数据是有序的并且存储的元素可以重复,可直接通过下表定位该元素。
- Set集合也是单列数据集合,存储的数据是无序的,并且存储的元素不可以重复,不能通过下表查找元素。
- Map集合是存储键值对双列数据,存储的数据键不可以重复,值可以重复,存储的顺序是无序的。
4.HashMap和Hashtable有什么区别?
- 线程安全方面:HashMap是线程不安全的,Hashtable是线程安全的,高并发是Hashtable会加锁操作。
- 存储内容:HashMap可以存储null值,Hashtable不可以存储null值
- 数组初始化和扩容方式:HashMap初始容量为16,扩容时要求一定为2的整数次幂。Hashtable初始容量为11,扩容时为原来长度的2倍加1
- Hash值计算不同:HashMap不会引用对象的hashcode,而会重新计算hash值,Hashtable会直接引用对象的hash值。
5.如何决定使用HashMap还是TreeMap?
- HashMap的key值是hashCode散列分布再存在对应的链表或红黑树
- TreeMap的key值是通过实现Comparable接口,在遍历前按照key排序规则进行了排序,TreeMap的实现也是基于红黑树。
- 如果需要存储排序的话使用TreeMap,如果不需要排序,则选择性能好的HashMap。
6.说一下HashMap和HashSet的实现原理?
- HashMap底层是用数组加链表实现的,数组是HashMap的主体,链表则是解决hash值冲突而存在。当一个元素存进来时,会计算出一个hash值对应桶(数组)的一个位置,在这个位置后的链表中存储,当链表长度过长,则会扭转成红黑树。
- HashSet底层通过HashMap实现的,即也是数组加链表,HashSet的值存放在HashMap的key上,而value统一是静态常量。
7.ArrayList和LinkedList的区别是什么?
- ArrayList是线性表(动态数组),它存储元素地址是连续的可以通过下标找到对应的元素,所以ArrayList查找快,插入删除慢。
- LinkedList是链表,他存储元素地址不是连续的,不可以通过下标查找值,一个链表元素处理存储值外还存储了前一个对象的地址值和下一个元素的地址值。所以,它更占内存。他的查找效率慢,增加删除快。
8.ArrayList和Vector的区别是?
- 线程安全:ArrayList线程不安全,Vector线程安全,在操作Vector时该集合会被加上锁。
- 扩容方面:ArrayList在扩容时是增加原长度的1.5倍,而Vector在扩容时增加原长度的2倍。
- transient:ArrayList的内部缓存数组是用transient来修饰,表示该元素不会参与序列化,而Vector缓存数组没有使用transient修饰,将参与序列化。
9.哪些集合类是线程安全的?
- Vector、Hashtable、ConcurrentXXX一些并发的集合类
10.迭代器Iterator是什么?
- 迭代器是遍历集合的一个对象,是一个轻量级对象,集合的数据结构底层也都不一样,所以迭代器对集合遍历提供一个统一的方式。遍历过程中可以对集合元素删除操作,但是不能调用集合本身的remove方法,而是去掉用迭代器身上的remove方法去删除底层集合元素。