zoukankan      html  css  js  c++  java
  • List集合之Vector分析

    List集合之Vector分析

    Vector的底层实现以及结构与ArrayList完全相同,只是在某一些细节上会有所不同。这些细节主要有:

    • 线程安全

    • 扩容大小

    线程安全

    我们知道ArrayList是线程不安全的,只能在单线程环境下使用。而Vector则是线程安全的,那么其实怎么实现的呢?

    其实Vector的实现很简单,就是在每一个可能发生线程安全的方法上加synchronize关键字。这样就是的任何时候只有一个线程能够进行读写,这样就保证了线程安全。

      public synchronized E get(int index) {
       if (index >= elementCount)
           throw new ArrayIndexOutOfBoundsException(index);

       return elementData(index);
    }
    public synchronized E set(int index, E element) {
           if (index >= elementCount)
               throw new ArrayIndexOutOfBoundsException(index);

           E oldValue = elementData(index);
           elementData[index] = element;
           return oldValue;
      }

    扩容大小

    与ArrayList类似,Vector在插入元素时也会检查容量并扩容。在Vector中这个方法是:ensureCapacityHelper

      
    private void ensureCapacityHelper(int minCapacity) {
       // overflow-conscious code
       if (minCapacity - elementData.length > 0)
           grow(minCapacity);
    }
    private void grow(int minCapacity) {
           // overflow-conscious code
           int oldCapacity = elementData.length;
           int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                            capacityIncrement : oldCapacity);
           if (newCapacity - minCapacity < 0)
               newCapacity = minCapacity;
           if (newCapacity - MAX_ARRAY_SIZE > 0)
               newCapacity = hugeCapacity(minCapacity);
           elementData = Arrays.copyOf(elementData, newCapacity);
      }

    其实上述扩容的思路与ArrayList是相同,唯一的区别是Vector的扩容大小。

      
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                    capacityIncrement : oldCapacity);

    从上面的代码可以看到:如果capacityIncrement大于0,那么就按照capacityIncrement去扩容,否则扩大为原来的2倍。而ArrayList则是扩大为原来的1.5倍。

    总结:

    Vector与ArrayList在实现上是完全一致的,但是它们在某些方法有些许不同:

    • 第一,Vector是线程安全,而ArrayList是线程不安全的。Vector直接使用synchronize关键字实现同步。

    • 第二,Vector默认扩容为原来的2倍,而ArrayList默认扩容为原来的1.5倍。

    更多资料,公号《Java路》

  • 相关阅读:
    [官网]CREATE EXTENSION PostGreSQL 创建函数的方法
    Notepad++的一个用法 转换为unix 格式的文件
    LLVM的安装
    Linux 下面RPM 安装的SQLSERVER 修改字符集的方法
    Linux 下面 Sqlserver 2017 的简单安装
    Linux下面将windows写的脚本转换成 Linux 格式的文件
    PostgreSQL 安装了contrib 之后 登录失败的问题
    Linux 下面 PG 的 uuid-ossp 包安装办法
    Chrome 离线安装插件的办法
    [新三板摘牌]国资企业济南华光光电去年终止拟IPO今年摘牌新三板
  • 原文地址:https://www.cnblogs.com/JavaUsername/p/13798741.html
Copyright © 2011-2022 走看看