9-Vector

类介绍

继承关系

1.png

一直想不明白,Vector继承自AbstractList,就已经实现了List接口,为什么还要再类的定义时再实现一次List接口。

用法及建议

Vector是一个很好的集合类,在初学java时老师就介绍了这个类。这个类有一些优点:

  1. 有对象就直接往里放,即便是不同类型也ok,然后取出来时用instanceof帮忙判断一下就能正常用
  2. 一个线性表的实现

经过阅读,Vector有以下要注意的东西:

  1. 合理安排Vector的扩展量,如果没有设置扩展量会以2的倍数递增
  2. Vector是动态连续空间,增加删除操作不方便
  3. Vector申请的数组空间一般比元素个数多,也提供了操作减去多余空间,甚至减去存有有用数据的空间.

LinkedList,ArrayList对比:

  1. 内部实现不同:

    1. LinkedList:链表
    2. ArrayList,Vector:连续数组
  2. 扩展机制不同:

    1. LinkedList:随便扩展
    2. ArrayList: 数组不够用,每次多申请一个,很不友好
    3. Vector: 可以自定义扩展的数组长度
  3. 是否可缩减存储的长度

    1. LinkedList: 不限制
    2. ArrayList:可以删除元素减少看到的元素个数,但是数组长度不会减少
    3. Vector: 可以删元素,可以减少数组长度

源码介绍

通用方法不再介绍,有些地方在扩展中进行介绍。

扩展

EnumerationVSIterator

public interface Enumeration {
    /**
     * Tests if this enumeration contains more elements.
     *
     * @return  true if and only if this enumeration object
     *           contains at least one more element to provide;
     *          false otherwise.
     */
    boolean hasMoreElements();

    /**
     * Returns the next element of this enumeration if this enumeration
     * object has at least one more element to provide.
     *
     * @return     the next element of this enumeration.
     * @exception  NoSuchElementException  if no more elements exist.
     */
    E nextElement();
}

至于Iterator就不再赘述,前面专门介绍过了。

主要区别:

  1. 函数接口不同

    • Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。

    • Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。

  2. Iterator支持****fail-fast机制,而Enumeration不支持。

    • Enumeration是JDK 1.0添加的接口。使用到它的函数包括VectorHashtable等类,这些类都是JDK1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在VectorHashtable实现Enumeration时,添加了同步。
    • Iterator 是JDK 1.2才添加的接口,它也是为了HashMapArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

System.arraycopy()

这里介绍这个主要是在看源码的过程中看到了这个:

System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
System.arraycopy(elementData, index, elementData, index - 1, elementCount - index);

一个是后移,一个是前移。都能实现,最开始我们只注意了第二种情况,认为是从前往后依次拷贝,可以实现。但是第一种情况就无法解释了。

经过查询,System.arraycopy()实现思路是:从sourceArray拷贝到tempArray,拷贝完再从tempArray拷贝到targetArray。【了解意思即可,变量名可能不是这几个名】

参考文献

https://www.cnblogs.com/skywang12345/p/3311275.html

https://juejin.im/post/5aa32725f265da2373140df3

你可能感兴趣的:(9-Vector)