数组(Array)
数组是相同类型数据按照一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据惊醒统一的管理
相关概念
- 数组名
- 数组中的元素
- 下标,索引
- 数组的长度
数组的特点:
- 数组是有序排列
- 数组本身就是引用数据类型,而数组中的元素可以是任何数据类型(包括基础数据类型和引用数据类型)
- 创建数据对象在内存中是一整块连续的空间
- 数组的长度一旦确定,就不能修改
数组的分类
按照维度
- 一维数组
- 二维数组
- 三位数组等等
按照数组元素的类型
- 基本数据类型元素的数组
- 引用数据类型元素的数组
一维数组的使用
一维数组的声明和初始化(一旦初始化操作完成,数组的长度就确定了)
- 静态一维数组初始化 : 数组的初始化和数组元素的赋值操作同时进行
int[] nums;
nums = new int[] {1,2,3,4}; - 动态一维数组初始化 : 数组的初始化和数组元素的赋值操作分开进行
String[] strs = new String[5];
调用数组指定位置的元素
- 使用行列索引来调用对应的元素,行索引的范围(0行数组的长度-1),列索引的范围(0列数组的长度-1)
- 数组名[行索引][列索引];
获取数组的长度
- 使用数组的属性
- 获取行长度 数组名.length
- 获取列长度 数组名[行索引].length
遍历数组
- 获取数组的长度使用循环遍历数组中的元素
- for(int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
数组元素的默认初始化
- 数组元素是整型的默认值 : 0
- 数组元素是浮点型的默认值 : 0
- 数组元素是char的默认值 : 0(ASNII值的数字0)
- 数组元素是boolean的默认值 : false(因为boolean在使用的时候是int,0代表了false)
- 数组元素是String的默认值 : null(空值)
数组的内存解析(JVM)
- 变量存储在栈中,new的对象和数组存储在堆中
- 在堆中每一个数组和对象的头部都有一个十六进制的内存地址,这个地址在栈中与变量名相对应
二维数组
二维数组的声明和初始化(一旦初始化操作完成,数组的长度就确定了)
- 静态初始化
int[][] arr = new int[][] {{1,2,3},{4,5,6},{7,8,9}}; - 动态初始化1(行和列都定义好了,必须定义行)
String[][] arrs = new String[2][3];
动态初始化2(行定义好了,列还没有确定,必须定义行)
String[][] arrs2 = new String[2][];
调用数组指定位置的元素
- 使用索引来调用对应的元素,索引的范围(0~数组的长度-1)
- 数组名[索引];
获取数组的长度
- 使用数组的属性
- 数组名.length
遍历数组
- 获取数组的长度使用循环遍历数组中的元素
- for(int i = 0; i < arr.length; i ++) {
for(int j = 0 ; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
二维数组的外层,内层数组元素
- 外层 : 数组名[行索引]
- 内层 :数组名[行索引][列索引]
数组元素的默认初始化 使用类似 String[] arr5[] = new String[2][4];的方式定义
- 外层的默认值是 内存地址 [I@7852e922 ([代表是一维的数组,[[代表是二维的数组,I是Int,@7852e922是农村地址)
- 内层数组元素是整型的默认值 : 0
- 内层数组元素是浮点型的默认值 : 0
- 内层数组元素是char的默认值 : 0(ASNII值的数字0)
- 内层数组元素是boolean的默认值 : false(因为boolean在使用的时候是int,0代表了false)
- 内层数组元素是String的默认值 : null(空值)
数组元素的默认初始化 使用类似 String[] arr5[] = new String[2][];的方式定义
- 外层默认值为 null
- 内层不能调用,空指针异常
数组的内存解析(JVM)
- 变量存储在栈中,new的对象和数组存储在堆中
- 在堆中每一个数组和对象的头部都有一个十六进制的内存地址,这个地址在栈中与变量名相对应
public class Test {
public static void main(String[] args) {
// 一维数组的声明和初始化
// 静态一维数组初始化
int[] nums;
nums = new int[] {1,2,3,4};
// 动态一维数组初始化
String[] strs = new String[5];
// 其他写法
int[] ints = {1,2,3,4};
// 使用索引来调用对应的元素,索引的范围(0~数组的长度-1)
strs[0] = "中国";
strs[1] = "美国";
strs[2] = "俄罗斯";
strs[3] = "印度";
strs[4] = "古巴";
// strs[5] = ""; java.lang.ArrayIndexOutOfBoundsException
System.out.println(strs[1]);
// 获取数组长度
System.out.println(strs.length);
// 遍历数组
for(int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
// 数组元素的默认初始值
byte[] b1 = new byte[4];
for(int i = 0; i < b1.length; i++) {
System.out.println(b1[i]);
}
// 二维数组的声明和初始化
// 静态初始化
int[][] arr = new int[][] {{1,2},{4,5,6},{7,8,9}};
// 动态初始化1(行和列都定义好了,必须定义行)
String[][] arrs = new String[2][3];
// 动态初始化2(行定义好了,列还没有确定,必须定义行)
String[][] arrs2 = new String[2][];
// 其他写法
int[] arr3[] = new int[][] {{1,2},{3,4}};
int[] arr4[] = {{1,2},{3,4}};
// 调用二维数组的指定位置的元素
System.out.println(arr[0][1]);
System.out.println(arrs[0][1]);
// 获取数组长度
System.out.println(arr.length);
System.out.println(arr[0].length);
// 遍历二维数据
for(int i = 0; i < arr.length; i ++) {
for(int j = 0 ; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
// 二维数组的初始化值
String[] arr5[] = new String[2][4];
System.out.println(arr5);
System.out.println(arr5[1][2]);
}
}
小案例
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 初始化
Scanner sc = new Scanner(System.in);
System.out.printf("请输入学生人数:\n");
int number = sc.nextInt();
int[] scores = new int[number];
//赋值
for(int i = 0 ; i < scores.length; i++) {
System.out.printf("请输入第%d位同学的成绩!\n",i+1);
int score = sc.nextInt();
scores[i] = score;
}
// 求最高分
int max = 0;
for (int i = 0 ; i <scores.length; i++) {
max = (scores[i] >= max)? scores[i]: max ;
}
// 计算并打印
System.out.printf("最高分是: %d!\n",max);
for (int i = 0 ; i <scores.length; i++) {
if(max - scores[i] <= 10) {
System.out.printf("student %d score is %d grade is A \n",i,scores[i]);
}else if(max - scores[i] <= 20) {
System.out.printf("student %d score is %d grade is B \n",i,scores[i]);
}else if(max - scores[i] <= 30) {
System.out.printf("student %d score is %d grade is C \n",i,scores[i]);
}else {
System.out.printf("student %d score is %d grade is D \n",i,scores[i]);
}
}
}
}