ArrayList扩容1.5倍

ArrayList扩容1.5倍先写一个小案例代码packagecom.itheima.demo;importjava.lang.reflect.Field;importjava.util.ArrayList;publicclassArrayListDemo{publicstaticvoidmain(String[]args){ArrayList<I…

大家好,又见面了,我是你们的朋友全栈君。

先写一个小案例

代码
package com.itheima.demo;

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

public class ArrayListDemo {

    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        Integer capacity = getCapacity(list1);// 获取容量
        int size = list1.size();
        System.out.println("list1的容量:" + capacity);
        System.out.println("list1的大小:" + size);
        System.out.println("----------------------------");

        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(1);
        capacity = getCapacity(list2);// 获取容量,arraylist初始化容量是10
        size = list2.size();
        System.out.println("list2的容量:" + capacity);
        System.out.println("list2的大小:" + size);
        System.out.println("----------------------------");

        ArrayList<Integer> list3 = new ArrayList<>();

        capacity = getCapacity(list3);// 获取容量,arraylist初始化容量是10
        for (int i = 0; i < 10; i++) {
            list3.add(i);
        }
        capacity = getCapacity(list3);
        size = list3.size();
        System.out.println("list3的容量:" + capacity);
        System.out.println("list3的大小:" + size);
        System.out.println("----------------------------");

        ArrayList<Integer> list4 = new ArrayList<>();
        for (int i = 0; i < 11; i++) {
            list4.add(i);
        }
        capacity = getCapacity(list4);// 获取容量
        size = list4.size();
        System.out.println("list4的容量:" + capacity);
        System.out.println("list4的大小:" + size);

    }

    // 获取list容量
    public static Integer getCapacity(ArrayList list) {
        Integer length = null;
        Class clazz = list.getClass();
        Field field;
        try {
            field = clazz.getDeclaredField("elementData");
            field.setAccessible(true);
            Object[] object = (Object[]) field.get(list);
            length = object.length;
            return length;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return length;
    }
}
运行结果

这里写图片描述
当ArrayList不为空时,并且它的大小不超过10时,它的容量都是10.但当大小从10增加到11时,容量变成了15,扩大了1.5倍.

ArrayList的源代码

   /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return <tt>true</tt> (as specified by {@link Collection#add}) */
    public boolean add(E e) {
        ensureCapacityInternal(size + 1); 
         //调用了一ensureCapacityInternal方法,实现list的容量换算,继续往下点击源代码
        elementData[size++] = e;
        return true;
    }

    private void ensureCapacityInternal(int minCapacity) {
        if (elementData == EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);//不管怎么样,最后都要走这一步,继续往下点击
 private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);//最后时限扩容的是grow,所以继续往下看grow的源码
    }
  private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);//新容量扩大到原容量的1.5倍,右移一位相关于原数值除以2。
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

从案例和源代码来说,ArrayList的扩容是原来的1.5倍,当然,实际操作中,ArrayList扩容可能大于1.5倍,毕竟ArrayList调用add时,所涉及到的代码不止上面这一小点.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130148.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python读取txt文件并画图[通俗易懂]

    1,使用python读取txt文件已知txt文件内容如下:001124394165256361234567请以第一列为x轴,第二列为y轴画图 步骤如下: 1)使用readlines读取文件 2)建立两个空列表X,Y,将第一列的数字放入X,第二列的数字放入Y中 3)以X,Y为轴画图 实现如下…

    2022年4月7日
    475
  • 硬核!SpringBoot连接MySQL数据库,十分钟啃透「建议收藏」

    硬核!SpringBoot连接MySQL数据库,十分钟啃透「建议收藏」目录1.pom.xml添加依赖2.application.properties添加数据库配置3.添加实体类4.添加Dao5.添加Controller6.新建数据库7.测试上篇只需两步!Eclipse+Maven快速构建第一个SpringBoot项目已经构建了一个SpringBoot项目,本文在此基础上进行连接MySQL数据库的操作。1.pom.xml添加依赖<dependency><groupId&.

    2022年6月25日
    33
  • keil uvision4 注册机 使用方法「建议收藏」

    keil uvision4 注册机 使用方法「建议收藏」1.先安装keiluvision4,然后打开“File”的“LicenseManagement”拷贝CID编号。2、打开KEIL_Lic.exe,“target”选择arm,如下图所示3、把MDK4.12的CID编号粘贴到下图CID里面,点击“Generate”。4、把上图红方框内生成的注册码,拷贝到下图的“NewLicenseIDCode”内

    2022年5月20日
    127
  • Java中Map接口的解析

    Java中Map接口的解析Map详解:先看图,便于宏观了解Map的地位。Map接口中键和值一一映射.可以通过键来获取值。给定一个键和一个值,你可以将该值存储在一个Map对象.之后,你可以通过键来访问对应的值。 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常. 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个ClassCastException异常。…

    2022年7月8日
    24
  • class文件和dex文件「建议收藏」

    class文件和dex文件「建议收藏」Class文件1、什么是class文件能够被JVM识别,加载并执行的文件格式。2、class文件的生成![这里写图片描述](https://img-blog.csdn.net/20180817160829200?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RldmVsb3BBbmRyb2lk/font/5a6L5L2T/f…

    2022年6月27日
    29
  • 白话经典算法系列之七 堆与堆排序

    白话经典算法系列之七 堆与堆排序

    2021年12月7日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号