java之数组
-
总结
栈: 先进后出
堆: 先进先出
局部变量在栈中
new 关键字创建的在堆中
栈不会做默认初始化: 所以局部变量在使用前, 一定要初始化
堆会做默认初始化: 数值类型为0, 字符为 '', boolean为false, 引用类型为null
1. 数组的定义
-
数组是一个变量, 存储相同数据类型的一组数据
-
声明一个变量就是在内存空间中划出一块合适的空间
-
声明一个数组就是在内存空间划出一串连续的空间
-
2. 数组基本要素
-
标识符
-
数组元素
-
元素下标
-
元素类型
-
数组长度固定不变, 避免数组越界,
-
数组中的所有元素必须属于相同的数据类型
3. 使用数组
1. 声明数组: int[] a; // 告诉计算机数据类型是什么
2. 分配空间: a = new int[5]; // 存放5个数字, 索引从0-4
// 告诉计算机分配几个连续的空间
3. 赋值: a[0] = 8;
4. 处理数据: a[0] = a[0]*10;
数据类型[] 数组名 = new 数据类型[大小]; // 声明数组并分配空间
4. 数组的声明
语法格式:
数据类型[] 数组名;
数据类型 数组名[];
int[] myArray;
int myArray[];
char[] ch;
String[] strArray;
5. 数组的赋值
-
方法1: 边声明边赋值
int[] arr = {1,2,3};
int[] arr1 = new int[]{1,2,3}; // 不能指定长度
-
方法2: 动态的从键盘录入信息赋值
Scanner scanner = new Scanner(System.in);
for(int i = 0; i<20; i++){
scanner[i] = scanner.nextInt();
}
6. 练习(1)
public static void main(String[] args) {
// 数组存储5笔购物金额,在控制台输出并计算总金额
System.out.println("请输入会员本月的消费记录: ");
Scanner scanner = new Scanner(System.in);
double[] shopArray = new double[5];
for (int i = 0; i < 5; i++) {
System.out.printf("请输入第%d笔的购物金额: ", (i + 1));
shopArray[i] = scanner.nextDouble();
}
System.out.println("序号" + "\t\t" + "金额(元)");
for (int i = 0; i < shopArray.length; i++) {
System.out.println((i + 1) + "\t\t" + shopArray[i]);
}
}
7. 练习(2)
public static void main(String[] args) {
// 从键盘输入本次Java考试五位学生的成绩,求考试成绩最高分
System.out.println("输入本次java考试五位学生的成绩: ");
Scanner scanner = new Scanner(System.in);
// 创建数组接收数据
int[] scoresArray = new int[5];
for (int i = 0; i < scoresArray.length; i++) {
scoresArray[i] = scanner.nextInt();
}
// 默认是数组第一个元素最大
int max = scoresArray[0];
// 循环比较
for (int i = 0; i < scoresArray.length - 1; i++) {
if (scoresArray[i] < scoresArray[i + 1]) {
max = scoresArray[i + 1];
}
}
System.out.println("最大值为: " + max);
}
8 练习 插入算法( 重点 )
// 有一组学员的成绩{99,85,82,63,60},将
// 它们按降序排列。要增加一个学员的成绩,将它
// 插入成绩序列,并保持降序
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] scores = { 99, 85, 82, 63, 60 };
System.out.println("请输入你要插入的整数: ");
int insert = scanner.nextInt();
// 新建输入插入元素数组
int[] newScores = new int[scores.length + 1];
// 1. 确定插入值的下标
// 默认下标是最后一个
int index = newScores.length - 1;
for (int i = 0; i < scores.length; i++) {
if (insert > scores[i]) {
index = i; // 保存下标
break;
}
}
// 2. 循环拷贝元素, 并插入新元素
for (int i = 0; i < scores.length; i++) {
if (i < index) {
newScores[i] = scores[i];
} else {
newScores[i + 1] = scores[i];
}
}
// 3. 插入新元素
newScores[index] = insert;
// 遍历新数组
for (int n : newScores) {
System.out.print(n + ",\t");
}
System.out.println();
System.out.println(Arrays.toString(newScores));
}
9. 练习(4)
// 求一个元素的下标
public static void main(String[] args) {
int arr[] = { 1, 2, 5, 23, 67, 78, 3, 78, 34, 9, };
Scanner scanner = new Scanner(System.in);
System.out.println("请输入元素: ");
int element = scanner.nextInt();
// 定义初始下标-1
int index = -1;
// 如果元素有重复的话, 下标默认是最后一个元素的下标
for (int i = 0; i < arr.length; i++) {
if (arr[i] == element) {
index = i;
}
}
System.out.println(element + "元素的下标是" + index);
}
10. 练习(5)
// 数组的交换
public static void main(String[] args) {
int arr[] = { 1, 2, 5, 23, 12, 45, 45, 67 };
// 遍历
System.out.println("交换前: ");
for (int n : arr) {
System.out.print(n + "\t");
}
System.out.println();
// 交换
// 因为是交换, 所以循环数组一半
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
// arr[(arr.length - 1 - i)]表示从数组最后一位依次递减
arr[i] = arr[(arr.length - 1 - i)];
arr[(arr.length - 1 - i)] = temp;
}
System.out.println("交换后: ");
for (int a : arr) {
System.out.print(a + "\t");
}
}
11. 练习(6)
public static void main(String[] args) {
// 需求说明: 求出4家店的最低手机价格
System.out.println("请输入4家店的价格: ");
Scanner price = new Scanner(System.in);
double[] arr = new double[4];
for (int i = 0; i < arr.length; i++) {
System.out.println("第" + (i + 1) + "店的价格: ");
arr[i] = price.nextDouble();
}
// 默认数组一个元素是最小值
double min = arr[0];
for (int i = 0; i < arr.length - 1; i++) {
// 判断如果前一个元素比后一个大, 则把值赋值
if (arr[i] > arr[i + 1]) {
min = arr[i + 1];
}
}
System.out.println("最低价格是: " + min);
}
12. 练习( 冒泡排序 )
// 对五名学员成绩进行降序排序
public static void main(String[] args) {
System.out.println("请输入5名学员的成绩: ");
Scanner scanner = new Scanner(System.in);
int[] scores = new int[5];
for (int i = 0; i < scores.length; i++) {
scores[i] = scanner.nextInt();
}
for (int i = 0; i < scores.length - 1; i++) {
for (int j = 0; j < scores.length - 1 - i; j++) {
if (scores[j] < scores[j + 1]) {
int temp = scores[j];
scores[j] = scores[j + 1];
scores[j + 1] = temp;
}
}
}
System.out.print("学员成绩按降序排序: ");
for (int a : scores) {
System.out.print(a + "\t");
}
}
13. Arrays类的应用
方法名称 | 说明 |
---|---|
boolean equals(arr1,arr2) | 比较两个数组是否相等 |
sort(arr1) | 对数组arr1的元素进行升序排列 |
toString(arr1) | 讲一个数组arr1转换成一个字符串 |
void fill(arr1, val) | 把数组arr1所有元素都赋值为val |
copyOf(arr1, length) | 把数组arr1复制成一个长度为length的新数组,返回类型与复制的一样 |
binarySearch(arr1, val) | 查询元素值val在数组array中的下标(要求数组中元素以及按升序排列) |
14. 多维数组的应用
-
三维及以上的数组很少使用
-
主要使用二维数组
-
从语法上java支持多维数组
-
从内存分配原理的角度讲, 只有一维数组
15. 二维数组
-
<数据类型> [ ][ ] 数组名; 或者 <数据类型> 数组名 [ ][ ];
int[][] scores; // 定义二维数组
scores=new int[4][5]; // 分配内存空间,表示4行5列
// 定义二维数组时, 要定义最大维数
int[][] arr = new int[4][]
-
二维数组实际上是衣蛾一维数组, 它的每个元素又是一个一维数组
// 写法一
int[][] scores=new int[][]{ { 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 }};
// 写法二
int scores[][] = {{ 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 } };
16. 练习(二维数组)
public static void main(String[] args) {
// 已知有3个班级各5名学员,请使用二维数组计算各个班级的总成绩
int[][] arr = new int[3][5];
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
System.out.printf("*****第%d个班*****", (i + 1));
System.out.println();
for (int j = 0; j < arr[i].length; j++) {
System.out.printf("请输入第%d个学生的成绩: ", (j + 1));
arr[i][j] = scanner.nextInt();
}
}
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (i == 0) {
sum1 += arr[i][j];
} else if (i == 1) {
sum2 += arr[i][j];
} else if (i == 2) {
sum3 += arr[i][j];
}
}
}
System.out.println("1班总成绩: " + sum1);
System.out.println("2班总成绩: " + sum2);
System.out.println("3班总成绩: " + sum3);
}
public static void main(String[] args) {
int[][] intArray = new int[3][2];
// 从键盘输入学生成绩,要求输入顺序与效果图一致
Scanner sc = new Scanner(System.in);
for (int i = 0; i < intArray.length; i++) {
for (int j = 0; j < intArray[i].length; j++) {
if (j == 0) {
System.out.printf("请输入第%d个学生的语文成绩: ", (i + 1));
} else {
System.out.printf("请输入第%d个学生的数学成绩: ", (i + 1));
}
intArray[i][j] = sc.nextInt();
}
}
sc.close();
// 语文总成绩和语文平均分
int sumMath = 0;
int sum = 0;
for (int i = 0; i < intArray.length; i++) {
sum = sum + intArray[i][0];
if (intArray[i].length >= 2) {
sumMath += intArray[i][1];
} else {
System.out.println("没有第二个元素");
}
}
System.out.println("语文总成绩是: " + sum);
System.out.println("语文平均成绩是: " + (sum / intArray.length));
System.out.println("数学的总成绩是: " + sumMath);
System.out.println("数学的平均成绩是: " + (sumMath / intArray.length));
}