Vector的使用
vector类底层数组结构的,它包含可以使用整数索引进行访问的组件。不过,vector的大小可以根据需要增大或缩小,以适应创建vector后进行添加或移除项的操作,因此不需要考虑元素是否越界或者会不会浪费内存的问题。
由vector的iterator和listIterator方法所返回的迭代器是快速失败的:也即是它不能并发执行操作。如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的remove或add方法之外的任何其他方式),则迭代器将抛出ConcurrentModificationException。因此,面对并发的修改,迭代器很快就完全失败,而不是冒着将来不确定的时间任意发生不确定行为的风险。
vector的elements()方法返回的Enumeration不是快速失败的。
通过代码说明这个问题:
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); Enumeration en=v.elements(); while(en.hasMoreElements()) { Object object=en.nextElement(); if(object.equals("abc3")) { v.addElement("abc5"); // 不会出现异常 } System.out.println(object); } Iterator it=v.iterator(); while(it.hasNext()) { Object obj=it.next(); if(obj.equals("abc3")) { v.addElement("abc5");// 会出现异常 // 面对并发的修改,迭代器很快就完全失败! } System.out.println(obj); } } }
Vector的四种构造方法:
1、Vector(); 构造一个空向量,使其内部数据数组的大小为10,其标准容量增量为零。 Vector vec=new Vector();
2、Vector(Collection c); 构造一个包含指定collection中的元素的向量,这些元素按其collection的迭代器返回元素的顺序排列。 Vector v=new Vector(vec);
3、Vector(int initialCapacity); 使用指定的初始容量和等于零的容量增量构造一个空向量。
4、Vector(int initialCapacity,int capacityIncrement); 使用指定的初始容量和容量增量构造一个空的向量。
Vector类中的方法:
1、boolean add(E e); 将指定的元素添加到此向量的末尾。
2、void addElement(E obj); 将指定的组件添加到此向量的末尾,将其大小增加1。
3、void add(int indext,E e); 在此向量的指定位置插入指定的元素。
4、boolean addAll(Collection c); 将指定Collection中的所有元素添加到此向量的末尾,按照指定collection的迭代器所返回的顺序添加这些元素。
5、boolean addAll(int index,Collection c); 在指定位置将指定Collection中的所有元素插入到此向量中。
6、int capacity(); 返回此向量的当前容量。
7、Object clone(); 返回向量的一个副本。
8、boolean contains(Object o); 如果此向量包含指定的元素,怎返回true。
9、boolean containsAll(Collection c); 如果此向量包含Collection中的所有元素,则返回true。
10、void copyInto(Object[] anArray); 将此向量的组件复制到指定的数组中。
11、E elementAt(int index); 返回指定索引处的组件。
12、Enumeration<E> elements(); 返回此向量的组件的枚举。
13、void ensureCapacity(int minCapacity); 增加此向量的容量(如有必要),以确保其至少能够保证最小容量参数指定的组件数。
14、boolean equals(Object o); 比较指定对象与此向量的相等性。
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); Vector vec=new Vector(); vec.add("abc1"); vec.add("abc2"); vec.add("abc3"); vec.add("abc4"); System.out.println(v.equals(vec)); } }15、E firstElement(); 返回此向量的第一个组件(位于索引0)处的项。
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); System.out.println(v.firstElement()); System.out.println(v.firstElement()); Vector vec=new Vector(); vec.add("aa"); vec.add("bb"); v.add(0,vec); // 插入第一个位置 System.out.println(v.firstElement()); System.out.println(v.firstElement()); } }16、E lastelement(); 返回此向量的最后一个组件。代码略。
17、E get(int index); 返回向量中指定位置 的元素。
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); System.out.println(v.get(0)); System.out.println(v.get(3)); // 在这里,index值不能小于0,或者大于3 } }18、int hashCode(); 返回此向量的哈希码值。
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); System.out.println(v.hashCode()); } }19、int indexOf(Object o,int index); 返回此向量中第一次出现的指定的元素的索引,从index处正向索引,如果未找到该元素,则返回-1.
20、int indexOf(Object o); 返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回-1。
21、int lastIndexOf(Object o,int index); 返回此向量中最后一次出现的指定元素的索引,从index处逆向搜索,如果未找到该元素,则返回-1.
22、int lastIndexOf(Object o); 返回此向量中最后一次出现的指定元素的索引,如果此向量不包含该元素,则返回-1。
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); System.out.println(v.indexOf("abc3")); System.out.println(v.indexOf("abc3",3)); System.out.println(v.lastIndexOf("abc3")); System.out.println(v.lastIndexOf("abc3",3)); } }23、boolean isEmpty(); 测试此向量是否不包含组件。
24、void clear(); 从此向量中移除所有元素。
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); System.out.println(v.isEmpty()); // 非空输出false v.clear(); System.out.println(v.isEmpty()); // 空输出true } }25、E remove(int index); 移除此向量中指定位置的元素。
26、boolean remove(Object o); 移除此向量中指定元素的第一个匹配项,如果向量不包含该元素,则元素保持不变。
27、boolean removeAll(Collection c); 从此向量中移除包含在指定Collection中的所有元素。
28、void removeAllElements(); 从此向量中移除全部组件,并将其大小设置为零。
29、boolean removeElement(Object obj); 从此向量中移除变量的第一个(索引最小的)匹配项。
30、void removeElementAt(int index); 删除指定索引处的组件。
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); System.out.println(v.removeElement("abc1")); System.out.println(v); Vector vec=new Vector(); vec.add("abc4"); System.out.println(v.remove(2)); System.out.println(v); System.out.println(v.remove("abc2")); System.out.println(v); System.out.println(v.removeAll(vec)); System.out.println(v); v.removeAllElements(); System.out.println(v); } }31、protected void removeRange(int fromIndex,int toIndex); 从此list中移除位于formIndex(包括)与toIndex(不包括)之间的所有元素。
32、boolean retainAll(Collection c); 在此向量中仅保留包含在指定Collection中的元素。
package cn.list.demo; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { Vector v=new Vector(); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); v.addElement("abc1"); v.addElement("abc2"); v.addElement("abc3"); v.addElement("abc4"); Vector vec=new Vector(); vec.add("abc2"); vec.add("abc4"); System.out.println(v.retainAll(vec)); System.out.println(v); } }
此外,还有一些其他方法,这里不再一一列举。有兴趣的可以通过API的介绍自己做练习。