Java-数组

4. 数组

image

【定义】

数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式这些数据进行统一管理。

【相关概念】

  • 数组名
  • 下标(或索引,角标)
  • 元素(数组里具体存的数据)
  • 数组的长度

【数组的分类】

  • 按维度分:一维数组,二维数组....
  • 按数组元素的类型分:基本数据类型元素的数组,引用数据类型元素的数组

【特点】

  1. 数组本身是引用数据类型而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。

  2. 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。

  3. 数组的长度一旦确认,就不能修改。

【一维数组的使用】

1. 一维数组的声明和初始化

	int [] num;//声明
	
	num = new int[]{100, 1001, 1333} //初始化

两种初始化方法:

静态初始化:数组的初始化和数组元素的赋值操作同时进行

int[] num = new int[]{1,2,3}

动态初始化:数组的初始化和数组元素的赋值分开进行

int[] num = new int[5];

错误写法:

int num = new int[2];
//正确写法:int[] num = new int[2];

int num[10];
//正确写法:int i[] = new int[10];

2. 如何调用数组的指定位置的元素

通过角标的方式调用(数组的角标从0开始,到数组的长度减1结束)

3. 如何获取数组的长度

借助数组属性:length

num.length

4. 如何遍历数组

1.使用length属性的循环

for(int i = 0;i<num.length;i++){}

2.增强for循环:

for(数据类型 变量:数组(集合)){
输出(变量);
}

for(int s : num){}

5. 数组元素的默认初始化值

(1)byte short int long :0

(2)float double :0.0

(3)char:空格

(4)boolean:false

(5)引用类型变量:null

6. 数组的内存解析

内存的简化结构:

image

image

【多维数组的使用】

1. 二维数组的声明和初始化

int[][] arr1 = new int[][]{{1,2,3},{2,3},{4,4,5}}; //静态初始化

String[][] arr2 = new String[3][2]; //动态初始化,一个数组里面存放3个元素,里面存放的是另一个容量为2个元素的数组的首地址。

String[][] arr3 = new String[3][]; //动态初始化2,二维数组中有三个一维数组
后面如果要使用,要具体声明。比如:arr3[1] = new String[4];

String[][] arr3 = new String[][5]; //这是错误的情况

int[][] arr1 = new int[3][2]{{1,2,3},{2,3},{4,4,5}}; //这也是错误的写法

2. 类型推断

int[] arr4 = {1,2,3,4,5}; //正确的写法

int[][] arr1 ={{1,2,3},{2,3},{4,4,5}}; //正确的写法

int[] arr;
arr = {1,2,3,4}; //报错,错误的写法,因为分开写了,没办法类型推断

3. 如何调用数组的指定位置的元素

arr1[0][0]就是上面的1,以此类推,与一维数组的调用差不多

4. 数组的长度

int[][] arr1 ={{1,2,3},{2,3},{4,4,5}};
System.out.println(arr1.length); //3
System.out.println(arr1[1].length); //2

5. 遍历数组

使用两层循环,第一层是循环外层元素,第二层是内层元素,需要用到数组的length属性

6. 数组元素的默认初始值

规定:二维数组分为外层数组的元素,内层数组的元素

int[] arr = new int[4][3];
外层元素:arr[0],arr[1]等
内层元素:arr[0][0],arr[1][2]等

针对初始化方式一:比如int[][] arr =new int[4][3];
外层元素的初始化值为:地址值
内层元素的初始化值为:与一维数组初始化情况相同

针对初始化方式二:比如int[][] arr =new int[4][];
外层元素的初始化值为:null
内层元素的初始化值为:不能调用,否则报错。


例子:

int[][] arr1 = new int[4][3];//int基本数据类型
System.out.println(arr1[1]); //地址值
System.out.println(arr1[1][1]);//0

float[][] arr2 = new int[4][2]; //float基本数据类型
System.out.println(arr2[1]); //地址值
System.out.println(arr2[1][1]);//0.0

String[][] arr3 = new String[4][3]; //引用类型默认值null
System.out.println(arr3[1]); //地址值
System.out.println(arr3[1][1]);//null

float[][] arr2 = new int[4][]; //float基本数据类型
System.out.println(arr2[1]); //null

7. 数组的内存解析

image

【练习】

image
image


image
这里x是一维数组,y是二维数组
f)赋值的时候会先检查两边类型是否一致,然后再考虑地址的赋值

image

//杨辉三角:
public class YangHuiTriangle {
public static void main(String[] args) {
	int length = 10;  //设置一个变量控制杨辉三角的行数
	int[][] yanghui = new int[length][];  //动态声明一个二维数组
	for(int i=0;i<length;i++) {  //外层循环控制行
		yanghui[i] = new int[i+1];  //控制每一行的同时先为每一行声明一个相应长度的一维数组
		for(int j=0;j<=i;j++) { //内层循环控制列
			if(j==0||j==i) { //提示2
				yanghui[i][j] = 1;				
			}
			else yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];	//提示3
			System.out.print(yanghui[i][j] + "\t");//每个数字用制表符分开一点距离
		}	
		System.out.println();	//每一行结束后换行	
	}
}

}

//拓展题:
public class TuoZhan {
public static void main(String[] args) {
	int[] arr = new int[6];			
    out:for(int i=0;i<arr.length;i++) {  //外层循环使用label
		int value = (int)(Math.random()*30)+1; //使用Math类,这个随机数是[0,1)
		for(int j=0;j<i;j++) { //内存循环,作用是每次给数组元素赋值时,检查其前面的元素是否会与该随机数重复
			if(arr[j]==value) {
				System.out.println("重复的值:"+ value); 
				i--;  //先i--,再使用continue结束本次外层循环
				continue out;
			}
		}
		arr[i] = value;  //完成检查并赋值
		System.out.println(arr[i]);  //顺便输出
	}
}

}

输出情况:
image

【数组中涉及的常见算法】

  1. 数组元素的赋值(杨辉三角,回形数等)

  2. 求数值型数组元素中元素的最大值,最小值、平均数、总和等

  3. 数组的复制、反转、查找(线性查找、二分法查找)

  4. 数组元素的排序算法

【数组的复制】

错误的做法:

int[] arr1,arr2;

arr1 = new int[]{1,2,3,4};

arr2 = arr1; //这里的arr2并不是一个新的数组对象,它这里的赋值只是使得arr2的地址值也指向arr1这个数组

正确做法:创建新的数组对象,并且遍历数组arr1,把对应下标的元素值赋值过去。

【Arrays工具类的使用】

操作数组的工具类,里面定义了很多操作数组的方法。

image

【数组使用中的常见异常】

  1. 数组角标越界的异常:ArrayIndexOutOfBoundsException

  2. 空指针异常:NullPointerException

posted @ 2021-08-09 16:16  Wiiiimp  阅读(35)  评论(0)    收藏  举报