Java-数组
4. 数组

【定义】
数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式这些数据进行统一管理。
【相关概念】
- 数组名
- 下标(或索引,角标)
- 元素(数组里具体存的数据)
- 数组的长度
【数组的分类】
- 按维度分:一维数组,二维数组....
- 按数组元素的类型分:基本数据类型元素的数组,引用数据类型元素的数组
【特点】
-
数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
-
创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
-
数组的长度一旦确认,就不能修改。
【一维数组的使用】
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. 数组的内存解析
内存的简化结构:


【多维数组的使用】
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]()
这里x是一维数组,y是二维数组
f)赋值的时候会先检查两边类型是否一致,然后再考虑地址的赋值

//杨辉三角:
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]); //顺便输出
}
}
}
输出情况:

【数组中涉及的常见算法】
-
数组元素的赋值(杨辉三角,回形数等)
-
求数值型数组元素中元素的最大值,最小值、平均数、总和等
-
数组的复制、反转、查找(线性查找、二分法查找)
-
数组元素的排序算法
【数组的复制】
错误的做法:
int[] arr1,arr2;
arr1 = new int[]{1,2,3,4};
arr2 = arr1; //这里的arr2并不是一个新的数组对象,它这里的赋值只是使得arr2的地址值也指向arr1这个数组
正确做法:创建新的数组对象,并且遍历数组arr1,把对应下标的元素值赋值过去。
【Arrays工具类的使用】
操作数组的工具类,里面定义了很多操作数组的方法。

【数组使用中的常见异常】
-
数组角标越界的异常:ArrayIndexOutOfBoundsException
-
空指针异常:NullPointerException


浙公网安备 33010602011771号