zoukankan      html  css  js  c++  java
  • List加载因子和扩容因子

    首先,这三个概念说下。初始大小,就是创建时可容纳的默认元素个数;加载因子,表示某个阀值,用0~1之间的小数来表示,当已有元素占比达到这个阀值后,底层将进行扩容操作;扩容方式,即指定每次扩容后的大小的规则,比如翻倍等。

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低。

    加载因子的系数小于等于1,意指  即当 元素个数 超过 容量长度*加载因子的系数 时,进行扩容。

    另外,扩容也是有默认的倍数的,不同的容器扩容情况不同。

    List 元素是有序的、可重复

    ArrayList、Vector默认初始容量为10

    Vector:线程安全,但速度慢

        底层数据结构是数组结构

        加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容

        扩容增量:原容量的 1倍

          如 Vector的容量为10,一次扩容后是容量为20

    ArrayList:线程不安全,查询速度快

        底层数据结构是数组结构

        扩容增量:原容量的 0.5倍+1

          如 ArrayList的容量为10,一次扩容后是容量为16

    Set(集) 元素无序的、不可重复。

    HashSet:线程不安全,存取速度快

         底层实现是一个HashMap(保存数据),实现Set接口

         默认初始容量为16(为何是16,见下方对HashMap的描述)

         加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

         扩容增量:原容量的 1 倍

          如 HashSet的容量为16,一次扩容后是容量为32

    构造方法摘要HashSet() 
    HashSet(int initialCapacity)
    构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
    HashSet hs=new HashSet(1);

    所以可见 HashSet类,创建对象的时候是可以的制定容量的大小的 ,期中第二个就具有这个工功能。

    Map是一个双列集合

    HashMap:默认初始容量为16

         (为何是16:16是2^4,可以提高查询效率,另外,32=16<<1       -->至于详细的原因可另行分析,或分析源代码)

         加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

         扩容增量:原容量的 1 倍

          如 HashSet的容量为16,一次扩容后是容量为32

    Hashtable: 线程安全

         默认初始容量为11

         加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

         扩容增量:原容量的 1 倍+1

          如 Hashtable的容量为11,一次扩容后是容量为23

    Class

    初始大小

    加载因子

    扩容倍数

    底层实现

    Code

    是否线程安全

    同步方式

    ArrayList

    10

    1

    1.5倍+1

    Object数组

    int newCapacity = oldCapacity + (oldCapacity >> 1)+1;
    ">>"右移符号,所以是除以2,所以新的容量是就的1.5倍+1
    Arrays.copyOf 调用 System.arraycopy 扩充数组

    线程不安全

    -

    Vector

    10

    1

    2倍

    Object数组

    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
    capacityIncrement : oldCapacity);
    capacityIncrement默认为0,所以是加上本身,也就是2*oldCapacity,2倍大小
    Arrays.copyOf 调用 System.arraycopy 扩充数组

    线程安全

    synchronized

    HashSet

    16

    0.75f

    2倍

    HashMap<E,Object>

    add方法实际调用HashMap的方法put

    线程不安全

    -

    HashMap

    16

    0.75f

    2倍

    Map.Entry

    void addEntry(int hash, K key, V value, int bucketIndex) {
        if ((size >= threshold) && (null != table[bucketIndex])) {
            resize(2 * table.length);
            hash = (null != key) ? hash(key) : 0;
            bucketIndex = indexFor(hash, table.length);
        }

        createEntry(hash, key, value, bucketIndex);
    }

    线程不安全

    -

    Hashtable

    11

    0.75f

    2倍+1

    Hashtable.Entry数组

    int newCapacity = (oldCapacity << 1) + 1;
    if (newCapacity - MAX_ARRAY_SIZE > 0) {
        if (oldCapacity == MAX_ARRAY_SIZE)
            return;
        newCapacity = MAX_ARRAY_SIZE;
    }

    线程安全

    synchronized

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    HDU 1261 字串数(排列组合)
    Codeforces 488C Fight the Monster
    HDU 1237 简单计算器
    POJ 2240 Arbitrage
    POJ 3660 Cow Contest
    POJ 1052 MPI Maelstrom
    POJ 3259 Wormholes
    POJ 3268 Silver Cow Party
    Codesforces 485D Maximum Value
    POJ 2253 Frogger(最短路)
  • 原文地址:https://www.cnblogs.com/cyl048/p/11935467.html
Copyright © 2011-2022 走看看