Vector和ArrayList的最大区别就是Vector的主要集合方法是线程同步的。

package collection.lession8;

import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

/**
 * 老紫竹JAVA提高教程(8)-认识List列表之Vector.<br>
 * Vector和Vector的最大区别就是<br>
 * Vector的主要集合方法是线程同步的.<br>
 * <br>
 * 注意:如下代码绝大部分和ArrayList代码完全相同<br>
 * 只是把ArrayList替换为Vector
 * 
 * @author 老紫竹 JAVA世纪网(java2000.net)
 * 
 */
public class Lession8 {

  public static void main(String[] args) {
    testNormal();
    testSpecial();
    // 一个最常见的错误
    testForProblem();
    // 测试Vector的特殊方法
    testForVector();
  }

  public static void testForVector() {
    // 可以指定每次增加的容量尺寸
    // 初始化为100个,每次增加12个
    Vector v1 = new Vector(12, 12);
    v1.add(1);
    v1.add(2.34);
    v1.add("abc");
    showList(v1);

    // 显示容量
    System.out.println("capicity=" + v1.capacity());

    // 可以复制数据到数组
    Object[] anArray = new Object[v1.size()];
    v1.copyInto(anArray);
    System.out.println(Arrays.toString(anArray));

    // 可以设置尺寸
    // 采用null进行位置填充
    System.out.println("size=" + v1.size());
    v1.setSize(16);
    System.out.println("size=" + v1.size());
    showList(v1);

    // 显示容量
    // 可以看到容量已经增加了
    System.out.println("capicity=" + v1.capacity());

    // 获得枚举
    Enumeration en = v1.elements();
    // 下面是一些相关的操作,我就不一个一个的写了
    // 
    // public synchronized E firstElement();
    // public synchronized E lastElement();
    // public synchronized void setElementAt(E obj, int index) ;
    // public synchronized void removeElementAt(int index);
    // public synchronized void insertElementAt(E obj, int index);
    // public synchronized void addElement(E obj);
    // public synchronized boolean removeElement(Object obj);
    // public synchronized void removeAllElements();
  }

  public static void testNormal() {
    // -------------------------------------------------------
    // 声明一个列表
    // 允许放入任何数据
    // -------------------------------------------------------
    Vector list = new Vector();
    // 放入整数
    // 当然你用 new Integer(1)也可以
    list.add(1);
    // 放入字符串
    list.add("abc");
    // 放入浮点数
    list.add(new Float(1.11));
    // add会将数据保存到列表的尾部
    showList(list); // 1, abc, 1.11]

    // 下面我们在列表的头部增加数据
    list.add(0, 2);
    list.add(0, "bcd");
    list.add(0, new Double(2.34));
    // 列表可以指定插入的位置
    // 0 是头部第一个位置,所以数据都逐个放到最前面了
    showList(list); // [2.34, bcd, 2, 1, abc, 1.11]

    // 下面我们插入到我们希望的任何位置
    // 当然不能越界,(0 到 list.size()-1)范围内才可以
    list.add(1, 3);
    list.add(4, "xyz");
    // 数据被放到了正确的位置
    showList(list); // [2.34, 3, bcd, 2, xyz, 1, abc, 1.11]

    // -------------------------------------------------------
    // 我们有了数据,我们来测试读取数据
    // -------------------------------------------------------
    // 我们可以通过指定索引的位置,来拿到我们希望的数据
    System.out.println(list.get(0)); // 2.34
    System.out.println(list.get(4)); // xyz

    // -------------------------------------------------------
    // 测试是否存在某个数据
    // -------------------------------------------------------
    System.out.println(list.contains("xyz")); // true

    // 测试是否包含一组数据
    Collection c = new Vector();
    c.add(1);
    c.add(2);
    System.out.println(list.containsAll(c)); // true
    c.add(3);
    c.add(4);
    // containsAll_1234=false
    System.out.println(list.containsAll(c)); // false

    // -------------------------------------------------------
    // 查找某个数据所在的索引位置
    // 如果不存在,返回-1
    // -------------------------------------------------------
    System.out.println(list.indexOf(3)); // 1
    System.out.println(list.indexOf("xyz")); // 4
    System.out.println(list.indexOf("abcd")); // -1

    // -------------------------------------------------------
    // 测试删除数据
    // 请注意,
    // 如果你使用整数(int)数字,则默认调用的是remove(int index);
    // 如果你用 long,则会调用 remove(Object obj);
    // 所以如果你要删除整数,请使用 remove(new Integer(int));
    // -------------------------------------------------------
    // 删除索引为1的数据
    list.remove(1);
    // 索引为1的数据被干掉了
    showList(list); // [2.34, bcd, 2, xyz, 1, abc, 1.11]

    // 删除数字1 和字符串 abc
    list.remove(new Integer(1));
    list.remove("xyz");
    showList(list); // [2.34, bcd, 2, abc, 1.11]

    // -------------------------------------------------------
    // 迭代器的使用
    // -------------------------------------------------------
    Iterator it = list.iterator();
    while (it.hasNext()) {
      System.out.print(it.next() + " "); // 2.34 bcd 2 abc 1.11
    }
    System.out.println();

    // -------------------------------------------------------
    // 转化为数组
    // -------------------------------------------------------
    Object[] objs = list.toArray();
    for (Object obj : objs) {
      System.out.print(obj + " "); // 2.34 bcd 2 abc 1.11
    }
    System.out.println();
  }

  public static void testSpecial() {
    // -------------------------------------------------------
    // 测试重复和null
    // -------------------------------------------------------
    //
    List<Integer> list = new Vector<Integer>();
    list.add(123);
    list.add(456);
    list.add(123);
    list.add(456);
    // 数据允许重复
    showList(list); // [123, 456, 123, 456]

    list.add(null);
    list.add(789);
    list.add(null);
    list.add(999);
    // 允许放入多个null
    showList(list); // [123, 456, 123, 456, null, 789, null, 999]

    // -------------------------------------------------------
    // 测试一下查找最后一次出现的位置
    // -------------------------------------------------------
    System.out.println(list.indexOf(123)); // 0
    System.out.println(list.lastIndexOf(123)); // 2

    // -------------------------------------------------------
    // 转化为数组
    // 记得要转化为Inerger.
    // -------------------------------------------------------
    Integer[] nums = (Integer[]) list.toArray(new Integer[0]);
    // 注意数据里面有null,所以循环变量不要用int 要用Integer
    for (Integer num : nums) {
      System.out.print(num + " "); // 123 456 123 456 null 789 null 999
    }
    System.out.println();

  }

  public static void testForProblem() {
    // 一些朋友在向循环里向列表增加对象的时候
    // 经常忘记初始化,造成最终加入的都是同一个对象
    List<MyObject2> list = new Vector<MyObject2>();
    MyObject2 obj = new MyObject2();
    for (int i = 1; i <= 5; i++) {
      obj.setName("Name" + i);
      list.add(obj);
    }
    // 里面的数据都是最后一个
    showList(list); // [Name5, Name5, Name5, Name5, Name5]

    // 正确的做法
    List<MyObject2> list2 = new Vector<MyObject2>();
    MyObject2 obj2 = null;
    for (int i = 1; i <= 5; i++) {
      obj2 = new MyObject2();
      obj2.setName("Name" + i);
      list2.add(obj2);
    }
    // 里面的数据都是最后一个
    showList(list2); // [Name1, Name2, Name3, Name4, Name5]
  }

  /**
   * 显示List里面的数据。
   * 
   * @param list
   */
  private static void showList(List list) {
    System.out.println(Arrays.toString(list.toArray()));
  }
}

class MyObject2 {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  /**
   * 重写toString方法,输出name
   */
  public String toString() {
    return name;
  }
}


部分内容请参考ArrayList部分

快乐渡过每一天,减肥坚持每一天