java集合框架入门解析-----Vector和Stack
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java集合框架入门解析-----Vector和Stack,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4334字,纯文字阅读大概需要7分钟。
内容图文
阅读导航
0.结构图
1.Vector是什么
可以简单的认为Vector是一个动态数组;Vector是通过数组实现的,长度不够是,调用Arrays.copyOf方法,拷贝当前数组到一个新的长度更大的数组中。
2.Vector的特点
vector和ArrayList极其相似,所以很多时候都会被对比异同。
相同点:
1)都继承了AbstractList抽象类,实现了List接口,源头都是collection接口。
2)随机访问快,插入和删除性能较差,支出null元素,有顺序(因为有序,所以能通过索引下标来查找元素,故随机访问快),元素可重复。
不同点:
- 同步性:
1)Vector线程安全,ArrayList线程不安全。
2)Vector中涉及到线程安全的方法都带有synchronize关键字,是线程安全的,而ArrayList的方法没有synchronize关键字,是线程不安全的。
- 效率:
1)Vector涉及到方法间的线程同步,效率低。
2)ArrayList不用考虑线程安全,效率高。
如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。(鉴于Vector的线程安全功能已经被其他方式代替,多线程访问集合时首先考虑的已经不是使用vector了)。
- 扩容机制:
1)vector扩容的时候是直接扩展了一倍,而ArrayList是扩展50%。
2)ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来一倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。
3.Vector内部数组扩容
Vector使用了三种构造方法
public vector()
public vector(int initialcapacity,int capacityIncrement)
public vector(int initialcapacity)
使用第一种方法系统会自动对向量进行管理,若使用后两种方法,则系统将根据参数,initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时。系统会扩充向量对象存储容量。
参数capacityincrement给定了每次扩充的扩充值。当capacityincrement为0的时候,则每次扩充一倍,利用这个功能可以优化存储。
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
关于ArrayList的扩容请看 java集合框架入门解析-----ArrayList (占空添加链接)
4.Vector继承的类和实现的接口
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
*****
}
主要方法分类 (大多见名知意就不一一介绍了)
- 1)构造方法
public vector()
public vector(int initialcapacity,int capacityIncrement)
public vector(int initialcapacity)
- 2)add方法—增
- 3)remove方法—删
- 4)indexOf方法–查
- 5)set方法—改
- 6)其他常用功能函数
5.Vector遍历
public class VectoryDemo {
public static void main(String[] args) {
Vector<Integer> list = new Vector<>();
for(int i = 0; i < 10; i++){
list.add(i);
}
//直接打印
System.out.println(list.toString());
//for循环
System.out.println("for循环:");
for(int i = 0; i < list.size(); i++){
System.out.print(list.get(i) + " ");
}
//foreach
System.out.println("\nforeach:");
for(Integer i : list){
System.out.print(i + " ");
}
//iterator
System.out.println("\niterator:");
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next() + " ");
}
//listIterator
System.out.println("\nlistIterator:");
ListIterator<Integer> listIterator = list.listIterator();
while(listIterator.hasNext()){
System.out.print(listIterator.next() + " ");
}
System.out.println();
while(listIterator.hasPrevious()){
System.out.print(listIterator.previous() + " ");
}
}
}
6.stack
Stack中的部分方法使用如下,因为Stack继承Vector,所以Vector可以用的方法,Stack同样可以使用。
另外stack除了Vector的几种遍历方式外,还有自己独有的遍历元素的方式(利用empty方法和pop方法实现栈顶到栈底的遍历)
- 使用建议:
如果打算用Stack作为栈来使用的话,就老老实实严格按照栈的几种操作来使用,否则就是去了使用stack的意义,还不如用Vector;
常见面试题:
1、说说Vector和ArrayList的异同点。
2、为什么现在不建议使用vector了。
其中一点,Vector在每个操作上同步。大多数上下文不需要细粒度的同步,因此这是不必要的性能开销。
内容总结
以上是互联网集市为您收集整理的java集合框架入门解析-----Vector和Stack全部内容,希望文章能够帮你解决java集合框架入门解析-----Vector和Stack所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。