常见面试题
- 集合
- 1. 介绍一下集合类框架?
- 2.数组和对象的区别?
- 3. Collection和Collections的差别?
- 4. LinkedList与ArrayList有什么差别?
- 5.ArrayList与Vector的差别?
- 6. HashMap和HashTable的区别?
- 7.List与Map的差别?
- 8.List、set、map三个接口,存取元素时有什么特点?
- 9.什么是iterator?
- 10.集合框架中的泛型有什么优点?
- 11. 哪些集合提供对元素的随机访问?
- 12.哪些集合类是线程安全的?
- 13.你如何选择集合类框架的使用?
- 14. 两个对象的值相同(x.equals(y)==true),但是有不同的hashCode,这句话对不对?
- 15. 集合类常用方法?
集合
1. 介绍一下集合类框架?
- 首先,集合类框架经常使用的是继承Collection接口,和继承Map接口的两个体系。
- Collection接口:Collection接口的常见的实现接口为List,Set。
-
List : List接口的实现类主要有ArrayList、LinkedList以及Vector
- 有序、可重复。
- ArrayList:就是一个可扩容的对象数组,是线程不安全的。
- LinkedList:是一个双向链表。
- Vector:是线程安全的(ArrayList不是线程安全的)。
- 线程安全:加锁就是安全的,不加锁就是不安全的;就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
-
Set:Set接口的主要实现类HashSet、TreeSet、LinkedHashSet:
- 无序、不可重复。
- HashSet:实现基于HashMap,实际上就是HashMap中的Key;
- TreeSet:低层由TreeMap实现;
- LinkedHashSet:低层由LinkedHashMap实现;
- Map接口:实现类常见有HashMap、TreeMap、HashTable等;map接口的特点是存储方式都是键值对,键不可以重复,值可以重复。
- HashMap:的底层是基于哈希表来实现的, 往HashMap中添加元素的时候,首先会调用hashCode方法得到元素的哈希码值,经过运算可以得到该码在哈希表中的位置。它是线程不安全的。
- TreeMap是基于二叉树来实现的,会对元素的键进行排序。
- HashTable底层和HashMap原理一样,都是哈希表,但是是线程安全的。
2.数组和对象的区别?
- 数组特点:大小固定,只能存储相同数据类型的数据
- 集合特点:大小可动态扩展,可以存储各种类型的数据
- 数组转换为集合:Arrays.asList(数组)
3. Collection和Collections的差别?
- 他俩都是java.util包下的。
- Collection是一个集合接口,它底下有很多集合的实现。
- Collections是一个集合的帮助类,提供了一系列的静态方法对集合进行搜索、排序、线程安全化的操作。
4. LinkedList与ArrayList有什么差别?
- 他俩都是实现了List接口,都是有序可重复的。
- ArrayList是基于动态数组,LinkedList是基于链表。
- 所以ArrayList的查效率高,可以根据下标直接定位查询,但是增删改的效率低,因为要移动数据。
- LinkedList的增删改效率高,但是查的效率低,因为它必须得从链表的一端开始逐一遍历。
5.ArrayList与Vector的差别?
- 他连都是实现了List接口,都是有序可重复的。
- ArrayList是线程不安全的,Vector是线程安全的。所以ArrayList的执行效率高于vector
- 当向一个集合中添加元素时,超过他俩的初始容量时,ArrayList每次添加原来的0.5倍,vector添加为原来的1倍,并且vector提供我们自己来设置存储空间增长的大小。
- HashTable相比于HashMap也是支持多线程的操作而导致性能不如HashMap。
- 线程安全:加锁就是安全的,不加锁就是不安全的;就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据;
6. HashMap和HashTable的区别?
- 两者都实现了Map接口,都是以键值对来存储数据。并且key值都不重复。
- HashMap是线程不安全的,HashTable是线程安全的。
- HashMap支持空的key和value,HashTable不支持。
7.List与Map的差别?
- List是存储单链数据的集合,而map是存储key和value的双链的数据的集合。
- List是有序的,可重复的。map存储的数据是无序的,key值不能重复,value值可以重复。
- List继承Collection接口,Map没有父类。
8.List、set、map三个接口,存取元素时有什么特点?
- List和Set都是单列元素集合都继承自Collection接口。
- List是有序的、可以重复的。Set是无序、不可重复的。他俩的add()方法,set由于不可重复,所以在插入时需要循环遍历set集合中的对象,如果相等,则插入失败,返回一个false。List可以通过get()方法通过下标来取值,set通过iterator()循环遍历取值。
- Map时键值对来存数据,通过put()方法,不能存储相同的key值,取值通过get()方法,通过key值来确定value值。
9.什么是iterator?
- Iterator接口提供遍历任何Collection接口的实现类,我们可以从实现类中获取迭代器实例,迭代器允许调用者在迭代过程中移除元素。
10.集合框架中的泛型有什么优点?
- java1.5之后引用泛型
- 泛型为集合类框架引入了可以存放相同对象的容器,因此,如果在集合中添加其他的对象,就会在编译时报错,避免了运行时出现ClassCastException。泛型也使代码变得整洁,不用使用显示转换和instanceOf操作符。
11. 哪些集合提供对元素的随机访问?
ArrayList(有序)、HashMap、TreeMap、HashTable(key值)
12.哪些集合类是线程安全的?
Vertor、HashTable是线程安全的。
13.你如何选择集合类框架的使用?
- 如果指定了大小,就使用Array而不使用ArrayList;
- 如果想使用插入顺序来遍历Map,我们需要使用TreeMap而不是HashMap;
- 如果不想重复就使用set接口下的实现类。
- 如果是单线程代码环境,使用HashMap,多线程使用HashTable
14. 两个对象的值相同(x.equals(y)==true),但是有不同的hashCode,这句话对不对?
- 分情况。
- 如果两个对象保存在HashMap或者HashSet中,他们的equals相等的话,他们的hashcode值必须相等。
- 如果存储在ArrayList中,这时与hashcode就没有关系了。
- 通常我们都一般重写equals时顺带重写hashcode。
15. 集合类常用方法?
- add(E e) ,添加元素
- clear() ,暴力清除集合中所有元素
- contains(Object o), 返回值类型:boolean。判断集合是否包含某个元素
- isEmpty() ,返回值类型:boolean。如果此集合不包含元素,则返回true。
- iterator() 迭代器。返回值类型:Iterator
- size() 返回值类型:int。返回集合中的元素数