数组
一维数组
概念
- 记录单个数据内容时,声明一个变量即可
- 在程序中记录多个类型相同的数据内容时,声明一个一维数组即可
- 一维数组的本质是在内存空间中申请一段连续的存储单元
- 数组是相同数据类型的多个元素的容器:::
- 元素按线性顺序排列,体现为一种 引用数据类型
格式
- 数据类型[] 数组名称 = new 数据类型[数组长度];
- 数组长度 在声明的时候进行设定及length属性进行获取
- 通过下标的方式访问数组中的每一个元素
数组的下标从 0 开始;对于长度为n的数组,下标的范围是 0 ~ n-1
内存结构分析
- 内存结构之栈区 【基本数据类型】
- 栈用于存放程序运行过程中所有的局部变量。 一个运行的java程序从开始到结束会有多次变量的声明
- 存放当前变量的值
int num = 2;
- 内存结构之堆区 【引用数据类型】
- jvm会在内存空间中开辟一个称为“堆”的存储空间,这部分空间用于存储使用new关键字创建的数组和对象
- 存放当前对象的内存地址
int[] num = int[2];
一维数组优缺点
-
优点
- 直接通过下标(索引)的方式访问指定位置的元素 快速
-
缺点
- 所有元素类型必须相同
- 内存空间必须连续,长度一点确定就不能修改
- 增加和删除元素时可能移动大量元素,效率低
实践出真理
1.基操
void BaseTest() {
//定义一个一维数组 int类型、长度为3
int[] array = new int[3];
//方式二 不推荐使用,容易与 变量的声明区分,提高代码可读性
//int array_1[] = new int[3];
//获取数组的长度
int array_Length = array.length;
System.out.println("数组的长度为: " + array_Length);
for (int i = 0; i < array_Length; i++) {
System.out.println("当前下标为: " + i + " 的内容是: " + array[i]);
}
//在声明的同时进行赋值 静态方式简化版
char[] chars = {'a', 'b', 'c', 'd'};
//方式二 静态方式
boolean[] bool = new boolean[]{false, true, true, false};
for (int i = 0; i < chars.length; i++) {
System.out.println("当前下标为: " + i + " 的内容是: " + chars[i] + "\tbool中的内容为: " + bool[i]);
}
}
运行结果:2.增删改查操作
void AddDelChaIns() {
int[] arr = new int[5];
// 将 “11、22、33、44”按顺序从头(下标为0)进行赋值
// arr[0] = 11;
// arr[1] = 22;
// arr[2] = 33;
// arr[3] = 44;
//简化操作
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = (i + 1) * 11;
}
System.out.print("赋值后--数组中的内容为: ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
//将 “55” 插入 头部位置(下标为0)
for (int i = arr.length - 1; i > 0; i--) {
arr[i] = arr[i - 1];
}
arr[0] = 55;
System.out.print("插入后--数组中的内容为: ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
//将 55 从头部位置删除
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
arr[arr.length - 1] = 0;
System.out.print("删除后--数组中的内容为: ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
//查找 22
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 22) {
arr[i] = 330;
break;
}
}
System.out.print("修改后--数组中的内容为: ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
运行结果:3.数组间的拷贝(复制)
void Copy() {
int[] arr = {11, 22, 33, 44, 55};
int[] co = new int[3];
//粗暴
co[0] = arr[1];
co[1] = arr[2];
co[2] = arr[3];
//温柔一点
for (int i = 0; i < co.length; i++) {
co[i] = arr[i + 1];
}
//util
System.arraycopy(arr, 1, co, 0, 3);
}
- 数组拷贝 co = arr 操作 :
直接用数组arr中的内容覆盖co中的内容
4.统计用户输入的任意整数中各个数字出现的次数
void StatisticsNum() {
int[] numArr = new int[10];
System.out.println("请输入任意一个正整数:");
Scanner sc = new Scanner(System.in);
int numInput = sc.nextInt();
System.out.println("输入的数字为: " + numInput);
int temp = numInput;
int num = 0;
while (temp > 0) {
num = temp % 10;
temp /= 10;
numArr[num] = numArr[num] + 1;
}
for (int i = 0; i < numArr.length; i++) {
if (numArr[i] <= 0) continue;
System.out.print("\n数字 " + i + "\t出现的次数为: " + numArr[i]);
}
}
运行结果:5.保存并计算学生的总成绩与平均分
void StudentScore() {
System.out.println("请输入学生人数");
Scanner sc = new Scanner(System.in);
int studentCount = sc.nextInt();
int[] scores = new int[studentCount];
int score = 0;
int total = 0;
for (int i = 0; i < studentCount; i++) {
System.out.println("请输入第 " + (i + 1) + " 个学生的成绩");
score = sc.nextInt();
scores[i] = score;
total += score;
}
for (int i = 0; i < studentCount; i++) {
System.out.println("第 " + (i + 1) + " 个学生的成绩为: " + scores[i]);
}
System.out.println("学生的总成绩为: " + total + "\n平均分为: " + total * 1.0 / studentCount);
}
运行结果:数组工具类
- java.util.Arrays
- 功能:对数组中元素的遍历、查找、排序等操作
实践出真理
1. 遍历 toString
```java
int [] array = new int[5];
System.out.println("当前数组中的元素为: "+Arrays.toString(array));
//当前数组中的元素为: [0,0,0,0,0]
```
2. 填充指定值 fill
```java
Arrays.fill(array,3);
System.out.println("当前数组中的元素为: "+Arrays.toString(array));
//当前数组中的元素为: [3,3,3,3,3]
```
3. 判断两个数组元素内容与次序是否相同 equals
```java
int[] arr = {4,4,4,4,3};
System.out.println(Arrays.equals(arr,array)); // false
Arrays.fill(arr,3);
System.out.println(Arrays.equals(arr,array)); // true
```
4. 排序 sort 从小到大的顺序
int[] arr_Order = {12,52,36,21,10};
Arrays.sort(arr_Order)
System.out.println(Arrays.toString(arr_Order))
// [10,12,21,36,52]
5. 查找参数指定元素所在的位置 binarySearch
System.out.println(" 36分在数组中的下标位置是: " + Arrays.binarySearch(arr_Order,36))
// 36分在数组中的下标位置是: 3
// 如果要查找的元素不存在数组中,则输出 -2
二维数组
概念与格式
- 本质上有多个一维数组摞在一起组成的数组
- 二维数组中的每个元素都是一维数组:::
-
!!一维数组中的每个元素才是数据内容 !!
- 声明和使用
- 数据类型[][] 数组名称 = new 数据类型[行数][列数];
- 数据类型[][] 数组名称 = {{元素1,元素2,元素3,元素...},{},{},{}};
结果输出:int[][] arr_Two = new int[2][3]; int tempValue = 0; //初始化并赋值 //方式一 初始化的同时进行赋值 int[][] arr_Two ={{0,1,2},{3,4,5}}; //方式二 通过遍历的方式进行赋值 for (int i = 0; i < arr_Two.length; i++) { for (int j = 0; j < arr_Two[i].length; j++) { arr_Two[i][j] = tempValue++; } } for (int i = 0; i < arr_Two.length; i++) { for (int j = 0; j < arr_Two[i].length; j++) { System.out.print(arr_Two[i][j] + "\t"); } System.out.println(); }
实践出真理
-
[杨辉三角]
void YangHuiTriangle() {
System.out.println("请输入要显示的行数: ");
Scanner sc = new Scanner(System.in);
int row = sc.nextInt();
int[][] yh = new int[row][];
for (int i = 0; i < row; i++) {
yh[i] = new int[i + 1];
for (int j = 0; j <= i; j++) {
if (0 == j || i == j) {
yh[i][j] = 1;
} else {
yh[i][j] = yh[i - 1][j] + yh[i - 1][j - 1];
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j <= i; j++) {
System.out.print(yh[i][j] + "\t");
}
System.out.println();
}
}
运行结果: