Java数组
1、数组的概述
数组是相同类型数据的有序集合。
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
其中每一个数据称作一个数组元素,每个数组元素都可以通过一个下标来访问他们。
使用数组可以让我们的程序变的简单,避免定义多个重复的变量。
2、数组的声明创建
首先必须声明数组变量,才能在程序中使用该数组,下面是声明数组变量的语法:
Java语言使用new关键字来创建数组,语法如下:
dataType[] array = new dataType[size];
int[] nums = new int[10]; // 定义了一个长度为 10 的整型数组
// 给数组中的元素赋值
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
nums[4] = 5;
nums[5] = 6;
nums[6] = 7;
nums[7] = 8;
nums[8] = 9;
nums[9] = 10;
// 通过数组的下标来取值
System.out.println(nums[1]) // 输出:2
数组的元素是通过索引来访问的,数组索引是从0开始的。
获取数组的长度:array.length
数组动态初始化:
int data[] = new int[3]; /*开辟了一个长度为3的数组*/
data[0] = 10; // 第一个元素
data[1] = 20; // 第二个元素
data[2] = 30; // 第三个元素
for(int x = 0; x < data.length; x++) {
System.out.println(data[x]); //通过循环控制索引
}
我们上面定义的数组都有一个特点:先给数组开辟内存空间,然后再用索引进行数据的赋值,这种做法就叫做:动态初始化。
如果数组在定义的时候就可以同时出现设置的数据内容,那么就可以采用静态初始化来完成。
格式: 数据类型 数组名称 = new 数据类型[] {值, 值,…}
如:
public class ArrayDemo {
public static void main(String args[]) {
int data[] = {1, 3, 4, 55, 11, 32, 121, 33}; // 静态初始化int型数组
for(int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
}
}
一维数组的静态初始化
越界异常
3、数组的使用
数组属于引用数据类型,所以会发生引用传递。而引用传递的本质是:同一块堆内存空间可以被不同的栈内存所指向。
public class ArrayDemo02 {
public static void main(String args[]) {
int data[] = null;
data = new int[3]; //开辟一个长度为3的数组
int temp[] = null; //声明int型数组对象:temp
data[0] = 10;
data[1] = 20;
data[2] = 30;
temp = data; //int temp[] = data;
temp[0] = 99;
for(int i = 0; i < temp.length; i++) {
System.out.println(data[i]);
}
}
}
4、二维数组
输出
elements:1,2,3,4,5,6
hold:1,2,3,4,5,6,4,3,2,1
在之前所使用的数组发现只需要一个索引就可以进行访问,那么这样的数组实际上非常像一个数据行的概念 。
现在痛过一个索引就可以取得唯一的一个记录。所以这样的数组可以简单理解为一维数组,而二维数组本质上指的是行列集合,也如果要确定某一个数据需要行索引和列索引来进行定位 。
那么对二维数组的定义有两种声明形式:
数组的动态初始化:数据类型 对象数组[][] = new 数据类型 [行个数] [列个数];
数组的静态初始化:数据类型 对象数组[][] = new 数据类型 [行个数] [列个数]{{值, 值,…}, {值, 值,…},…};
int[][] arr2 = new int[][]{{10,20,30},{40,50,60},{70,80,90}};
二维数组
在之前的课程中,我们也提到数组中可以放置基本数据类型和引用数据类型,尤其是数组中也可以放置数组。
二维数组的声明与创建
语法:
三种形式:
数据类型[][] 数组名
数据类型 数组名[][]
数据类型[] 数组名[]
示例:
int[][] arr;
int arr[][];
int[] arr[];
二维数组的初始化与引用
在学习二维数组的时候,我们需要知道二维数组存放的是什么样的数据;
如图:
想要保存该类数据,就需要使用二维数组了。
所以,我们可以将二维数组看做一个几行几列的表格这样一个形式。
如果我们想要表示上述表格中的数据,就可以采用如下的方式
语法:
数据类型[][] 数组名;//先声明一个数组
数组名 = new 数据类型[长度][长度];//对数组进行初始化
或
数据类型[][] 数组名 = new 数据类型[长度][长度];//对数组声明的同时进行初始化
示例:
int[][] arr = new int[3][3];
//想要输出第三行第二列的数据:
System.out.println("arr[2][1]");
//为第二行第三列的数据赋值为9:
arr[1][2] = 9;
// 创建float类型的数组,只指定行数
// 注意:只指定行数的写法是可行的,但只指定列数和全不指定的写法是错误的
float arr1 = new float[3][];
// 因为没有指定列数,对该数组取值会出现空指针错误
//System.out.println(arr1[0][0]);
// 针对于该二维数组进行创建行
arr1[0] = new float[3];//第一行有三列,这样的写法可以指定每行有着不同的列
arr1[1] = new float[2];//第二行有二列
arr1[2] = new float[1];//第三行有一列
System.out.println(arr1[0][0]);//0.0
System.out.println(arr1[0][3]);//数组下标越界
以上使用的属于动态的初始化创建,接下来我们来看看静态的初始化创建。
语法:
数据类型[][] 数组名 = {{x,,x,x},{x,x},{x,x,x,x},...,{x}};
示例:
int[][] arr = {{1,2,3},{1,2,3},{1,2,3}};//三行三列的数组
或
int[][] arr = {{1},{1,2},{1,2,3}};//三行不同列的数组
引用:
System.out.println(arr[0][1]);//arr数组第一行第二列的元素
System.out.println(arr.length);//arr数组的长度
System.out.println(arr[0].length);//arr数组第一行的长度
//循环输出二维数组的内容
for(int i = 0; i < arr.length; i++) {
for(int t = 0; t < arr[i].length; t++) {
System.out.println(arr[i][t]);
}
}
练习
一、选择
- 下列数组声明的语法格式不正确的是() C
A. int[] array; B. int array[]; C. char[]; D. String[] strArray;
- 已知一个长度为10的数组b,数组b的第三个元素表示为? C
A. b[3] B. b(3) C. b[2] D. b(2)
- 当数组下标越界时,会发生() ACD
A. 系统崩溃 B. 直接跳过 C. 抛出异常 D. 中止程序 当程序发生异常时,程序会被系统的异常指令流停止运行 所以这道题应该是个多选题
- 下面代码的运行结果为:( A )
A. 55,8,5, B. 5,8,55, C. 8,5,55 D. 5,8,55
- 下面代码的运行结果为:( D )
A. 4 B. 12 C. 0 D. 13
- 下面程序的运行结果是? A
A. 30 B. 60 C. 50 D. 20
- 以下关于二维数组创建对象的语法,错误的是?(多选) AD
A. char[][] ch=new char[][] ; B. char ch[][]=new char[3][5]; C. char[] ch[]=new char[3][]; D. char[][] ch=new char[][5];
- 下列哪个选项是给二维数组的第一行第一列的元素赋值的。 D
A. sum[][] = 3; B. num[1][] = 3; C. num[1][1] = 3; D. sum[0][0] = 3;
- 以下代码的输出结果为 ? A
A. 2 4 B. 3 4 C. 3 3 D. 4 4 System.out.print();//方法不换行显示
- 下列数组有几行几列( D )
A. 三行五列 B. 五行五列 C. 三行三列 D. 五行三列
二、编程
- 求数组中能被3整除的元素并打印输出。
数组内容:public class Opp4 { public static void main(String[] args) { //定义一个整型数组,并初始化 int arr[] ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //循环遍历数组,找出能被3整除的元素并打印输出 for(int i = 0; i < arr.length ; i++) if (arr[i] % 3 == 0){ System.out.println(nums[i]); } } }
- 在一个二维数组中存放了三名学生的语文和数学的成绩,分别求语文和数学的总成绩及平均分并输出。
public class Opp5 { public static void main(String[] args) { //定义一个三行两列的整型二维数组intArray int intArray[][] = new int[3][2]; //自定义并保存三个学生的语文与数学成绩 intArray[0][0] =(99); intArray[0][1] =(99); intArray[1][0] =(88); intArray[1][1] =(88); intArray[2][0] =(77); intArray[2][1] =(77); //求语文的总成绩和平均分 int Chinese = 0; double ChineseStr = 0; for(int i = 0;i < intArray.length; i++){ Chinese += intArray[i][0];//第i++行的第一列的成绩循环相加 } ChineseStr = Chinese / intArray.length; System.out.println("语文总分:" + Chinese); //语文总分:264 System.out.println("语文平均分:" + ChineseStr); //语文平均分:88.0 //求数学的总成绩和平均分 int Mathematics = 0; double MathematicsStr = 0; for(int i = 0;i < intArray.length; i++){ Mathematics += intArray[i][1];//第i++行的第二列的成绩循环相加 } MathematicsStr = Mathematics / intArray.length; System.out.println("数学总分:" + Mathematics); //数学总分:264 System.out.println("数学平均分:" + MathematicsStr); //数学平均分:88.0 } }