Java Learning(5) -- ArrayList

如何动态的查看ArrayList的容量?

在ArrayList提供的方法中,有三个方法:

size() -- 返回当前列表中的元素数量;

trimToSize() -- 将当前ArrayList容量调整为列表的当前大小;

ensureCapacity(int minCapacity) -- 如果需要扩展列表的容量以确保能够装下minCapacity个元素;

那如何动态的监控整个列表的容量变化?

请参考如下代码:

  import java.lang.reflect.Field;

import java.util.ArrayList;

public class ArraySizeTest {

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<String> testArray = new ArrayList<String>(5);

        Field AL_Field;
        Field AL_Field_1;
        Field AL_Field_2;
        Field AL_Field_3;
        try {
            //check the initial capacity of testArray
            Class AL_Class = testArray.getClass();
            AL_Field = AL_Class.getDeclaredField("elementData");
            AL_Field.setAccessible(true);
            Object[] objects = (Object[]) AL_Field.get(testArray);
            System.out.println(objects.length);
            System.out.println(testArray.size());
            //result: capacity = 5, size = 0;

            //add 4 items in the testArray
            System.out.println("1::>    " + testArray.hashCode());
            for(int i=0; i<4; i++){          testArray.add(i, Integer.toString(i));          System.out.println("1."+i+"::> " + testArray.hashCode());
            }
            System.out.println(objects.length);
            System.out.println(testArray.size());
            System.out.println("2::>    " + testArray.hashCode());
            //result: capacity = 5, size = 4;
            //result: new a ArrayList

            //after trimToSize
            testArray.trimToSize();
            //re-get the objects
            Class AL_Class_1 = testArray.getClass();
            AL_Field_1 = AL_Class_1.getDeclaredField("elementData");
            AL_Field_1.setAccessible(true);
            Object[] objects_1 = (Object[]) AL_Field_1.get(testArray);
            System.out.println(objects_1.length);
            System.out.println(testArray.size());
            //result: capacity = 4, size = 4;

            //larger the capacity to 6
            System.out.println("3::>    " + testArray.hashCode());
            testArray.ensureCapacity(6);
            testArray.add("5");
            testArray.add("6");
            testArray.add("7");
            System.out.println("4::>    " + testArray.hashCode());
            //after adding item the testArray is re-created
            //re-get the objects
            Class AL_Class_2 = testArray.getClass();
            AL_Field_2 = AL_Class_2.getDeclaredField("elementData");
            AL_Field_2.setAccessible(true);
            Object[] objects_2 = (Object[]) AL_Field_2.get(testArray);
            System.out.println(objects_2.length);
            System.out.println(testArray.size());
            System.out.println("5::>    " + testArray.hashCode());
            //result: capacity = 9, size = 7;
            //do not create a new ArrayList

            testArray.trimToSize();
            //re-get objects
            Class AL_Class_3 = testArray.getClass();
            AL_Field_3 = AL_Class_3.getDeclaredField("elementData");
            AL_Field_3.setAccessible(true);
            Object[] objects_3 = (Object[]) AL_Field_3.get(testArray);
            System.out.println(objects_3.length);
            System.out.println(testArray.size());
            System.out.println("6::>    " + testArray.hashCode());
            //result: capacity = 7, size = 7;
            //result: do not create a new ArrayList

        } catch (NoSuchFieldException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

结果:

5
0
1::> 1
1.0::> 79
1.1::> 2498
1.2::> 77488
1.3::> 2402179
5
4
2::> 2402179
4
4
3::> 2402179
4::> -1451076781
9
7
5::> -1451076781
7
7
6::> -1451076781

从代码中可以看出:

ArrayList每次在追加item之后都在重新创建一个ArrayList对象,直到运用ensureCapacity方法。

虽然我们设定了最大长度为6,但是当追加的内容数目超出6之后,随着size的增大,ArrayList的容量在变大,具体变大多少从本例中看到的是2,我也尝试过追加内容,增大原则大致是2,3,5,8,13...(i = (i-1)+(i-2))。

另外需要注意的是在每次利用反射找出ArrayList的容量后对ArrayList修改,下次再要进行容量计算时需要重新做Object Get。

时间: 2024-11-11 17:09:26

Java Learning(5) -- ArrayList的相关文章

JAVA集合类之ArrayList源码分析

ArrayList继承自AbstractList抽象类,实现了List接口.  public class ArrayList<E> extends AbstractList<E>         implements List<E>, RandomAccess, Cloneable, java.io.Serializable ArrayList类中存储数据用的是Object类型的数组 private transient Object[] elementData; 此处的

Java中针对 ArrayList和LinkedList 的区别

一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针.      3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据. ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用

Java之——删除ArrayList中的反复元素的2种方法

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47414935 ArrayList是Java中最经常使用的集合类型之中的一个.它同意灵活加入多个null元素,反复的元素,并保持元素的插入顺序.在编码时我们经常会遇 到那种必须从已建成的ArrayList中删除反复元素的要求.这篇文章将给出两种从ArrayList中删除反复元素的方法. 方法1:使用HashSet删除ArrayList中反复的元素 在该方法中.我们使用HashSet

实现Java中的ArrayList

最近深受轮子哥影响,觉得造一些轮子应该会对自己的技术功底有一定的帮助,就决定先从简单的容器开始实现.废话不多说,就先实现一个Java中的ArrayList. ArrayList是我们在Java中使用非常多的一个类,它是顺序表的数组实现,LinkedList是顺序表的链式实现(自己编的名字,懂就好哈),还有个Vector,它与ArrayList比较像,区别是它是线程安全的. 顺序表应该都有相同的操作,所以我先定义一个接口,描述好顺序表需要哪些操作.代码如下: public interface KI

Java之——删除ArrayList中的重复元素的2种方法

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47414935 ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素,重复的元素,并保持元素的插入顺序.在编码时我们经常会遇 到那种必须从已建成的ArrayList中删除重复元素的要求.这篇文章将给出两种从ArrayList中删除重复元素的方法. 方法1:使用HashSet删除ArrayList中重复的元素 在该方法中,我们使用HashSet来删除重复

JAVA Vector和ArrayList使用及性能比较

  相同点: 都继承于AbstractList,并且实现List接口 都实现了RandomAccess和Cloneable接口 默认数组容量是10个 都支持Iterator遍历 不同点: ArrayList是非线程安全: 而Vector是线程安全的,它的函数都是synchronized的,即都是支持同步的 序列化支持不同: ArrayList实现了java.io.Serializable接口 容量增加数量不同: 容量不足时,"ArrayList新的容量"="(原始容量x3)/

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

List接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.ArrayList继承于List接口,除继承过来的方法外,还提供一些方法来操作内部用来存储列表的数组的大小.每个ArrayList实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于列表的大小.随着向ArrayList中不断添加元素,其容量也自动增长.并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单. ArrayList是经常会被用到的,一般情况下,使用的

从源码看Java集合之ArrayList

Java集合之ArrayList - 吃透增删查改 从源码看初始化以及增删查改,学习ArrayList. 先来看下ArrayList定义的几个属性: private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; tra

java集合框架--ArrayList类、Vector和LinkedList类

1.ArrayList类概述 底层数据结构是数组,查询块,增删慢. 线程不安全,效率高. 2.ArrayList案例 2.1存储字符串并遍历 package com; import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; public class ArrayListDemo { public static void main(String[] args) { //创建ArrayL