1. 数组
1.1.数组使用
1.1.1 声明数组
private static void method1() {
int num;
//引用类型 声明数组
int[] scores1;// (常用)
int scores2[];
}
1.1.2 初始化
/*
* 三种初始化方式
*/
private static void method2() {
int[] scores;
//1,第一种初始化方式,scores数组中只能存放3个值数组长度(容量大小)
scores = new int[3];
//2,第2种初始化方式 {}
int[] scores2 = {95, 12, 546, 768, 346};
//3,第3种初始化方式
int[] scores3 = new int[]{12, 234};
//
double[] arr1 = {12.3, 234.6};
//任意数据类型[]
String[] arr2 = {"23", "56", "77"};
}
1.1.3 数组元素和存值和取值
- 数组的索引值从0开始
- 索引的有效取值范围 [0, length-1]
private static void method3() {
//arr1 可以称之为数组名
int[] arr1 = {23, 67, 99, 100};
//取数组元素值 索引值从0开始; 取数组名[索引值]
System.out.println(arr1[3]);
//ArrayIndexOutOfBoundsException数组索引越界 索引的有效取值范围 [0, length-1]
// System.out.println(arr1[1]);
//赋值
arr1[1] = 88;
System.out.println(arr1[1]);
//toString()方法 把数组转换位字符串形式并返回
System.out.println(Arrays.toString(arr1));
}
1.1.4 数组元素的默认值
- 数组的第一种初始化方式,JVM给每个数据元素赋值了。为其数据类型的零值,int零值为0,double的零值为0.0,而所有引用类型的零值是null。
private static void method5() {
//其数据类型的零值, 所有引用类型的零值是null
int[] arr1 = new int[3];
double[] arr2 = new double[6];
boolean[] arr3 = new boolean[5];
String[] arr4 = new String[5];
System.out.println(arr1[0]);
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
System.out.println(Arrays.toString(arr3));
System.out.println(Arrays.toString(arr4));
}
练习题
/*
* 练习题:动态录入班级人数和学员成绩,计算班级学员的平均成绩
*/
private static void method4() {
Scanner input = new Scanner(System.in);
System.out.println("请录入班级学员人数:");
int stuNum = input.nextInt(); //10
//初始化数组
int[] scores = new int[stuNum]; // 10
// 重复执行
int sum = 0;
for (int i = 0; i < stuNum; i++) {
//录入学员成绩
System.out.println("请录入第 " + (i + 1) + " 个学生的成绩");
int score = input.nextInt();
//给数组元素赋值
scores[i] = score;
//成绩累加
sum += score;
}
System.out.println("sum : " + sum);
System.out.println("avg: " + (sum / stuNum));
}
1.1.5 最值所在的索引值
private static void method5() {
int[] arr1 = {45, 67, 89, 10, 100, 20};
// 数组长度
System.out.println(arr1.length);
//求最值 所在的索引
int maxIndex = 0;
int minIndex = 0;
for (int i = 1; i < arr1.length; i++) {
maxIndex = arr1[maxIndex] > arr1[i] ? maxIndex : i;
minIndex = arr1[minIndex] < arr1[i] ? minIndex : i;
}
System.out.println("maxIndex: " + maxIndex);
System.out.println("max: " + arr1[maxIndex]);
System.out.println("min: " + arr1[minIndex]);
System.out.println("minIndex: " + minIndex);
}
1.1.6 对数组遍历
增强for循环
private static void method6() {
int[] arr1 = {45, 67, 89, 10, 100, 20};
//遍历
//1,普通for循环遍历
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("==========");
//2,增强for循环
for (int item : arr1) {
System.out.println(item);
}
//
String[] arr2 = {"abc", "java", "hello"};
for (String a : arr2) {
System.out.println(a);
}
}
1.1.7 数组的拷贝
- 引用赋值
private static void method7() {
int[] arr1 = {34, 55, 10};
//引用赋值
int[] arr2 = arr1;
System.out.println(Arrays.toString(arr2));
arr1[0] = 1;
System.out.println(Arrays.toString(arr2));
}
- 数组元素拷贝
/*
new
*/
private static void method8() {
int[] arr1 = {34, 55, 10};
// 方式new出来的对象都在堆空间
int[] arr2 = new int[arr1.length];
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
System.out.println(Arrays.toString(arr2));
arr1[0] = 1;
System.out.println(Arrays.toString(arr2));
}
- 借助Arrays工具类 Arrays.toString()
1.2.Arrays工具类
1.2.1 常用方法
- Arrays.toString 元素以字符串形式返回。
- Arrays.copyOf(arr1, arr1.length)。数组拷贝,第一个参数是源头数组,第二个参数是新数组的长度。
- Arrays.equals(arr1, arr2),两数组比较。
- Arrays.sort(arr1),对数组排序 升序。
private static void method9() {
// Arrays工具类
int[] arr1 = {23, 12, 66, 9, 1};
//Arrays.toString 元素以字符串形式返回
System.out.println(Arrays.toString(arr1));
//数组拷贝 ,第一个参数是源头数组,第二个参数是 新数组的长度
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println(Arrays.toString(arr2));
// 两个数组元素值一一相等
boolean b = Arrays.equals(arr1, arr2);
System.out.println(b);
//对数组排序 升序
Arrays.sort(arr1);
System.out.println(Arrays.toString(arr1));
}
练习
数组的动态扩容
public static void main(String[] args) {
//动态 扩容
Scanner scanner = new Scanner(System.in);
String[] names = new String[3];
int index = 0;
String answer = "";
do {
if (index >= names.length) {
//容量不足了 ,需要扩容
System.out.println("容量不足了 ,正在扩容");
// 对names重新赋值,names指向新的数组,进行扩容
names = Arrays.copyOf(names, names.length * 2);
}
System.out.println("请录入 第" + (index + 1) + "个学生姓名: ");
names[index] = scanner.next();
index++;
} while (answer.equals("y"));
System.out.println(Arrays.toString(names));
}
1.3 二维数组
- 二维数组的数组元素是一维数组
- 二维数组也是引用类型
1.3.1 二维数组的初始化
private static void method1() {
int[][] arr = new int[3][];
//只要出现new都是在堆新开辟空间;
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[9];
System.out.println(Arrays.toString(arr));
// 2种初始化方式 每个一维数组长度一样
int[][] arr2 = new int[3][2];
/* arr2[0] = new int[2];
arr2[1] = new int[2];
arr2[2] = new int[2];*/
System.out.println(Arrays.toString(arr2));
// 3种 直接赋值
int[][] arr3 = {{23, 234, 12}, {1, 2, 3, 4}};
}
1.3.2 二维数组的元素存和取
- 空指针报错 不能对null进行任何成员的调用
private static void method2() {
int[][] arr = new int[3][]; //null,null,null
System.out.println(arr.length);
// null.
//只要出现new 都会在堆新开辟空间;
arr[0] = new int[3];
System.out.println(arr[0].length);
// 取
System.out.println(arr[0][0]);
//赋值
arr[0][0] = 19;
System.out.println(arr[0][0]);
}
练习
/*
动态录入班级数,以及每个班级学生的人数,以及每个学生的成绩
* [23,1234,14,12]
* [12,56]
* [90]
*/
private static void method3() {
Scanner scanner = new Scanner(System.in);
System.out.println("请录入班级个数 ");
int classNum = scanner.nextInt(); //3
//
int[][] scores = new int[3][];
//
for (int i = 0; i < scores.length; i++) {
System.out.println("请录入第" + (i + 1) + "个班的学生人数:");
int stuNum = scanner.nextInt();
//给一维数组初始化
scores[i] = new int[stuNum];
for (int j = 0; j < scores[i].length; j++) {
System.out.println("请录入第" + (i + 1) + "个班 第" + (j + 1) + "个学生的成绩:");
scores[i][j] = scanner.nextInt();
}
}
for (int i = 0; i < scores.length; i++) {
System.out.println(Arrays.toString(scores[i]));
}
}