Java数据结构-通过数组封装-结构分析

1、默认arrayList的数组未初始化,长度为0,容量默认是10

        ArrayList arrayList = new ArrayList<>();
        System.out.println(ClassLayout.parseInstance(arrayList).toPrintable());
java.util.ArrayList object internals:
OFF  SZ                 TYPE DESCRIPTION               VALUE
  0   8                      (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   4                      (object header: class)    0x0000d7a0
 12   4                  int AbstractList.modCount     0
 16   4                  int ArrayList.size            0
 20   4   java.lang.Object[] ArrayList.elementData     []
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

 2、第一次使用时会初始化:长度为1,容量是10

        ArrayList arrayList = new ArrayList<>();
        arrayList.add(1);
        System.out.println(ClassLayout.parseInstance(arrayList).toPrintable());
java.util.ArrayList object internals:
OFF  SZ                 TYPE DESCRIPTION               VALUE
  0   8                      (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   4                      (object header: class)    0x0000d7a0
 12   4                  int AbstractList.modCount     1
 16   4                  int ArrayList.size            1
 20   4   java.lang.Object[] ArrayList.elementData     [1, null, null, null, null, null, null, null, null, null]
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

 3、第一次扩容:第11次添加数据时扩容,长度为11,容量扩容为15

        ArrayList arrayList = new ArrayList<>();
        arrayList.add(1);
        for (int i = 2; i <=10; i++) {
            arrayList.add(i);
        }
        arrayList.add(11);
        System.out.println(ClassLayout.parseInstance(arrayList).toPrintable());
java.util.ArrayList object internals:
OFF  SZ                 TYPE DESCRIPTION               VALUE
  0   8                      (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   4                      (object header: class)    0x0000d7a0
 12   4                  int AbstractList.modCount     11
 16   4                  int ArrayList.size            11
 20   4   java.lang.Object[] ArrayList.elementData     [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, null, null, null, null]
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

4、 实现通用的数组:ArrayList

  • 初始化:内部使用数组保存数据
  • 方法:是否为空,是否已满,获取元素个数,新增数据,删除数据,修改数据,获取指定索引位置的数据,遍历打印:正序反序,扩容,缩容

 5、ArrayList集合的长度和容量不是同一个意思

  1. 长度(size)是指ArrayList中当前存储的元素数量。而容量(capacity)是指ArrayList内部数组可以容纳的元素数量。在ArrayList初始化时,它会创建一个内部数组,这个数组的初始大小是10。即使你还没有添加任何元素,这个数组仍然存在,所以ArrayList的初始长度是0,但初始容量是10。
  2. 当你向ArrayList添加元素时,如果当前长度小于容量,那么它不会重新分配数组。只有当长度超过了容量时,ArrayList才会考虑扩容,扩容后的容量通常是原容量的1.5倍加上10。
  3. 所以,长度和容量是两个不同的概念,但它们之间有一定的关联。
  4. ArrayList集合的length和capacity不是同一个意思。  
  5. length表示ArrayList集合中元素的个数,可以通过size()方法获取。  
  6. capacity表示ArrayList集合的容量,即当前ArrayList能够存储的元素个数的上限,可以通过capacity()方法获取。  
  7. 简单来说,length表示当前ArrayList中存储的元素个数,
  8. 而capacity表示ArrayList能够存储的元素个数的上限。当向ArrayList中添加元素时,如果超过了ArrayList的容量,ArrayList会自动扩展其容量,以容纳更多的元素。

 Java数据结构-通过数组封装-结构分析_第1张图片

你可能感兴趣的:(Java数据结构和算法,java,数据结构,开发语言)