【java学习笔记】6.数组

在一些实际场景中组织数据时,会将大量的数据放在一起进行处理。数组就是为了满足这一要求而设置的数据结构。

1.一维数组

教室里,座位都是按照行和列进行排列的。
数组是常用的数据结构,是一种复合数据类型。是有序数据的集合。
数据中每个元素的数据类型必须相同,可以用一个统一的数组名和下标唯一的标识数组中的元素

1.数组的概念

数组的元素既可以是基本数据类型,也可以是复合数据类型。(复合数据类型:数组、类或接口)。数组的元素也可以是数组,这就出现了二维数组。
基本数据类型是通过值操作的,数组是通过引用操作的。
基本数据类型:只改变整数的值,不改变在内存中对应的地址。
数组变量:只是给出一个在内存中存放数据的地址。对数组的操作是通过引用地址实现的。

2.一维数组的声明

1.定义形式

数据类型[] 数组名;

数据类型 数组名[];
  1. 分配空间
数据类型 数组名 = {值1,值2,...,值n}
数组名 = new 数据类型[数组长度
数组名 = new 数据类型[数据长度]

java中,数组编号是从0开始的

3.一维数组的使用

数组元素是通过数组名和下标来访问的

数组名[下标]

数组的下标是从0开始递增,直到长度-1时结束
数组下标超过长度,出现ArrayIndexOutOfBoundsException错误

  1. 首先声明一个double类型的数组,然后为数组元素赋值,最后将数组元素全部输出。
package capther6;
public class oneDimArrayApp {
	public static void main(String[] args) {
		double[] arrayex = new double[10];
		arrayex[0] = 45.76;
		for(int i = 1;i<10;i++) {
			arrayex[i] = arrayex[i-1] +2;
		}
		for(int i =0;i<arrayex.length;i++) {
				System.out.println("arrayex["+i+"]="+arrayex[i]);
			}
	}
}

在这里插入图片描述

4.一维数组的空间模型

我们可以想象在一栋大楼里面的每一个住户的房子都是一个数组,如果麦当劳公司的快递员想要送快递到某一家,则需要根据门牌号,如3栋3门301送到这家。这里的门牌号就是住户(数组)的地址。
声明一个数组只是得到一个存放数组地址的变量,对于数组的操作是通过地址引用来实现的。

int arrayex[]

得到 数组的地址空间模型
在这里插入图片描述

arrayex = new int[5];

将数组初始化为长度为5的整形数组
在这里插入图片描述

  1. 两个数组指向同一个引用地址,如果改变其中一个数组元素的值,则另一个数组元素的值也会发生变化。
package capther6;

public class TwoArrayModify {
	public static void main(String[] args) {
		int[] arraymarks2;
		int[] arraymarks1 = {281,282,283,284,285};
		int mark1 = 198;
		int mark2;
		arraymarks2 = arraymarks1;
		mark2 = mark1;
		System.out.println("修改前的数据为");
		System.out.println("mark1 = "+mark1 +"  mark2 = "+mark2);
		for(int i = 0;i<arraymarks1.length;i++) {
		System.out.println("marks1["+i+"]="+arraymarks1[i]+";"+"marks2["+i+"]="+arraymarks2[i]);
		}
		mark2 = 200;
		arraymarks2[3] = 297;
		System.out.println("修改后的数据为");
		System.out.println("mark1 = "+mark1 +"  mark2 = "+mark2);
		for(int i = 0;i<arraymarks1.length;i++) {			System.out.println("marks1["+i+"]="+arraymarks1[i]+";"+"marks2["+i+"]="+arraymarks2[i]);
		}		
	}	
}

在这里插入图片描述

5.基本数据类型数据

byte、short、int、long、char、Boolean、short、float、double等类型的数组都是基本 数据类型数组。这些数组中各个元素存放的是元素的值,元素的改变是相应的值在改变。

1.整形数组中元素首位倒置

package capther6;
public class IntBasicArrayReverse {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {178,243,376,559,589,593};
		System.out.println("数组元素倒置前");
		System.out.print("{"+array[0]);
		for(int i =1;i<array.length;i++) {
			System.out.print(","+array[i]);
		}
		System.out.println("}");
		for(int i =0;i<array.length/2+1;i++) {
			array[i] = array[i] + array[array.length-1-i];
			array[array.length-1-i] = array[i]-array[array.length-1-i];
			array[i] = array[i] - array[array.length-1-i];
		}
		System.out.println("数组元素倒置后");
		System.out.print("{"+array[0]);
		for(int i =1;i<array.length;i++) {
			System.out.print(","+array[i]);
		}
		System.out.println("}");
	}
}

在这里插入图片描述

6.对象数组

对象数组是指数组元素是类的对象,对象数组元素中存放的是对象的地址。如果两个元素引用了一个相同的地址,把么其中一个元素的改变会引起另一个元素的改变

package capther6;
public class ObjectArray {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StringBuffer[] obarray = new StringBuffer[2];
		obarray[0] = new StringBuffer("Chinese");
		obarray[1] = new StringBuffer("Japanese");
		System.out.println("原始字符串:");
		System.out.println("obarray[0]="+obarray[0] + "   obarray[1]"+obarray[1]);
		StringBuffer temp;
		temp = obarray[0];
		obarray[0] = obarray[1];
		obarray[1] = temp;
		System.out.println("改变后的字符串:");
		System.out.println("obarray[0]="+obarray[0] + "   obarray[1]"+obarray[1]);			
	}
}

在这里插入图片描述

7.数组参数

java中允许使用数组元素和整个数组作为方法的参数。
Java中可以定义方法,它用整个数组作为方法的形参(形式参数),当方法被调用时,传递给这个形参的变量就是整个数组
数组的类型决定了传递给数组参数的自变量的数据类型。但是没有显示的给出数组的长苏。因此,同样的数组参数可以被不同长度的数组自变量取代。

2.二维数组

对于一维数组,如果数组的元素也是数组。那么每个数组的一个元素都是由一个一维数组构成的,这样一维数组就变成了二维数组。多维数组同样也是数组的数组。即N维数组的每一个元素都是一个N-1维数组。

1.二维数组的声明

1.定义形式

数据类型[][] 数组名;

数据类型 数组名[][];

2.初始化

数组变量名 = new 数据类型[二维长度][一维长度]

2.二维数组的空间模型

在多维数组的高维元素中,每一个元素保存的是一个低维数组的地址

二维数组array[3][5]模型二维数组array[3]
##3.二维数组应用

  1. 二维数组转置例子
package capther6;
public class MatrixInvert {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		    int matrice1[][]={{1,4,6,10},{3,5,8,14},{6,7,9,21}};
		    int matrice2[][]=new int[matrice1[0].length][matrice1.length];
		    System.out.println("矩阵转置前为 ");
		    for(int i=0;i<matrice1.length;i++)
		    {
		       for(int j=0;j<matrice1[0].length;j++)
		       {
		         System.out.print(matrice1[i][j]+" ");
		       }
		       System.out.println();
		    }
		    
		    for(int i=0;i<matrice1.length;i++)
		    {
		       for(int j=0;j<matrice1[i].length;j++)
		       {
		   
		    	   matrice2[j][i] =matrice1[i][j];
		       }
		   }	    
		    System.out.println("矩阵转置后为 ");
		    for(int i=0;i<matrice2.length;i++)
		    {
		       for(int j=0;j<matrice2[i].length;j++)
		       {
		         System.out.print(matrice2[i][j]+" ");
		       }
		       System.out.println();
		    }
		   }
	}

在这里插入图片描述

3.数组操作

图书馆里的图书放置,是按照行和 列放置的。我们可以将图书的位置称作为二维数组。在偌大的图书馆里想要扎到需要的书,则需要根据索引找到图书所在的某行某列的书架,图书馆就是一个存储图书的数组。查找图书,给图书排序,都是在执行数组的操作。

Java的工具类:Arrays

Array是java.util里的一个数组工具类,有很多可供数组使用的方法。包括排序、查找、复制、填充数据、比较等

1.排序

package capther6;
import java.util.Arrays;
public class ArraySortMethod {

	public static void main(String[] args) {
		int[] array = {83,43,24,-13,13,28,2,98};
		System.out.println("排序前的数组顺序为");
		System.out.print("{"+array[0]);
		for(int i =1;i<array.length;i++) {
			System.out.print(","+array[i]);
		}
		System.out.println("}");
		
		Arrays.sort(array);
		
		System.out.println("排序后的数组顺序为");
		System.out.print("{"+array[0]);
		for(int i =1;i<array.length;i++) {
			System.out.print(","+array[i]);
		}
		System.out.println("}");
	}
}

在这里插入图片描述

2.查找
我们去剧场看电影或者在很大的图书管理找到一本书,这些都是查找的例子。我们可以通过行和列来找到对应位置的座位或图书,但是对于一个容量很大的数组来说,这样的效率非常到底。可以使用Arrays里提供的二分搜索法查找

package capther6;
import java.util.Arrays;
public class binarySearch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {83,43,24,-13,13,28,2,98};
		System.out.println("排序前的数组顺序为");
		System.out.print("{"+array[0]);
		for(int i =1;i<array.length;i++) {
			System.out.print(","+array[i]);
		}
		System.out.println("}");
		System.out.println("未排序查找数组中13的位置为:"+Arrays.binarySearch(array, 13));
		Arrays.sort(array);
		System.out.println("排序后的数组顺序为");
		System.out.print("{"+array[0]);
		for(int i =1;i<array.length;i++) {
			System.out.print(","+array[i]);
		}
		System.out.println("}");
		System.out.println("排序后查找数组中13的位置为:"+Arrays.binarySearch(array, 13))
	}
}

在这里插入图片描述
3.复制
在使用Word编写文档的时候,为了节约时间,减少不必要的操作,会使用复制操作。使用数组也一样。如果希望建立一个数组和已有数组拥有同样的数据,可以使用复制数组的功能。
CopyOf()方法复制数指定范围内的元素,并且返回新的数组
copyOfRange()方法将数组中指定范围的元素复制到一个新的数组

package capther6;
import java.util.Arrays;
public class ArrayCopyExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arrayA = {83,43,24,-13,13,28,2,98};
		System.out.print("arrayA = ");
		System.out.print("{"+arrayA[0]);
		for(int i =1;i<arrayA.length;i++) {
			System.out.print(","+arrayA[i]);
		}
		System.out.println("}");
		
		int arrayB[] = new int[arrayA.length];
		arrayB = Arrays.copyOf(arrayA, 3);
		System.out.print("arrayB = ");
		System.out.print("{"+arrayB[0]);
		for(int i =1;i<arrayB.length;i++) {
			System.out.print(","+arrayB[i]);
		}
		System.out.println("}");
		
		int arrayC[] = new int[10];
		arrayC = Arrays.copyOfRange(arrayA, 5, 9);
		System.out.print("arrayC = ");
		System.out.print("{"+arrayC[0]);
		for(int i =1;i<arrayC.length;i++) {
			System.out.print(","+arrayC[i]);
		}
		System.out.println("}");
		
		int arrayD[] = new int[5];
		arrayD = Arrays.copyOf(arrayA, 15);
		System.out.print("arrayD = ");
		System.out.print("{"+arrayB[0]);
		for(int i =1;i<arrayD.length;i++) {
			System.out.print(","+arrayD[i]);
		}
		System.out.println("}");
		
		int arrayE[] = new int[5];
		arrayE = Arrays.copyOfRange(arrayA, 5,15);
		System.out.print("arrayE = ");
		System.out.print("{"+arrayE[0]);
		for(int i =1;i<arrayE.length;i++) {
			System.out.print(","+arrayE[i]);
		}
		System.out.println("}");	
	}
}

在这里插入图片描述

4.填充数据
填充数据,就是给数据赋值。比如在教室里摆好了桌椅,这个数组就定义好了,但是由于教室里没有学生,所以数组!就是空的。当学生在教室里坐好准备上课了,这样数组就被赋值了

package capther6;

import java.util.Arrays;

public class ArrayFillExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arrayex1 = new int[10];
		int[] arrayex2 = new int[10];
		
		Arrays.fill(arrayex1, 15);//填充所有的值为15
		Arrays.fill(arrayex2, 2,6,50);//填充2-6所有的值为50.其余的值为0
		System.out.print("arrayex1[] = ");
		System.out.print("{"+arrayex1[0]);
		for(int i =1;i<arrayex1.length;i++) {
			System.out.print(","+arrayex1[i]);
		}
		System.out.println("}");
			
		System.out.print("arrayex2[] = ");
		System.out.print("{"+arrayex2[0]);
		for(int i =1;i<arrayex2.length;i++) {
			System.out.print(","+arrayex2[i]);
		}
		System.out.println("}");
	}
	}

在这里插入图片描述
5 比较
比较就是判断两个数组中的元素是否相等。如果两个数组中所有对应元素都相等,并且两个数组包含相同数量的元素,则认为这两个数组是相等的

package capther6;
import java.util.Arrays;
public class ArrayEqualExample {

	public static void main(String[] args) {
		int[] arrayA = new int[10];
		int[] arrayB = new int[10];
		int[] arrayC = new int[10];
		Arrays.fill(arrayA, 35);
		Arrays.fill(arrayB, 0,10,35);
		Arrays.fill(arrayC, 5,10,35);
		
		System.out.print("arrayA[] = ");
		System.out.print("{"+arrayA[0]);
		for(int i =1;i<arrayA.length;i++) {
			System.out.print(","+arrayA[i]);
		}
		System.out.println("}");
		
		System.out.print("arrayB[] = ");
		System.out.print("{"+arrayB[0]);
		for(int i =1;i<arrayA.length;i++) {
			System.out.print(","+arrayB[i]);
		}
		System.out.println("}");

		System.out.print("arrayC[] = ");
		System.out.print("{"+arrayC[0]);
		for(int i =1;i<arrayC.length;i++) {
			System.out.print(","+arrayC[i]);
		}
		System.out.println("}");
		System.out.println("arrayA==arrayB?"+Arrays.equals(arrayA, arrayB));
		System.out.println("arrayA==arrayC?"+Arrays.equals(arrayA, arrayC));
	}

}

在这里插入图片描述

4.拓展训练

1.获取一维数组中的最大最小值

package capther6;
public class ArrayMinMax {

	public static void main(String[] args) {
		int A[] = {27,86,132,22,34,12};
		int minvalue = A[0];
		int maxvalue = A[0];
		System.out.print("数组A的元素包括");
		for(int i = 0;i<A.length;i++) {
			System.out.print(A[i]+" ");
			if(A[i]<minvalue) {
				minvalue = A[i];
			}
			if(A[i]>maxvalue) {
				maxvalue = A[i];
			}
		}
		System.out.println("\n数组的最大值为"+maxvalue);
		System.out.println("数组的最小值为"+minvalue);	
	}
}

在这里插入图片描述

2.杨辉三角

最本质的特征是:两条斜边都是由数字1组成的,而其他数字等于它两个肩上的数字之和

package capther6;


public class YanghuiClass { 

	//编写一个main方法
	public static void main(String[] args) {

		int[][] yangHui = new int[12][];
		for(int i = 0; i < yangHui.length; i++) {//遍历yangHui的每个元素

			//给每个一维数组(行) 开空间
			yangHui[i] = new int[i+1];
			//给每个一维数组(行) 赋值
			for(int j = 0; j < yangHui[i].length; j++){
				//每一行的第一个元素和最后一个元素都是1
				if(j == 0 || j == yangHui[i].length - 1) {
					yangHui[i][j] = 1;
				} else {//中间的元素
					yangHui[i][j]  =  yangHui[i-1][j] + yangHui[i-1][j-1];
				}
			}
		}
		//输出杨辉三角
		for(int i = 0; i < yangHui.length; i++) {
			for(int j = 0; j < yangHui[i].length; j++) {//遍历输出该行
				System.out.print(yangHui[i][j] + "\t");
			}
			System.out.println();//换行.
		}
		
	}
}

在这里插入图片描述

5 技术解惑

1.Array和Arrays的区别是什么
Arrays是工具类,提供常用的静态方法,而Array是数组。举个例子,Array就好比种植出来的水果,而Arrays是对水果进行包装处理。可以制作成水果干,也可以制作成水果罐头。
2. for 和foreach的区别
这俩都是java中常用的遍历方法。
在固定长度或者不需要计算的时候for循环效率高于foreach,在不确定长度或计算长度有损耗的时候使用foreach比较方便。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值