在JDK2.0之前(在java的集合框架之前),要存储多个数据,此时存在一个叫vector类,该类其实就是一个Object数组,vector类中的方法是支持同步的。
设计原理:查看源代码:
里面方法使用了synchronized修饰可知vector是线程安全的。
注意:vector默认长度是10,由于源码中的不带参数的vector()里面是调用this(10)调用vector(带参数)的构造方法,因此初始化带参数效率更高一点。
vector类存储原理:
还是 Object[ ] 类型数组。
protected Object[] elementDate;
- 表面上把数据存储到Vector对象中,其实底层依然是把数据存储到Object数组中的。
我们发现该数组的元素类型是Object类型,意味着集合中只能存储任意类型的对象。
集合中只能存储对象不能存储基本数据类型。*在java5之前,必须对基本数据类型手动装箱。*
从java5开始支持自动装箱操作
代码:如:v.add(123);其实底层依然是手动装箱,修改项目的编译为java5以上不会出错(自动装箱)。集合中存储的对象,都存储的对象的引用,而不是对象本身。
案例:
package com.test;
import java.util.Date;
import java.util.Vector;
public class ExtendThread extends Thread {
public static void main(String[] args) {
Vector vector = new Vector(5);
vector.addElement(new Date());
vector.addElement(234);
System.out.println(vector);
System.out.println("---------------------------");
StringBuilder stringBuilder = new StringBuilder("ABC");
vector.addElement(stringBuilder);
System.out.println(vector);
System.out.println("----------追加内容-----------------");
stringBuilder.append("addContent");
System.out.println(vector);
System.out.println("--------为什么数组结果被改变了?-------------------");
}
}
运行结果:
[Mon Mar 12 17:35:10 CST 2018, 234]
---------------------------
[Mon Mar 12 17:35:10 CST 2018, 234, ABC]
----------追加内容-----------------
[Mon Mar 12 17:35:10 CST 2018, 234, ABCaddContent]
--------为什么数组结果被改变了?-------------------
解释:
vector操作方法:
- add(int index, E element) :在此向量的指定位置插入指定的元素。如果数组中元素已经存储,则执行效率很低,因为会使数组中整体元素移动。
add中参数为集合时:
package com.test;
import java.util.Date;
import java.util.Vector;
public class ExtendThread extends Thread {
public static void main(String[] args) {
Vector vector = new Vector();
vector.add("A");
vector.add("B");
vector.add("C");
Vector v = new Vector(5);
v.add("A");
v.add("B");
v.add("C");
vector.add(v);
System.out.println(vector);
}
}
输出: [A, B, C, [A, B, C]]
- addAll(Collection