最近开始面试,发现基本笔试题里面基本都有关于Collection的问题,故写此文章,总结一下。
常见笔试题型:
1.问Collection下的接口实现类有哪些:
从上图中可以看出,Collection接口有两个子类,一个List,一个Set。而List也是经常考的题目,List的接口有3个实现类,一个是ArrayList,一个是LinedList,还有一个是Vector。
2.ArrayList、LikedList、Vector的区别:
首先这三个类都是实现了List接口,因此都是线性的。LinkedList底层的数据结构是链表,是链式存储的。学过数据结构的人都知道,链式存储结构方便对数据的增加和删除,但是数据的查询不方便,因此,LinkedList多用于增加删除操作比较频繁的应用中。
ArrayList和Vector的底层数据结构都是数组,属于顺序存储结构。共同的优点是方便数据的查询和修改。但是他们这间也有比较明显的区别,区别主要体现在三点:
(1)Vector是多线程安全的,而ArrayList不是。从下面的代码可以看出。
这是ArraList的add方法。
- //这个方法是没有synchronized修饰的,所以不是线程安全的。
- public boolean add(E e) {
- ensureCapacityInternal(size + 1); // Increments modCount!!
- elementData[size++] = e;
- return true;
- }
这是Vector的add方法。
- //这个方法有synchronized修饰的,所以是线程安全的。
- public synchronized boolean add(E e) {
- modCount++;
- ensureCapacityHelper(elementCount + 1);
- elementData[elementCount++] = e;
- return true;
- }
(2)两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的,Vector默认增加原来空间的一倍,ArrayList默认增加原来空间的50%。
(3)Vector可以设置增长因子,而ArrayList不可以
ArrayList有三个构造方法:分别是
Vector有四个构造方法:
- public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。
- public ArrayList()//构造一个初始容量为10的空列表。
- public ArrayList(Collection<? extends E> c)//构造一个包含指定 collection 的元素的列表
通过比较可以看出,Vector比ArrayList多一个构造方法,public Vector(int initialCapacity,int capacityIncrement),这个构造方法的第二个参数就是增量因子。
- public Vector()//使用指定的初始容量和等于零的容量增量构造一个空向量。
- public Vector(int initialCapacity)//构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。
- public Vector(Collection<? extends E> c)//构造一个包含指定 collection 中的元素的向量
- public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量构造一个空的向量