动态数组

动态数组

数组本身是固定元素个数的,但是为了存储数据,这个数组可能会满,解决这个问题。
发现数组满了,就新建一个更大的数组,把原数组的数据复制过来,并销毁原数组数组就像一个仓库。
一次性新建超大仓库不可取,会浪费空间。
每次比原来的大一点,也不可取,会效率低下。
新建仓库是原来仓库的1.5倍比较合适。
比如原数组int[] arr = new int[]{1,2,3,4};
新数组的大小是它的1.5倍是6. 4+(4/2) 4+(4>>1)

arr.length + (arr.length>>1);
int[] newArr = new int[6];
for(int i = 0;i<arr.length;i++){
	newArr[i] = arr[i];
	}

例1:往一空间大小为4的数组中添加10个数字,当空间不够时,自动将数组空间增大为原来的1.5倍

package c22;

import java.util.Arrays;

/**
 * @author zt
 * @version 1.0
 * @date
 */
public class C234 {
    /**
     * 存储数据的数组
     */
    int[] arr;
    /**
     * 当前的位置
     */
    int index = 0;

    /**
     * 无参的默认的构造方法
     */
    public C234(){
        // 知识点,构造方法嵌套调用,直接写this,不写方法名
        // 此代码只能是第一行
        this(4);
    }

    /**
     * 初始化对象
     * @param capacity
     */
    public C234(int capacity){
        this.arr = new int[capacity];
    }
    public static void main(String[] args) {
        C234 c = new C234();
        for (int i = 0;i<10;i++){
            c.add(i);
        }
        System.out.println(Arrays.toString(c.arr));
    }

    /**
     * 增加一个数字
     * @param num
     */
    public void add(int num){
        if (index<arr.length){
            arr[index++] = num;
        }else {
            int length = arr.length + (arr.length >> 1);
            arr = Arrays.copyOf(arr,length);
        }

    }
}

例2:创建学生类,有id,name属性;创建学生管理类,添加学生信息,当空间不够时自动增大空间
首先创建学生类,并编写构造方法、get、set方法与to String方法

public class Student {
    /**
     * 编号
     */
    protected int id;
    /**
     * 姓名
     */
    private String name;

    /**
     * 默认构造方法
     */
    public Student() {
    }

    /**
     * 构造方法
     * @param id
     * @param name
     */
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

创建学生管理类,编写添加学生方法

public class StudentManager {
    /**
     * 学生数组
     */
    Student[] students;
    /**
     * 当前数组指针
     */
    int index;

    public StudentManager(){
        this(4);
    }
    /**
     * 初始化
     * @param length
     */
    public StudentManager(int length){
        this.students = new Student[length];
    }

    /**
     * 增加学生
     * @param student
     */
    public void addStudent(Student student){
        if (index == students.length){
            int length = students.length + (students.length >> 1);
            students = Arrays.copyOf(students,length);
        }
        students[index++] = student;
    }

    public static void main(String[] args) {
        StudentManager studentManager = new StudentManager();
        for (int i=0;i<10;i++) {
            studentManager.addStudent(new Student(i, "name" + i));
        }
        System.out.println(Arrays.toString(studentManager.students));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值