代码改变世界

java collections读书笔记(3) vector(2)

2013-06-14 11:29  很大很老实  阅读(289)  评论(0编辑  收藏  举报

打印vector:

可以调用tostring方法。

删除所有元素:

public void clear()
public void removeAllElements()

从内部源代码可知,clear就是调用了removeAllElements而已。

但是注意,这时候,vector的容量是不变的。

删除某个元素:

public Object remove(int index)
public void removeElementAt(int index) :从源代码来看,只是把index位置后面的元素往前移动一位,调用的是System.arraycopy,然后最后一位指定为null。

这两个函数,源代码意思差不多,怎么写的差异这么大呢?

  public synchronized E remove(int index) {
        modCount++;
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);
        E oldValue = elementData(index);

        int numMoved = elementCount - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--elementCount] = null; // Let gc do its work

        return oldValue;
    }

 public synchronized void removeElementAt(int index) {
        modCount++;
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                     elementCount);
        }
        else if (index < 0) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
        int j = elementCount - index - 1;
        if (j > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, j);
        }
        elementCount--;
        elementData[elementCount] = null; /* to let gc do its work */
    }

删除某个对象,但是不知道其位置:

public boolean remove(Object element)
public boolean removeElement(Object element)

remove内部调用了removeElement;

有多个对象,至删除第一个。

Integer my=new Integer(1000);
    v.add(my);
    v.add(my);
    
    
    System.out.println(v.toString());
    System.out.println(v);
    v.remove(my);
    System.out.println(v);
    v.remove(my);
    System.out.println(v);
   

如果想删除所有,则用,removeall

Integer my=new Integer(1000);
    v.add(my);
    v.add(my);
    
    
    System.out.println(v.toString());
    System.out.println(v);
    Vector dd=new Vector();
    dd.add(my);
    v.removeAll(dd);
    System.out.println(v);
    v.remove(my);
    System.out.println(v);
   

retainAll和removeall相反,只保留那些东西,哈。

替换元素:

public Object set(int index, Object element)
public void setElementAt(Object obj, int index)

vector容量:

size():标识vector内现有元素的多少;

vector的不变性:

  如何使vector里的值不变:

Vector v = new Vector();
// fill vector
List l = Collections.unmodifiableList(v);

 

对vector里的数据的操作:

1)获取数据:

   public Object get(int index)
public Object elementAt(int index)

 这里需要注意类型的抓换:

Vector v = new Vector();
v.add("Hello");
String s = (String)v.get(0);

public Object firstElement()
public Object lastElement()

获得元素的第一个和最后一个值。

vector的枚举实现:

Enumeration e = v.elements();
while (e.hasMoreElements()) {
process(e.nextElement());
}

 

vector继承自AbstractList,有3个方法没有override:

public Iterator iterator()
public ListIterator listIterator()
public ListIterator listIterator(int index)

 

多维度vector:

MyType o = (MyType)((Vector)vector.elementAt(3)).elementAt(2);

如何查找元素:

contains:这个实际上是调用了indexof判断是否存在。这里可以对空元素进行判断:

public synchronized int indexOf(Object o, int index) {
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

 

lastindexof,从尾部判断第一个存在的位置:

 public synchronized int lastIndexOf(Object o, int index) {
        if (index >= elementCount)
            throw new IndexOutOfBoundsException(index + " >= "+ elementCount);

        if (o == null) {
            for (int i = index; i >= 0; i--)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index; i >= 0; i--)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

public boolean containsAll(Collection c)判断是否尤其子类:

克隆vector:

Vector v1 = . . .;
Vector v2 = (Vector)v1.clone();
Collections.sort(v2);

 public synchronized Object clone() {
        try {
            @SuppressWarnings("unchecked")
                Vector<E> v = (Vector<E>) super.clone();
            v.elementData = Arrays.copyOf(elementData, elementCount);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError();
        }
    }

Vector v = . . .;
String array[] = new String[v.size()];
v.copyInto(array);

 public synchronized void copyInto(Object[] anArray) {
        System.arraycopy(elementData, 0, anArray, 0, elementCount);
    }

 

vector类中的常量和变量:

protected int capacityIncrement
protected int elementCount
protected Object[] elementData

element是以数组的形式存到elementData里的。

elementCount标识当前元素的数量。