ArrayList源码分析-03

本文主要探讨了ArrayList的扩容机制,通过分析grow方法,展示了如何在容量不足时动态扩大数组大小。首先创建了一个Person类作为示例数据类型,然后详细解释了grow方法的实现过程,包括旧容量的获取、新容量的计算以及数据迁移。当新容量不满足需求或超过最大数组容量时,进行了相应的处理。通过对这个方法的理解,可以更好地掌握ArrayList内部的工作原理。
摘要由CSDN通过智能技术生成

ArrayList源码分析Ⅲ

3. grow方法实现数组扩容操作
3.1 Person类创建
首先创建一个Preson类,这样写代码的时候不会出现那么多错误:
内容为有参和无参构造以及参数的setter和getter方法 还有toString方法
package com.qfedu.ArrayList;

public class Person {
    private String name;
    private int age;
    private boolean gender;

    public Person() {
    }

    public Person(String name, int age, boolean gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isGender() {
        return gender;
    }

    public void setGender(boolean gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}
注:不要问我为什么把Person类代码写出来,我只是为了水字数。-.-
3.2 grow方法实现
package com.qfedu.ArrayList;

/**
 * grow方法实现数组扩容操作
 * @author LongMaple
 */
public class Demo {
    /**
     * Demo类内用于保存Person类内数据的数组
     */
    private Person[] allots;

    /**
     * 定义一个常量作为数组的默认容量,按需要设定初始容量,只要不超过int类型范围就行
     */
    private static final int DEFAULT_SIZE = 10;

    /**
     * 当前允许数组的最大容量(不要问为什么-8,甲鱼的臀部,规定)
     */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    private void grow(int minCapacity) {
        // TODO Auto-generated method stub
        System.out.println("grow method Called");

        //首先展示原数组容量
        int oldCapacity = allots.length;

        //然后计算新数组容量 注:(oldCapacity >> 1) = (oldCapacity / 2)
        int newCapacity = oldCapacity + (oldCapacity >> 1);

        //判断新数组是否满足最小容量的要求
        if (newCapacity < minCapacity) {
            newCapacity = minCapacity;
        }
        //判断新数组是否超过MAX_ARRAY_SIZE数组最大容量,如果超过需要考虑其他结构存储
        if (newCapacity > MAX_ARRAY_SIZE) {
            //TODO  容量超出范围,需要进行警告提示!!!
            System.out.println("数组超出最大范围,无法扩容。");
        }

        //根据以上判定所获得的新数组容量创建一个新数组
        Person[] temp =  new Person[newCapacity];
        //复制数据到新的数组
        for (int i = 0; i < oldCapacity; i++) {
            temp[i] = allots[i];
        }

        //保存新的数组地址
        allots = temp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值