Java自定义长度可变数组的操作

我们都知道数组是线性的、类型固定、内存地址连续、定长的,主要是数组一旦被定义,那么它的长度也就定下来了,只能添加有限的数据。而长度可变的数组是要将这个长度打破,实现数组数据无限增加

那么定义长度可变的数组就可以用两个数组来实现数组长度的变化。为了避免每次增加数据或删除数据时都要重新开辟空间,我先设定原数组为固定长,在当数组放满时,一次增加一定的长度,这样 节省了开辟空间的时间

因为数组里的数据类型是不确定的,所以用泛型比较好

public class MyList<E> {
 private int rongliang;//容量
 private int zengliang;//增量
 private int num;//数量

 //定义一个原数组
 //Object类包含所有的类型,所以定义数组是用Object类
 private Object[] src;

 //三个不同的构造方法
 public MyList(){
 this(10,10);
 }

 public MyList(int rongliang){
 this(rongliang,10);
 }

 public MyList(int rongliang,int zengliang){
 this.rongliang = rongliang;
 this.zengliang = zengliang;
 src = new Object[rongliang];
 }
}

在MyList中实现在数组中添加数据,要考虑到数组中的数据数量小于数组长度时,可以直接在数组为null处添加数据,但当数组的数量大于等于数组长度时,要先重新定义一个数组,长度是原数组加增量,然后再添加数据

public void add(E s){
 //判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容
 if(num>=src.length){
 //定义一个新的数组,长度是原有的长度加增量
 Object arr[] = new Object[src.length+zengliang];
 //拷贝数组数据
 System.arraycopy(arr, 0, arr, 0, src.length);
 src = arr;
 }
 //如果num不大于数组的长度,则不需扩容,直接加入
 //如果num大于等于数组长度,则需执行上面的if语句扩容,再加入数据
 //最后num++
 src[num++] = s;
 }

取出指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常

public E get(int index){
 //抛出异常
 if(index<0 || index>=num){
 throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
 }
 //强制转换成E类型
 return (E)src[index];
 }

修改指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常

public void modify(int index,E s){
 //抛出异常
 if(index<0 || index>=num){
 throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
 }
 src[index] = s;
 }

删除指定下标的数据,当数组中null值的长度大于等于增量时,要将数组的容量减小,防止浪费

public void delete(int index){
 //抛出异常
 if(index<0 || index>=num){
 throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
 }
 //将>index的数据依次向前移动一位
 System.arraycopy(src, index+1, src, index, num-index-1);
 num--;
 //减少容量的方法
 if(src.length-num>=zengliang){
   //定义一个新的数组,长度是原先数组的长度减去增量
     Object arr[] = new Object[src.length-zengliang];
   //拷贝数组
     System.arraycopy(src, 0, arr, 0, num);
   src = arr;
 }
 }

将指定下标处的数据改为指定的数据

public void insert(int index,E s){
 //抛出异常
 if(index<0 || index>=num){
 throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
 }
 //判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容
 if(num>=src.length){
   //定义一个新的数组,长度是原有的长度加增量
   Object arr[] = new Object[src.length+zengliang];
   //拷贝数组数据
   System.arraycopy(src, 0, arr, 0, src.length);
   src = arr;
 }
 //将>index的数据依次向后移动一个位置
 //arraycopy()是可以将数据自己拷贝给自己
 System.arraycopy(src, index, src, index+1, num-index);
 //插入数据
 src[index] = s;
 num++;
 }

最后在写个获取数组中数据的个数,而不是数组的长度

public int size(){
   return num;
 }

写个测试类,来测试这个长度可变的数组是否可行

public class test {

 public static void main(String[] args) {
 //创建一个MyList对象
 // 在创建对象时明确类型
 MyList<String> list = new MyList<String>();

 //添加数据
 list.add("a");
 list.add("b");
 list.add("c");
 list.add("d");
 list.add("e");
 list.add("f");
 list.add("g");
 list.add("h");
 list.add("i");
 list.add("j"); 

 //遍历数组
 for(int i=0;i<list.size();i++){
 String s = list.get(i);
 System.out.print(s+" ");
 }

 System.out.println("");
 int n = list.size();
   System.out.println("数据个数为:"+n);
 System.out.println("**********************************************");

 //修改指定位置的数据
 list.modify(1, "QQ");

 //遍历数组
 for(int i=0;i<list.size();i++){
 String s = list.get(i);
 System.out.print(s+" ");
 }

 System.out.println("");
 int m = list.size();
 System.out.println("数据个数为:"+m);
 System.out.println("**********************************************");

 //删除指定位置的数据
 list.delete(2);

 //遍历数组
 for(int i=0;i<list.size();i++){
 String s = list.get(i);
 System.out.print(s+" ");
 }

 System.out.println("");
   int k = list.size();
   System.out.println("数据个数为:"+k);
 System.out.println("**********************************************");

 //在指定位置插入指定的数据
 list.insert(3, "zr");
 list.insert(3, "qi");

 //遍历数组
 for(int i=0;i<list.size();i++){
 String s = list.get(i);
 System.out.print(s+" ");
 }

 System.out.println("");
 int h = list.size();
   System.out.println("数据个数为:"+h);
 System.out.println("**********************************************");
 }

}

最终数组的结果为:

a b c d e f g h i j
数据个数为:10
**********************************************
a QQ c d e f g h i j
数据个数为:10
**********************************************
a QQ d e f g h i j
数据个数为:9
**********************************************
a QQ d qi zr e f g h i j
数据个数为:11
**********************************************

补充:在Java中创建一个自定义长度的数组并输入每个元素

用到知识点:数组、方法、Scanner、for循环。

作业:

package Array;
import java.util.Scanner;
public class InputArray {
public static void main(String[] args) {
shuzu();//方法调用
 }
 //方法定义
 public static void shuzu() {

 //将输入的数字作为数组的长度
 Scanner sz = new Scanner(System.in);
 System.out.println("请输入数组长度:");//提示可以操作
 int[] cd = new int[sz.nextInt()];//数组初始化完成
 System.out.println("当前数组长度定义为:"+cd.length);//再提示一下结果

 //用for循环为每一个元素赋值
 for (int i = 0; i < cd.length; i++) {
  int q = i+1;//这里q用作提示,避免提示出第0个元素。
  System.out.println("请输入第"+q+"个元素的值:");
  cd [i] = sz.nextInt();
  System.out.println("第"+q+"个元素定义为"+cd[i]+"。");
  }
  sz.close();

  //数组内各元素已经完成赋值,但是再用for循环遍历一次
 System.out.print("数组内元素全部完成赋值:");//继续提示一下
 for (int i2 = 0; i2 < cd.length; i2++) {
  if(i2 == cd.length-1) {
  System.out.print(cd[i2]+"。");
  }else {
  System.out.print(cd[i2]+"、");
  }
 }
 return;//方法结束,rentun;
 }

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Java如何获取数组和字符串的长度(length还是length())

    限时 1 秒钟给出答案,来来来,听我口令:"Java 如何获取数组和字符串的长度?length 还是 length()?" 在逛 programcreek 的时候,我发现了上面这个主题.说实话,我当时脑海中浮现出了这样一副惊心动魄的画面: 面试官老马坐在我的对面,地中海式的发型令我敬佩有加.尽管略显疲惫,但他仍然自信地向我抛出了上面这个问题.稍稍迟疑了一下,我回答说:"数组用 length,字符串用 length 跟上小括号".老马不愧是面试中的高手,一瞬间就从我的

  • java二维数组指定不同长度实例方法

    我们知道二维数组,是在一维数组的基础上进行了维度的增加.那么在实际使用的过程中,有时候我们所需要的二维数组,它们其中的维度是不同的,这就需要我们手动的进行设置.下面我们就来一起探究,二维数组在改变维度长度大小的方法,并辅以实例进行代码展示. 1.二维数组的每个元素都是一个一维数组,这些数组不一定都是等长的.声明二维数组的时候可以只指定第一维大小,空缺出第二维大小,之后再指定不同长度的数组.但是注意,第一维大小不能空缺(不能只指定列数不指定行数). public class ArrayTest4

  • Java任意长度byte数组转换为int数组的方法

    前言 嗯.最近工程上遇到一个byte数组转换为int的问题,解决过程中遇到了几个坑,经过各种查资料终于还是解决了.撒花. Java的位运算以及byte数组与其他类型数据的转换比c/c++感觉麻烦一些.这里简单说明一下byte数组和int的转换吧. 总所周知,int类型数据在Java中占据32 bit,byte占据8 bit,这样的话,正常情况下4个byte可以转换成一个int类型数据. 当然,不正常情况下,3个byte或者2个byte甚至1个byte都可以转换为int数据,只需要高位补上就行.

  • Java不指定长度的二维数组实例

    编程中经常用到这样一种特殊的二维数组,它的行数确定,但是每行的列数不确定.这样的的数组实现方法:先创建制定行数,列数缺省的二维数组,然后对数组的每一行重新初始化. 举个例子就很好理解了. import java.util.*; public class Tek { public static void main(String[] args) { int[][] a=new int[3][]; a[0]=new int[3];//相当于int[] a=new int[3] for(int i=0;

  • java 定义长度为0的数组/空数组案例

    如下: int[] array = new int[0]; // 定义一个长度为 0 的数组 / 空数组 Sring[] arr = new String[0]; // 定义一个长度为 0 的数组 / 空数组 长度为 0 的数组 / 空数组 并不是 null 有时数组里可能只有一个空字符串 "",这时数组长度是 1.这种情况也要注意判断. if ( arr.length == 1 && arr[ 0 ].equals( "" ) ) { System

  • Java获得一个数组的指定长度排列组合算法示例

    本文实例讲述了Java获得一个数组的指定长度排列组合算法.分享给大家供大家参考,具体如下: package demo; import java.util.Stack; /** * JAVA获得一个数组的指定长度的排列组合.<br> * * @author JAVA世纪网(java2000.net, laozizhu.com) */ public class TestSequenceAll { public static void main(String[] args) { TestSequen

  • Java自定义长度可变数组的操作

    我们都知道数组是线性的.类型固定.内存地址连续.定长的,主要是数组一旦被定义,那么它的长度也就定下来了,只能添加有限的数据.而长度可变的数组是要将这个长度打破,实现数组数据无限增加 那么定义长度可变的数组就可以用两个数组来实现数组长度的变化.为了避免每次增加数据或删除数据时都要重新开辟空间,我先设定原数组为固定长,在当数组放满时,一次增加一定的长度,这样 节省了开辟空间的时间 因为数组里的数据类型是不确定的,所以用泛型比较好 public class MyList<E> { private i

  • JAVA复制数组和重置数组大小操作

    翻看印象笔记发现自己整理过arraycopy()这样一个方法,码字放到这里: System.arraycopy()是一个静态方法,用来实现重置数组操作 数组复制方法调用和参数列表: System.arraycopy(src, srcPos, dest, destPos, length); src:原数组 srcPos:原数组的开始位置 dest:目标数组 destPos:目的数组的开始位置 length:复制长度 数组复制代码示例: //originalArray 数组全部复制到targetAr

  • Java由浅入深细数数组的操作

    目录 1.JVM的内存分布 2.引用类型变量的特点 3.一维数组的使用 3.1定义和初始化 3.2数组的访问 3.3打印数组所有的元素 3.4数组的拷贝 3.5作为参数和返回值 本篇介绍一维数组以及相关操作,二维数组放在下一篇 1.JVM的内存分布 Java的代码是运行在JVM上的,为了方便管理,对所使用的内存按照功能的不同进行了划分,这不是本篇重点,只做简单的介绍: Java虚拟栈:局部变量在这里开辟空间 Java本地方法栈:运行一些由C/C++编写的程序 堆:对象在这里存储,且开辟后的空间使

  • 数组实现Java 自定义Queue队列及应用操作

    数组实现Java 自定义Queue队列及应用 Java 自定义队列Queue: 队列的抽象数据类型就是一个容器,其中的对象排成一个序列,我们只能访问和取出排在最前端( Front)的对象,只能在队列的尾部( Rear)插入新对象. 正是按照这一规则,才能保证最先被插入的对象首先被删除( FIFO). java本身是有自带Queue类包,为了达到学习目的已经更好深入了解Queue队列,自己动手自建java Queue类是个很好的学习开始: 基于数组的实现 „ 顺序数组 借助一个定长数组 Q 来存放

  • Java由浅入深细数数组的操作下

    目录 1.二维数组的存储 2.二维数组的定义和初始化 3.打印二维数组 4.不规则二维数组 5.Arrays中常用的方法 上一篇介绍完一维数组后,我们来看二维数组 1.二维数组的存储 在C语言中我们说过:二维数组可以看成是特殊的一位数组,比如int arr[2][3],arr可以看成由两个元素组成,即arr[0]和arr[1],arr[0]和arr[1]各自又有三个元素,这句话在Java中同样适用,一维数组中arr存储的是一个地址,二维数组中则是多个地址,以上面的arr数组为例,其在JVM中的存

  • java旋转二维数组实例

    本文实例讲述了java旋转二维数组的操作,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package test; /*  *     1    2    3    4    5     *    16    17    18    19    6     *    15    24    25    20    7     *    14    23    22    21    8     *    13    12    11    10    9  *  *    写一

  • Java自定义数组列表的实现操作

    主要目的: 解决ArrayList 类不能改变大小的问题,主要实现数组列表动态调整大小. 1.数组类型如何选择?由于我们不清楚数组中具体存入什么类型的数据, 我们可以声明一个对象Object [ ] ,这样,数组列表就可以存储任何类型的数据了. 2.泛型<> :如果定义的一个类或接口有一个或多个类型变量,则可以使用泛型. ArrayList<String>本身就是泛型,各种类型的变量都可以组装成对应的List,而不必针对每个类型分别实现一个构建ArrayList的类. 泛型字母所代

  • java基础之数组常用操作总结(必看篇)

    常用的对数组进行的操作 1.求数组中最大值,最小值 思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max.最小值同样 public class TestArray{ public static void main(String[] args){ int[] arr={23,45,234,576,34,87,34,12,67}; int max=arr[0]; int min=arr[0]; for(int i=0;i<arr.leng

  • java数组及arrays类对数组的操作实例

    数组的初始化有两种方式 静态初始化: 初始化时由程序员显示置顶每个数组的初始值,由系统决定数组长度.如: int[] a1 = new int[] {1,2,3,4}; 动态初始化:初始化时由程序员只指定数组长度,由系统为数组元素分配初始值.如: int[] a = new int[5]; 写一个类测试一下 package chenlizhi; import java.util.Arrays; public class TestArrays { public static void main(S

随机推荐