首页 > 编程语言 >Java 使用 数组实现 动态数组

Java 使用 数组实现 动态数组

时间:2024-01-15 09:59:32浏览次数:23  
标签:index Java int 数组 return array 动态 public size

前述

数组是各编程语言中最为基础的一个数据结构,在Java 语言中,平时使用也很多,同时,JDK 提供了 动态数组的实现,ArrayList,这里 我使用数组来实现一下动态数组,

参考实现

import java.util.function.Consumer;

/**
 * 使用数组 实现动态数组 ArrayList
 */
public class DynamicArray<E> {
    // new ArrayList<String>()
    //1、声明数组
    private Object[] array;
    //默认大小
    private final int INITIAL_CAPACITY = 10;

    //构造器
    public DynamicArray() {
        this.array = new Object[INITIAL_CAPACITY];
    }

    //大小
    private int size;

    /**
     * 返回数组元素数
     *
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     *
     * @return
     */
    public Boolean isEmpty() {
        return size == 0;
    }

    /**
     * 中间添加元素
     *
     * @param index
     * @param element
     */
    public void add(int index, E element) {
        //判断索引是否合法
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            //判断是否需要扩容
            if (size >= array.length) {
                //进行扩容
                grow();
            } else {
                //腾位置,指定位置写元素
                for (int i = size - 1; i >= index; i--) {
                    array[i + 1] = array[i];
                }
                array[index] = element;
            }
        }
        size++;
    }

    /**
     * 末尾添加元素
     *
     * @param element
     */
    public void add(E element) {
        this.add(size, element);
    }

    /**
     * 获取指定位置元素
     *
     * @param index
     * @return
     */
    public E get(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            return (E) array[index];
        }
    }

    /**
     * 删除指定位置元素
     *
     * @param index 要删除的数据索引
     * @return 删除的数据
     */
    public E remove(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            Object temp = array[index];
            for (int i = index + 1; i < size - 1; i++) {
                array[i - 1] = array[i];
            }
            size--;
            return (E) temp;
        }
    }

    /**
     * 重置指定位置元素
     *
     * @param index 索引
     * @param element 新数据
     * @return 旧数据
     */
    public E set(int index, E element) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            Object e = array[index];
            array[index] = element;
            return (E) e;
        }
    }

    /**
     * 遍历
     *
     * @param consumer
     */
    public void forEache(Consumer<E> consumer) {
        for (int i = 0; i < size; i++) {
            consumer.accept((E) array[i]);
        }
    }

    /**
     * 扩容
     * for (int i = 0; i < array.length; i++) {
     * newArray[i] = array[i];
     * }
     * arraycopy 是 native 修饰的方法,底层可以使用 C 语言的 api 进行处理,效率更高
     *
     * @IntrinsicCandidate public static native void arraycopy(Object src,  int  srcPos,
     * Object dest, int destPos,
     * int length);
     */
    private void grow() {
        Object[] newArray = new Object[array.length * 2];
        System.arraycopy(array, 0, newArray, 0, array.length);
        array = newArray;
    }

    /**
     * 判断索引是否有效
     *
     * @param index 索引
     * @return true 有效
     */
    private boolean checkIndex(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            return true;
        }
    }

    /**
     * 格式化输出
     * @return
     */
    @Override
    public String toString() {
        if (isEmpty()) {
            return "[]";
        } else {
            StringBuilder builder = new StringBuilder();
            builder.append("[");
            forEache(item -> builder.append(item).append(","));
            builder.replace(builder.length() - 1, builder.length(), ",");
            return builder.toString();
        }
    }

    public static void main(String[] args) {
        DynamicArray<Integer> arr = new DynamicArray<>();
        for (int i = 0; i < 15; i++) {
            arr.add(i);
        }
        System.out.println(arr);
    }
}

 

标签:index,Java,int,数组,return,array,动态,public,size
From: https://www.cnblogs.com/wdh01/p/17964722

相关文章

  • 数组 数组的内存 面向对象 this
    静态初始化全写:数据类型[]数组名=new数据类型{值};简写:数据类型[]数组名={值};动态初始化数据类型[]数组名=new数据类型[数组长度];数组不赋值时会默认初始化一个值整数:0小数:0.0字符:"/uoooo"(显示出来就是一个空格)布尔:FALSE引用数据类型:null数组的内存堆内存......
  • 「Java开发指南」MyEclipse如何支持Spring Scaffolding?(一)
    MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论1.使用Spring的Scaffolding应用程序支持Spring的MyEclipse目标之一是帮助开发人员从零开始编写更少的代码,并更广泛地使用代码生成,MyEclipse提供了丰富的代码生成选项集。MyEclipse可以为SpringMV......
  • 经典数据结构题目-数组
    704.二分查找解决思路基于数组有序的特性,取其中一个值进行比较,即可淘汰该值左边或右边的元素,缩小搜索的区间使用两指针标记需要遍历的区间,取中间值进行比较,淘汰左边或右边元素,不断移动缩小遍历的区间,即可查到代码publicintsearch(int[]nums,inttarget){......
  • Java基础
    Java基础一、注释//1、单行注释//我是单行注释//2、多行注释/*我是多行注释*///3、文档注释/***@Description我是文档注释*@Author作者*///4、有趣的注释/****_ooOoo_*o8888888o*88......
  • Java入门
    Java入门开发环境1、JDK:JavaDevelopmentKit2、JRE:JavaRuntimeEnvironment3、JVM:JavaVirtMachine三者关系:JDK包含JRE包含JVM编译型和解释型1、编译型(Compiledlanguage)——使用编译器来编译执行的编程语言,这类语言往往会花费较长的编译时间,但编译完成后,会有很好......
  • 后缀数组 SA 学习笔记
    后缀数组SA学习笔记后缀数组处理字符串后缀排名,公共子串类问题十分优秀,可以在部分情况下替代后缀自动机(SAM),本文主要讲解后缀数组的实现过程和部分例题。正文定义后缀:从\(i\)开始到字符串结束的一个特殊子串,本文用\(suf(i)\)表示从\(i\)开始的后缀。后缀数组SA:SA是......
  • java中数组和字符串
    数组数组的声明方式:类型[]变量;数组的创建方式:new类型[数组长度]数组的简单声明并且赋值//声明一个数组,它的长度是3String[]arrs=newString[3];arrs[0]="张三";arrs[1]="李四";//访问数组的值System.out.println(arrs[0]);输出的是张三//获取当前数组的长......
  • 超级简单的后缀数组(SA)笔记!!
    超级简单的后缀数组(SA)!!(未完)前言这里选择当一手标题党。由于刚学完这个字符串算法,本人字符串算法又比较薄弱,好不容易这一次在晚修看各种资料看得七七八八,决定趁脑子清醒的时候记录下来。免得自己不久后忘了后又要痛苦地再看各种资料。希望这篇博客能帮到你。前置知识:RMQ问题......
  • 1.Java基础
    1.1JAVA中的几种基本数据类型是什么,各自占用多少字节。Java中有八种基本数据类型,分别是byte(1bit)、boolean(不占用)char(2bit)、short(2bit)、int(4bit)、long(8bit)、float(4bit)、double(8bit)。1.2String类能被继承吗,为什么。String类不能被继承,因为其被final关键字声明,不允许被......
  • 用数组作为函数参数来实现冒号排序函数
    define_CRT_SECUNRE_NO_WARNINGS1include<stdio.h>voidbubble_sort(intarr[],intsz){inti=0;for(i=0;i<sz;i++)//冒泡的次数{intflag=1;//假设这一趟排序已经有序intj=0;for(j=0;j<sz-1-i;j++){if(arr[j]>arr[j+1]){inttmp......