动态数组的实现

定义

1. 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。

2. 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。

3. 知道了数组的数据其实地址BaseAddress,就可以由公式BaseAddress+ i * size 计算出索引i元素的地址。

 * i 即索引,在java,C等语言都是从0开始。

* size 是每个元素占用字节,例如int 占4,double 占8.

性能

空间占用

java中数据结构为:

* 8字节markword

* 4字节class指针(压缩class指针的情况)

* 4 字节数组大小(决定了数组最大容量 2 ^ 32) 

* 数组元素 + 对齐字节(java中所有对象都是8字节1的整数倍 ^12  , 不足的要用对齐字节补足)

动态数组

package com.ma.test;

import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;

/**
 * @author Mtz
 * @version 1.0
 * @2023/12/2119:51
 * @function
 * @comment
 */
public class DynamicArray implements Iterable<Integer> {

    private int size = 0; // 逻辑大小
    private int capacity = 8; // 容量
    private int[] array = new int[capacity];

    public void addLast(int element) {
        add(size, element);
    }

    public void add(int index, int element) {

        checkAndGrow();

        if (index >= 0 && index < size) {
            // 向后挪动,空出待插入位置
            System.arraycopy(array, index, array
                    , index + 1, size - index);
        }
        array[index] = element;
        size++;
    }

    private void checkAndGrow() {

        if (size == 0) {
            array = new int[capacity];
            // 容量检查
        } else if (size == capacity) {
            // 进行扩容
            capacity += capacity >> 1;

            int[] newArray = new int[capacity];
            System.arraycopy(array, 0, newArray, 0, size);
            array = newArray;
        }
    }


    public int get(int index) {
        return array[index];
    }

    public void foreach(Consumer<Integer> consumer) {
        {
            for (int i = 0; i < size; i++) {
                consumer.accept(array[i]);
            }
        }
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int i = 0;

            @Override
            public boolean hasNext() {
                return i < size; // 有没有下一个元素
            }

            @Override
            public Integer next() {  // 并移动到下一个元素
                return array[i++];
            }
        };
    }

    public IntStream stream() {
        return IntStream.of(Arrays.copyOfRange(array, 0, size));
    }


    public int remove(int index) {
        int removed = array[index];

        if (index < size - 1) {
            System.arraycopy(array, index + 1, array,
                    index, size - index - 1);
        }
        size--;
        return removed;
    }
}

测试

package com.ma.test;

/**
 * @author Mtz
 * @version 1.0
 * @2023/12/229:05
 * @function
 * @comment
 */
public class Test {
    public static void main(String[] args) {
        DynamicArray dynamicArray = new DynamicArray();
        dynamicArray.addLast(1);
        dynamicArray.addLast(2);
        dynamicArray.addLast(3);
        dynamicArray.addLast(4);

        dynamicArray.foreach((element)->{
            System.out.println(element);
        });

        for (Integer element : dynamicArray){
            System.out.println(element);
        }

        dynamicArray.stream().forEach(element->{
            System.out.println(element);
        });
    }
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值