目录
一、数组的定义
数组:存储数据的空间(装数据的容器),数组中可以装多个相同类型的数据。
其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。
二、数组的声明、创建及赋值
- 声明数组:数据类型[ ] 数组名; 或者 数据类型 数组名[ ];
- 数组创建:数组的长度是固定不变的,你需要告诉数组能存储多少个元素,也就是分配空间。
- 数组名=new 数据类型[数组长度];
- 赋值:将数据存储到数组中。
- 数组名[下标]=数据;
注意:若数组声明好并分配空间后,如果没有进行赋值操作,数组会给每一个元素一个默认值。
整数类型的数组元素默认值为0;浮点数类型的数组元素默认值为0.0;字符型数组元素默认值为空格;布尔类型的数组元素默认值为false;字符串类型数组元素默认值为null。
- 声明数组和分配空间合并写:
数据类型[ ] 数组名=new 数据类型[数组长度];
数据类型 数组名[ ]=new 数据类型[数组长度];
以上两种形式都可以,看个人习惯。
- 声明数组、分配空间、赋值合并写:
数据类型[ ] 数组名=new 数据类型[ ]{数据1,数据2,数据3,.........,数据n};
以上可简写为:
数据类型[ ] 数组名={数据1,数据2,数据3,....,数据n};
三、遍历数组
数组名.length可以获取数组长度。
输出所有元素,这个操作称之为遍历数组。一般用两种方法:
- 利用for循环
int[] nums = { 11, 25, 79, 63, 45, 31, 10, 25, 79, 99, 43, 68, 13, 44,
77, 66, 82, 106, 352, 78, 194, 56, 78, 96, 45, 54, 69, 77 };// 获取数组长度(得到数组中元素的个数) -->数组名.length
int length = nums.length;
System.out.println("nums数组中元素个数:" + length);//输出数组中所有的元素
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + " ");
}
System.out.println();
- 增强for循环
语法结构:
for(数据类型 变量名 : 数组名){
操作变量名这个变量
}
-->数据类型就是你要操作的数组的类型,
-->变量名是复合变量命名规则的变量,
-->数组名是你要操作的数组名称
执行规律:
将你要操作的数组中的元素按照下标顺序依次取出来存储在变量中,这时候你操作变量,就是操作数组中的数据。
for(int a : nums){
System.out.print(a+" ");
}
四、数组的应用
- 猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数。
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要猜测的数据:");
int guess =sc.nextInt();
//定义一个变量用来统计比较次数,如果比较到数组中的最后一个元素,说明数组中没有你猜测的数据
int count = 0;
for (int i = 0; i < nums.length; i++) {
if(guess==nums[i]){
System.out.println("你猜测的数据在数组中存在,下标为:"+i);
break;
}else{
count++;
}
}
if(count==nums.length){
System.out.println("你猜测的数据不在数组中");
}
- 求数组中元素的最大值
从键盘输入本次Java考试五位学生的成绩。存储在数组中,求考试成绩最高分
Scanner sc = new Scanner(System.in);
准备一个长度为5的double类型的数组用来存储5个学生的Java考试成绩
double[] scores = new double[5];
通过循环和键盘录入获得5个学生的成金并存储在数组中
for (int i = 0; i < scores.length; i++) {
System.out.println("请输入第"+(i+1)+"个学生的成绩:");
scores[i]=sc.nextDouble();
}
遍历一下数组
System.out.println("学生成绩分别是:");
for (double d : scores) {
System.out.print(d+" " );
}
System.out.println();
假设数组中的第一个元素为最大值
double max = scores[0];
使用循环来实现max和每个元素之间的比较,每当有元素比max大,就会把值赋给max,然后接着和下一个元素比较,直到和数组中最后一个元素比较完就能得到最大值
for (int i = 0; i < scores.length; i++) {
if(scores[i]>max){
max = scores[i];
}
}
System.out.println("5个学生中最高成绩为:"+max);
- 在数组中插入一个数据,并保持降序
数组长度一旦固定好以后,是不能修改,这时候,你要插入一个学员成绩,是无法插入的,你只能新建一个长度比原来数组长度大1的数组
1)新建一个长度比原来数组大1的数组
2)将原来数组中的元素存储到这个新的数组中
3)获取你要插入的数据
4)获取插入元素要插入的位置(下标),通过循环比较插入的数据与数组中元素得到
5)从插入位置开始及之后的元素依次往后移动一个位置,空出插入位置,存储插入的元素,移动需要从最后一个位置开始操作
6)将插入的元素存储到插入位置,并保持降序
有一组学员的成绩{99,85,82,63, 60},将它们按降序排列。要增加一个学员的成绩,将它插入成绩序列,并保持降序
// 创建Scanner类对象,用于输入你要插入的数据
Scanner sc = new Scanner(System.in);// 原来的成绩数组
int[] scores = { 99, 85, 82, 63, 60 };// 1)新建一个长度比原来数组大1的数组
int[] newScores = new int[scores.length + 1];
// 2)将原来数组中的元素存储到这个新的数组中for (int i = 0; i < scores.length; i++) {
newScores[i] = scores[i];
}// 遍历数组
System.out.println("插入成绩之前:");
for (int i : newScores) {
System.out.print(i + " ");
}
System.out.println();// 3)获取你要插入的数据
System.out.println("请输入你要插入的成绩:");
int insert = sc.nextInt();// 4)获取插入元素要插入的位置(下标)
int index = newScores.length-1;
for (int i = 0; i < newScores.length; i++) {
// 如果插入的元素比数组中的元素大,表面插入元素要存储在该位置
if (insert > newScores[i]) {
index = i;
// 一旦得到插入数据比数组中元素大,就结束后续比较,退出循环
break;
}
}// 5)从插入位置开始及之后的元素依次往后移动一个位置
for (int i = newScores.length - 1; i > index; i--) {
newScores[i] = newScores[i - 1];
}// 6)将插入的元素存储到插入位置
newScores[index] = insert;// 遍历数组
System.out.println("插入成绩之后:");
for (int i : newScores) {
System.out.print(i + " ");
}
System.out.println();
- 使用冒泡排序对数组进行升序或者降序排序
int[] nums = {11,25,96,46,78,32,18,64};
System.out.println("数组排序前:");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+" ");
}
System.out.println();
//外层循环控制比较的轮数(以前讲的行数)
for(int i =0;i<nums.length-1;i++){
//内层循环控制每一轮的比较次数(以前讲的列数)
for(int j = 0;j<nums.length-1-i;j++){
//比较相邻的两个元素,如果前面的元素比后面的元素大,交换位置
if(nums[j]>nums[j+1]){
int templ = nums[j];
nums[j]=nums[j+1];
nums[j+1]=templ;
}
}
}
System.out.println("数组排序后:");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+" ");
}
System.out.println();
五、Arrays类
Arrays类:专门用来操作数组的类,这个类中提供了许多操作数组的方法
- 使用Arrays.sort(数组名)对数组进行升序排序
- 使用Arrays.toString(数组名)输出数组
- Arrays.equals(数组名1,数组名2):比较两个数组中的元素是否一样,如果是一样(要求两个数组中的对应下标上的元素值相同,数组长度一样),返回true,否则返回false
- Arrays.fill(数组名,数据):将数组中的所有元素值替换为你指定的数据
- copyOf(array,length):把数组array复制成一个长度为length的新数组,返回类型与复制的数组一致
- int binarySearch(array, val)查询元素值val在数组array中的下标(要求数组中元素已经按升序排列),如果数组中没有你要查找的元素,返回一个负值
- int[] copyOfRange(int[] original, int from, int to) 将指定数组的指定范围复制到一个新数组。 复制的范围包括开始索引,不包括结束索引
六、二维数组
二维数组的声明 数据类型[ ][ ] 数组名; 或者 数据类型 数组名[ ][ ];
分配空间:告诉数组里面的元素个数 数组名 = new 数据类型[长度][长度]; 或者 数组名 = new 数据类型[数组长度][ ];
赋值:将数据存储在数组中 数组名[下标][下标]
二维数组的声明和分配空间合并写 数据类型[ ][ ] 数组名 = new 数据类型[长度][长度]; 或者 数据类型[ ][ ] 数组名 = new 数据类型[长度][ ];
二维数组的声明、分配空间、赋值、合并写
数据类型[ ][ ] 数组名 = new 数据类型[ ][ ]{{数据1,数据2,...,数据n},{数据1,数据2,...,数据n},...,{数据1,数据2,...,数据n}};
二维数组声明、分配空间、赋值的简写方式
数据类型[][] 数组名={{数据1,数据2,...,数据n},{数据1,数据2,...,数据n},...,{数据1,数据2,...,数据n}};
- 二维数组的遍历
int[ ][ ] nums = { { 11, 23, 45 }, { 25, 36 },
{ 55, 66, 44, 78, 95, 123, 68 }, { 100 } };for (int i = 0; i < nums.length; i++) {
for(int j =0;j<nums[i].length;j++){
System.out.print(nums[i][j]+" ");
}
//换行
System.out.println();
}