几个集合特点及使用小结
Vector和ArrayList的区别
(1)使用上:与ArrayList没有区别
(2)源码上:
- 底层数据结构:完全相同
- 构造函数:ArrayList初始数组为空,添加第一个元素容量变为10;
Vector初始数组大小为10。 初始化时机不同 - grow方法:ArrayList是0-10,后面是呈1.5倍扩容
Vector是 如果capacityIncrement不大于0的话Vector2倍扩容,如果capacityIncrement大于0,Vector容量扩大capacityIncrement个那么大
默认情况下Vector是2倍扩容,capacityIncrement实际上就是增长因子。 - 为什么扩容方法Vector更合理:
Vector中所有方法都添加了synchronized锁,所以Vector是线程安全的集合。避免了空间浪费。Arraylist中没有加锁处理,所以是线程不安全的集合 扩容方式不同
(3)使用场景:线程安全问题
多线程条件下需要考虑线程安全问题选择Vector;如果不需要则考虑使用ArrayList。
- 为什么不用考虑线程安全时不使用Vector:
加锁操作是非常耗时的,为了提高效率。Vector中所有方法都添加了synchronized锁,所以Vector是线程安全的集合。避免了空间浪费。Arraylist中没有加锁处理,所以是线程不安全的集合 。
栈 Stack:利用Vector实现了一个线程安全的栈。
先入后出:先添加的元素在删除时先删除
常见面试题回答技巧总结:
(从以下几个方面进行回答)
1.继承关系:集合继承了那些父类,哪些接口
2.底层结构;
3.源码实现:
- 初始容量
- 初始化时机
- 扩容方式
- 遍历方式:都可使用迭代器遍历,(listIterator:是list集合特有的迭代器)
- 数据值可否为空
- 数据可否有序:插入顺序 数据的自然顺序
- 数据是否可以重复
4.线程是否安全;
5.使用场景。
常见问题
(1)LinkedList和ArrayList的区别
都属于list继承下的集合;
a.底层数据结构:数组 双向链表;
LinkList没有容量和扩容之说,都可使用迭代器遍历,都许为空,都可重复
都不是线程安全的集合;
b.使用场景 :LinkList更适合随机添加删除方法频繁的操作,因为不牵扯数据移动;ArrayList随机的添加删除操作会造成数据移动,导致效率过低;ArrayList:适合于随机访问操作比较频繁 。注意:是随机!
(2)ArrayList和Vector的区别:
(从源码实现:初始化时机 、 扩容方式 、 线程是否安全, 这几个方面回答)
构造函数:ArrayList初始数组为空,添加第一个元素容量变为10;
Vector初始数组大小为10。 初始化时机不同
grow方法:ArrayList是0-10,后面是呈1.5倍扩容
Vector是 如果capacityIncrement不大于0的话Vector2倍扩容,如果capacityIncrement大于0,Vector容量扩大capacityIncrement个那么大
默认情况下Vector是2倍扩容,capacityIncrement实际上就是增长因子
扩容方法Vector更合理:Vector中所有方法都添加了synchronized锁,所以Vector是线程安全的集合。避免了空间浪费。Arraylist中没有加锁处理,所以是线程不安全的集合 扩容方式不同
使用场景:线程安全问题
多线程条件下需要考虑线程安全问题选择Vector,如果不需要则考虑使用ArrayList,
为什么不用考虑线程安全时不使用Vector:
加锁操作是非常耗时的,为了提高效率。
(3)什么时候该用Vector,什么时候该用ArrayList?
使用场景:线程安全问题
多线程条件下需要考虑线程安全问题选择Vector,如果不需要则考虑使用ArrayList。
(4)什么时候该用LinkedList,什么时候该用ArrayList
LinkList更适合随机添加删除方法频繁的操作,因为不牵扯数据移动;ArrayList随机的添加删除操作会造成数据移动,导致效率过低;ArrayList:适合于随机访问操作比较频繁 。注意:是随机!
数组和集合的区别
(1)数组是静态,集合是动态
(2)集合功能更全面(下标是否越界 功能之一)
(3)数组需要指定类型Integer[ ]arr,存储数据必须是这个类型。
集合创建时不需要(可有可无)如果有存储数据必须是这个类型,如果没有存储数据可以是任意的。注意:集合指定存储数据类型方式用的较多,原因是更好管理。
(4)数组在指定类型时既可以使用普通类型,也可以使用引用类型,集合只能使用引用类型。Integer[ ]arr,int brr
(5)数组Java内置类型数组效率更高
什么时候用集合,什么时候用数组?
对元素的数量有明确判断并且轻易不会发生改变时,存储好的数据不会有复杂的后续操作时用数组,集合与之相反。