Java基础语法——数组(用代码实现数组中元素的插入与删除)

Java一维数组和二维数组的定义与遍历,如何用代码实现一维数组的增加与删除

文章目录

  • 前言
  • 一、什么是数组?
  • 二、数组的定义
    • 1.动态初始化(指定长度)
    • 2.静态初始化(指定内容)
    • 3.二维数组
  • 三、数组的遍历
    • 1.for循环取值遍历输出
    • 2.for-each循环取值遍历输出
  • 四、数组的增加与删除
    • 1.数组元素的插入
    • 2.数组元素的删除
  • 总结


前言

本文我们将介绍数组的使用,我们在存储一个学生的成绩时常常使用double 变量名,但是这样每次只能存储一个数据,而现实情况中往往一个班级中有几十个学生,那么我们还要这样一个个声明变量吗,那未免有点太麻烦了,于是就有了我们接下来要讲的数组


一、什么是数组?

  数组就是用来存储多个数据类型一致顺序特定长度确定的变量的容器,比如说要存放一个班里所有学生的成绩,那么这就是一个专门存放学生成绩的容器,就不能用来存其他类型,所以数组中的数据类型都是相同的,而且一个班里的学生数量都是固定的,开学的时候来了多少个就是多少个,这体现了长度确定,每个学生按照来的顺序在学生名单上有相应的编号,通过编号就可以找到这名学生,体现了顺序特定

二、数组的定义

1.动态初始化(指定长度)

数组的数据类型 [] 数组名 = new 数组的数据类型[数组长度];
//等同于先声明再创建对象
数组的数据类型 [] 数组名;
数组名 = new 数组的数据类型[数组长度]

例:创建一个长度为30的double类型数组:

	double [] score = new score[30];
	//等同于
	double [] score;
	score = new double[10];

2.静态初始化(指定内容)

数组的数据类型 [] 数组名 = new 数组的数据类型[数组长度] {元素1,元素2,......};
//等同于
数组的数据类型 [] 数组名 = {元素1,元素2,......};

例:将一周的星期数保存到数组中:

	String [] week = new score[]{"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
	//等同于
	String [] week = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};

需要的注意问题
  1.指定数组的长度后,就算手动给数组赋值,数组根据数据类型的不同也会有默认值存在
    String默认值:null
    byte/short/int/long默认值:0
    float/double默认值:0.0
    boolean默认值:false
    char默认值:(空格)

3.二维数组

  二维数组就是来存一维数组的,如果把一维数组当做是存放相同数据类型的容器,那么二维数组就是存放一维数组的容器,并可以通过和一维数组相同的方式来访问一维数组及其内部的元素

动态初始化:数据类型 [][] 数据名 = new 数据类型 [m][n]
  m表示这个二维数组有多少个一维数组
  n表示每一个一维数组的元素个数
静态初始化:
    数据类型 [][] 数据名 = new 数据类型[][]{一维数组1,一维数组2,......}
	数据类型 [][] 数据名 = {{2,3},{1,1},{3,8}}

例:访问一维数组中的元素:

int [][] a = {{3,3},{1,4,6},{3,8}};
//表示下标为1的一维数组中的下标为2的元素
System.out.println(a[1][2])
//输出结果为6

三、数组的遍历

  数组的遍历有两种方法,其中涉及到数组的length方法是获取该数组的长度,比如说数组中的元素是{1,2,3,4,5},那么调用该方法后输出的长度即为5,但是由于数组下标是从0开始,所以最后一个数的下标为4

1.for循环取值遍历输出

  一维数组的遍历
  实现代码如下:

int [] a = {1,2,5,342,234,22,42,3};
for (int i = 0; i < a.length; i++) {
    System.out.println(a[i]);
}

  简单的解释下:数组下标从0开始,而我们需要用到的i变量即为数组中元素的下标,所以遍历数组的话i的初始值只能为0(这里要跟之前常写的求100以内的和相区分开),a.length为数组的长度,之前解释过,这里数组有8个元素所以输出为8,i<某一个数就是最多取到该数-1个数i>某一个数就是最多取到该数+1个数,由于下标最大为7,所以这里只能取到7,数组的取值直接用数组名[元素所在的下标数]即可
  二维数组的遍历:
  一个一维数组的遍历需要用到一层循环,那么多个一维数组的遍历就需要用到循环嵌套来解决,之前我们通过九九乘法表详细解释过如何来理解外部循环和内部循环(见Java基础语法——分支结构、循环结构和循环嵌套(打印九九乘法表精讲))这里的外部循环就是每一个一维数组,内部循环就是一维数组中的元素,当i = 0时首先将二维数组中的第一个一维数组拿出来,然后进入内部循环,内部循环从下标j = 0处开始遍历,一直到这个一维数组a[0](表示在二维数组中下标为0的一维数组)的最后一个元素。
  实现代码如下:

int [][] a = {{3,3},{1,4,6},{3,8}};
for (int i = 0; i < a.length; i++) {
    for(int j = 0; j < a[i].length; j++){
    	System.out.println(a[i][j] + ",");
    }
    //每输出一个一维数组就进行换行
    System.out.println();
}

2.for-each循环取值遍历输出

  Java还提供了一种方式可以直接取到从下标为0的元素开始,每一个元素的值,那就是for-each循环,如果使用IDEA作为编辑器的话,直接输入iter+回车即可快速写入代码,初学者最好是自己敲上两边熟悉以后再用
  一维数组的遍历

//i是一个工具人,i会从下标为0的元素开始,每一次循环都会把a数组中的元素的值赋给自身使用
int [] a = {1,2,5,342,234,22,42,3};
for (int i : a) {
    System.out.println(i);
}

  二维数组的遍历:
  外层循环的意思是从a这个二维数组中拿去一维数组ints,每一个ints代表着二维数组从0下标开始的各个元素,要注意此时的ints是一维数组,然后内部循环是从ints这个一维数组中拿具体的元素anInt并输出

int [][] a = {{3,3},{1,4,6},{3,8}};
for (int[] ints : a) {
	for (int anInt : ints) {
		System.out.print(anInt);
		System.out.print(",");
}

四、数组的增加与删除

  因为数组有定长的特性,一旦长度确认将无法改变,就像一杯2L的水杯,长度确认后只能装2L的水,多的将会溢出,少的就会空出来,这就导致了在数组中增加与删除数据比较麻烦,但我们也需要掌握如何利用代码实现数组中元素的增加与删除

1.数组元素的插入

  因为数组中的长度是固定的,那么我们在指定位置增加数据时,从该数据往后的元素都将被一一挤出,直到最后一个个元素被挤出容器,这里我们要明确三个点:一是数组中元素往后移动的过程实际上就是每个元素被前一个元素覆盖的过程,一直到最后一个元素被覆盖才结束,二是每个元素被覆盖前都需要把自身的数据交出去,三是只有最后一个元素数据是真正的丢失,其他元素的数据相当于交给了下一个元素,只有最后一个元素是被真正的覆盖掉。以上的三点明确以后,我们就知道程序开始的起点就是从最后一个元素被覆盖开始的
实现代码如下:

//在下标为3的位置添加一个元素666
int [] a = {1,2,5,342,234,22,42,3};
for (int i = a.length - 1; i > 3; i--) {
    a[i - 1] = a[i];
    //因为此时a[3]的元素已经赋给了a[4],所以可以直接给指定位置的元素赋值
    if(i == 4){
    	a[3] = 666;
    }
}

  同样的我们可以把该程序改写为一个方法:在指定下标处为一个整型数组插入指定的数据,该方法可以利用方法的重载传入其他类型的数组
实现代码如下:

//在数组的指定下标下添加指定元素
public static void addArray(int [] a, int index, int data){
	for (int i = a.length - 1; i > index; i--) {
		a[i] = a[i - 1];
		if(i == index + 1){
			a[index] = data;
		}
	}
}

2.数组元素的删除

  同样因为定长特性,我们删除指定下标的元素后,后面的元素将会填补删除的元素,最后一个元素将会空留出来有该数据类型的默认值填补,同样需要注意三点:一是数组中元素向前移动的过程,实际上就是每个元素被后一个元素覆盖的过程,一直到最后一个元素被空留出来才结束,二是每个元素被覆盖前都需要把自身的数据交出去,三是只有被删除的元素才是真正的丢失,其他元素的数据相当于交给了前一个元素。以上的三点明确以后,我们同样就知道程序开始的起点就是被删除的元素被其后一个元素覆盖开始的
实现代码如下:

//删除该数组下标为2的位置的元素
int [] a = {1,2,5,342,234,22,42,3};
for (int i = 2; i < a.length - 1; i--) {
    a[i] = a[i + 1];
    if(i == a.length - 2){
    	a[a.length - 1] = 0;
    }
}

  同样的我们可以把该程序改写为一个方法:删除指定下标处该数组的元素,该方法可以利用方法的重载传入其他类型的数组

//指定一个数组删除指定下标下的元素
public static void addArray(int [] a, int index){
	for (int i = index; i < a.length - 1; i--) {
		a[i] = a[i + 1];
		if(i == a.length - 2){
			a[a.length - 1] = 0;
		}
	}
}

需要的注意问题
  1.因为数组是把后一个元素赋给前一个元素,如果取i < a.length - 1的话,当i的值为数组的最后一个下标时,这个时候执行a[i] = a[i + 1];语句时,i + 1将会超出数组的最大下标,Java将会报数组越界异常,所以这个时候i只需要取到倒数第二个下标,就可以把最后一个元素的值赋给前一个元素
  2.当数组下标为倒数第二个元素的下标时,最后一个元素的值就已经交出去了,这个时候我们就可以根据该数组的数据类型,清空最后一个元素的值

总结

以上就是今天要讲的内容,本文介绍了一维数组和二维数组的定义与遍历,如何用代码实现一维数组的增加与删除

你可能感兴趣的:(JavaSE,java,开发语言)