java实现动态数组

本文实例为大家分享了java实现动态数组的具体代码,供大家参考,具体内容如下

数组最大的优点︰快速查询。scores[2]。数组最好应用于“索引有语意”的情况,但是如果索引比较长就还是不要用数组了,比如身份证号,太长了。

Java提供给我们的数组是静态数组,大小在一开始就定下来了,所以我们要创建一个动态数组,来满足我们的需求。其实原理挺简单,初次创建的时候赋予一个初始大小,当容量不够用时进行扩容,下列代码最关键的是resize方法

public class Array<E> {
    private E[] data;
    private Integer size;

    /**
     * 声明容量大小
     *
     * @param capacity
     */
    public Array(Integer capacity) {
        // 在java里不能直接创建一个泛型数组,只能这样转换
        data = (E[]) new Object[capacity];
        size = 0;
    }

    public Array() {
        this(20);// 默认容量为20
    }

    /**
     * 获取指定索引的值
     *
     * @param key
     * @return
     * @throws Exception
     */
    public E get(Integer key) throws Exception {
        if (key >= data.length || key < 0 || key >= size)
            throw new Exception("该索引非法");
        return data[key];
    }

    /**
     * 向指定索引内添加一个值,该索引以及索引后有值,则这些值都后移一位
     *
     * @param key   key不能大于size,不能小于0
     * @param value 要插入的值
     */
    public void insert(Integer key, E value) throws Exception {
        this.resize(true);// 要在key检查之前执行
        this.checkKey(key, false);
        // 后移一位
        for (Integer i = size - 1; i >= key; i--)
            data[i + 1] = data[i];
        data[key] = value;
        size++;
    }

    /**
     * 删除指定索引的元素,后面的元素全部前移一个索引
     *
     * @param key
     */
    public void delete(Integer key) throws Exception {
        checkKey(key, true);
        for (Integer i = key; i < size - 1; i++)
            data[i] = data[i + 1];
        // 实际上是通过覆盖的方式删除掉key索引的值,但是最后还需要删除掉size-1索引的值
        data[size - 1] = null;
        size--;
        this.resize(false);
    }

    /**
     * 检查key是否合法
     *
     * @param key
     * @param equal 若为true则key不能等于size,反之可以等于
     * @throws Exception
     */
    private void checkKey(Integer key, Boolean equal) throws Exception {
        if (equal) {
            if (key >= data.length || key < 0 || key >= size)
                throw new Exception("该索引非法");
        } else {
            if (key >= data.length || key < 0 || key > size)
                throw new Exception("该索引非法");
        }
    }

    /**
     * 重置数组大小
     *
     * @param isExpand 是否扩容
     */
    private void resize(Boolean isExpand) {
        if (size == data.length && isExpand) {
            //如果数组已经满了,那么就扩容为当前容量的1.5倍
            E[] buffer = (E[]) new Object[size + (size / 2)];
            for (Integer i = 0; i < size; i++)
                buffer[i] = data[i];
            data = buffer;
        } else if (size < data.length / 4 && (!isExpand) && data.length / 2 != 0) {
            //如果数组的size小于容量的四分之一,则容量降低一半
            E[] buffer = (E[]) new Object[data.length / 2];
            for (Integer i = 0; i < size; i++)
                buffer[i] = data[i];
            data = buffer;
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java动态数组添加数据的方法与应用示例

    本文实例讲述了Java动态数组添加数据的方法与应用.分享给大家供大家参考,具体如下: 输入客户的姓名,客户的人数不定.待输入完成后,请打印出客户的名单,并定义一个方法查询客户是否在这些客户中. 代码示例: package com.jredu.ch06.exer; import java.util.Arrays; import java.util.Scanner; public class CustomBiz { public String[] custom; public void addNam

  • Java版C语言版简单使用静态语言实现动态数组的方法

    动态语言相对于静态语言的一个优势,就是数组可以不需要预先确定大小,对于一些数组长度不确定的场景下是非常有用的.像PHP,只需要声明一下数组 $arr = array() 然后就可以直接 $arr[] = 1,$arr[] = 2,$arr[] = 3...这样一直加元素了,删除一个元素就直接使用unset($arr[1]),元素的空间就被释放了,而C和JAVA原生的数组就没有这么方便,声明的时候就必须先预先确定长度,由编译器分配相应的内存空间.不过通过一些巧妙的做法,也是可以实现一样的功能的,这

  • Java二维数组与动态数组ArrayList类详解

    Java二维数组 Java 语言中提供的数组是用来存储固定大小的同类型元素. 1.二维数组初始化和声明 数组变量的声明,和创建数组可以用一条语句完成,如下所示: int a[][] = new int[2][3]; int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; 2.二维数组遍历 //遍历二维数组 public class Traverse_a_two_dimensional_array { public static void main(String[] ar

  • Java封装数组之动态数组实现方法详解

    本文实例讲述了Java封装数组之动态数组实现方法.分享给大家供大家参考,具体如下: 前言:在此之前,我们封装的数组属于静态数组,也即数组空间固定长度,对于固定长度的数组当元素超过容量时会报数组空间不足.为了能更好的使用数组,我们来实现一个可以自动扩充容量的数组. 实现思路: 1.当数组容量达到事先定义值时创建一个空间是data数组两倍的newData数组(扩容): 2.把data数组中的元素全部赋值到newData数组中: 3.把data数组重新执行newData数组. 一.定义核心扩容方法 /

  • Java 自定义动态数组方式

    Java自定义动态数组 1.静态数组向动态数组转变 (1)静态数组,数组空间固定长度 这个数组空间总长为4,如果此时新插入一个数据就会报数组空间不足 (2)静态数组如何转变成动态数组 第一步:创建一个空间是data数组两倍的newData数组(扩容): 第二步:把data数组中的元素全部赋值到newData数组: 2.数组扩容程序 // 数组扩容 private void resize(int newCapacity){ E[] newData = (E[]) new Object[newCap

  • java实现动态数组

    本文实例为大家分享了java实现动态数组的具体代码,供大家参考,具体内容如下 数组最大的优点︰快速查询.scores[2].数组最好应用于"索引有语意"的情况,但是如果索引比较长就还是不要用数组了,比如身份证号,太长了. Java提供给我们的数组是静态数组,大小在一开始就定下来了,所以我们要创建一个动态数组,来满足我们的需求.其实原理挺简单,初次创建的时候赋予一个初始大小,当容量不够用时进行扩容,下列代码最关键的是resize方法 public class Array<E>

  • Java 动态数组的实现示例

    目录 静态数组 动态数组的实现原理 1.添加元素 2.删除元素 3.数组扩容 4.数组缩减 静态数组 Java中最基本的数组大家肯定不会陌生: int[] array = new int[6]; for (int i = 0; i < array.length; i++){ array[i] = 2 * i + 1; } 通过循环把元素放入指定的位置中,类似于这样: 这是一个静态数组,因为我们在第一步初始化的时候就已经固定了它的长度,后面再也无法改变.所以,由于有这个限制,静态数组不适用于那些不

  • Java动态数组Arraylist存放自定义数据类型方式

    目录 Java动态数组Arraylist存放自定义数据类型 自定义一个动态数组ArrayList,加深对动态数组的理解 Java动态数组Arraylist存放自定义数据类型 class Point { int x; int y; public Point(int x,int y) { this.x=x; this.y=y; } } public class Test { public static void main(String[] args) { // TODO Auto-generated

  • JavaScript中的索引数组、关联数组和静态数组、动态数组讲解

    数组分类: 1.从数组的下标分为索引数组.关联数组 复制代码 代码如下: /* 索引数组,即通常情况下所说的数组 */ var ary1 = [1,3,5,8]; //按索引去取数组元素,从0开始(当然某些语言实现从1开始) //索引实际上就是序数,一个整型数字 alert(ary1[0]); alert(ary1[1]); alert(ary1[2]); alert(ary1[3]);   /* 关联数组,指以非序数类型为下标来存取的数组  python中称为字典 */ var ary2 =

  • Java JDK动态代理(AOP)的实现原理与使用详析

    本文主要给大家介绍了关于Java JDK动态代理(AOP)实现原理与使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式UML图: 简单结构示意图: 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别.通过代理类这中间一层,能有效控制对委托类对

随机推荐