java 如何查看ArrayList的容量capacity

原创 2018年04月16日 21:25:47
刚刚仔细研究了下ArrayList的源码,发现其自动扩容公式为capacity=capacity+(capacity>>1) (简化后),想验证一下

capacity即element数组的大小,而element数组又是私有的,于是想到利用反射访问

import java.lang.reflect.Field;
import java.util.ArrayList;

public class Test{
    public static void main(String args[]) {
        ArrayList<Integer> arrayList = new ArrayList<>();

        System.out.println(getArrayListCapacity(arrayList));

        //增加元素,使其扩容
        arrayList.add(0);
        System.out.println(getArrayListCapacity(arrayList));

        for(int i = 0; i < 10; ++i)
            arrayList.add(0);
        System.out.println(getArrayListCapacity(arrayList));

        for(int i = 0; i < 5; ++i)
            arrayList.add(0);
        System.out.println(getArrayListCapacity(arrayList));
    }

    public static int getArrayListCapacity(ArrayList<?> arrayList) {
        Class<ArrayList> arrayListClass = ArrayList.class;
        try {
            Field field = arrayListClass.getDeclaredField("elementData");
            field.setAccessible(true);
            Object[] objects = (Object[])field.get(arrayList);
           return objects.length;
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
            return -1;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return -1;
        }
    }
}

输出:

0

10

15

22


初次扩容容量置为10,以后每次扩容容量增大一半。

ArrayList 是怎么实现可变长度的,Capacity容量

都知道ArrayList是基于数组的,那它是怎么实现可变的呢? 创建ArrayList对象时,ArrayList有个带参数的构造函数,那个参数的意思就代表着ArrayList长度,默认情况是10。当数...
  • u014520797
  • u014520797
  • 2016-10-31 22:27:33
  • 2980

java 如何查看ArrayList的容量capacity

刚刚仔细研究了下ArrayList的源码,发现其自动扩容公式为capacity=capacity+(capacity&amp;gt;&amp;gt;1) (简化后),想验证一下capacity即ele...
  • lucky1521
  • lucky1521
  • 2018-04-16 21:25:47
  • 12

Java中的ArrayList的初始容量和容量分配

转载   http://www.cnblogs.com/ShanHeDiao/p/4402030.html List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在...
  • qq_30009669
  • qq_30009669
  • 2017-04-21 13:54:32
  • 677

Java中的ArrayList的容量

List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。ArrayList继承于List接口,除继承过来的方法外,还提供一些方法来操作内部用来存储列表的数组的大...
  • arui319
  • arui319
  • 2008-12-19 13:32:00
  • 14082

关于ArrayList的初始容量以及扩容的效率问题

论坛的一个问题: 有这样一段很简单的代码:  ArrayList a = new ArrayList ();  a.addAll(b);  a.addAll(c);  其中Da...
  • u014723529
  • u014723529
  • 2014-11-19 21:54:23
  • 1006

android 获取ArrayList的Capacity

今天,简单讲讲如何获取  ArrayList的Capacity。 这里,需要了解一下ArrayList的源码。 一.ArrayList的源码解析 每个ArrayL...
  • bzlj2912009596
  • bzlj2912009596
  • 2017-12-01 08:56:17
  • 129

ArrayList 扩容 Android Java 真的不一样

如果图片显示失败 请来这里链接简书地址以前学java基础的时候 看过ArrayList的扩容机制实现原理是下面这样 当时做的笔记 ArrayList扩容机制 在jdk1.7前是 *3/2+1 ...
  • liubo080852
  • liubo080852
  • 2016-01-06 11:54:25
  • 1055

Hadoop系列(5)之容量调度器Capacity Scheduler配置

1. 应用场景 本文只关注配置,关于调度器的算法以及核心内容将在下一篇介绍。 Capacity Scheduler是YARN中默认的资源调度器,但是在默认情况下只有root.default 一个...
  • lantian0802
  • lantian0802
  • 2016-07-15 14:55:45
  • 2428

ArraylList的扩容机制和使用ensureCapacity()方法提高性能

ArrayList的扩容规则是变成原来最大容量的1.5倍+1 具体为什么,现在看一下源码: public boolean add(E e) { ensureCapacityInt...
  • glory1234work2115
  • glory1234work2115
  • 2016-03-11 20:51:00
  • 3889

java中ArrayList初始容量和容量分配

List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。 ArrayList继承于List接口,除继承过来的方法外,还提供一些方法来操作内部用来存储列表的...
  • u012454924
  • u012454924
  • 2017-08-17 10:43:28
  • 119
收藏助手
不良信息举报
您举报文章:java 如何查看ArrayList的容量capacity
举报原因:
原因补充:

(最多只允许输入30个字)