1, 一维数组
基本概念, 两种声明方式, 增删改查操作, 优缺点, 数组工具类
2, 二维数组
基本概念, 两种声明方式
目录
&&&&&总结&&&&&
5 数组的概念和应用
5.1 一维数组
5.1.1基本概念
5.1.2 声明方式
代码: 编程实现一维数组的声明和使用
5.1.3 初始化方式
5.1.4 内存结构之栈区
代码: 编程实现一维数组的增删改查操作
5.1.5 数组的优缺点
代码: 编程实现,一位数组之间元素的拷贝
代码: 一维数组统计数字出现次数
代码: 编程实现,提示输入人数,再提示输入成绩并打印, 计算总分, 平均分并打印
5.1.6 数组工具类的概念
5.1.7 数组工具类的常用方法
代码: 编程实现数组工具类的使用
5.2 二维数组(熟悉)
5.2.1 概念
5.2.2 声明和初始化方式
代码: 编程实现,二维数组的声明和使用
代码: 编程实现,杨辉三角的打印
• 当需要在Java程序中记录单个数据内容时,则声明一个变量即可。
• 当需要在Java程序中记录多个类型相同的数据内容时,
则声明一个一维数 组即可,一维数组本质上就是在内存空间中申请一段连续的存储单元。
• 数组是相同数据类型的多个元素的容器,元素按线性顺序排列,在Java语 言中体现为一种引用数据类型。
• 数据类型[] 数组名称 = new 数据类型[数组的长度];
• 调用数组的length属性可以获取数组的长度:
• 可以通过下标的方式访问数组中的每一个元素。
需要注意的是:数组的 下标从0开始,对于长度为n的数组,下标的范围是0~n-1。
/*
编程实现一维数组的声明和使用
*/
public class ArrayTest {
public static void main(String[] args) {
//1.声明一个长度为2类型为int的一维数组
//数据类型[] 数组名称 = new 数据类型[数组长度];
//int arr1[] = new int[2]; //两种方式从结果上来说是一样的,但本方式不推荐使用
//int num = 2; //声明一个初始值为2的变量
int[] arr1 = new int[2]; //推荐该方式,更容易与变量区分,提高了代码的可读性
//2.打印一维数组的长度以及每个元素的数值
System.out.println("数组的长度是:" + arr1.length); //2
System.out.println("下标为0的元素是:" + arr1[0]); //0
System.out.println("下标为1的元素是:" + arr1[1]); //0
//System.out.println("下标为2的元素是:" + arr1[3]); //编译ok,运行发生ArrayIndexOutOfBoundsException数组下标越界异常
System.out.println("---------------------------------------------");
//3.使用for循环打印数组中的所有元素
for(int i = 0; i < arr1.length; i++) {
System.out.println("下标为0的元素是:" + arr1[i]); //全是0
}
System.out.println("---------------------------------------------");
//4.声明一个长度为5类型为double的一维数组
double[] arr2 = new double[5];
//打印数组中的每个元素
for(int i = 0; i < arr2.length; i++) {
System.out.println("下标为0的元素是:" + arr2[i]); //全是0
}
System.out.println("---------------------------------------------");
//5.声明数组的同时就对数组中的元素进行初始化 静态方式的简化版
char[] arr3 = {'a','b','c','d'};
//打印数组中的每个元素
for(int i = 0; i < arr3.length; i++) {
System.out.println("下标为0的元素是:" + arr3[i]); //abcd
}
System.out.println("---------------------------------------------");
//6.特殊的方法
boolean[] arr4 = new boolean[]{true, true, true, false}; //静态模式
//打印数组中的每个元素
for(int i = 0; i < arr4.length; i++) {
System.out.println("下标为0的元素是:" + arr4[i]); //true true true false
}
}
}
• 基本类型的数组(数据元素为基本类型)创建后,
其元素的初始值:byte、 short、char、int、long为0;float和double为0.0;boolean为false。
• 可以在数组声明的同时进行初始化,具体如下: 数据类型[] 数组名称 = {初始值1, 初始值2, ...};
• 栈用于存放程序运行过程当中所有的局部变量。一个运行的Java程序从开 始到结束会有多次变量的声明。
• JVM会在其内存空间中开辟一个称为“堆”的存储空间,这部分空间用于存 储使用new关键字创建的数组和对象。
案例题目
• 声明一个长度为5元素类型为int类型的一维数组,打印数组中所有元素值;
• 使用元素11、22、33、44分别对数组中前四个元素赋值后再次打印;
• 将元素55插入到下标为0的位置,原有元素向后移动,再打印所有元素值;
• 将元素55从数组中删除,删除方式为后续元素向前移动,最后位置置为0 并打印;
• 查找数组中是否存在元素22,若存在则修改为220后再次打印所有元素;
/*
编程实现一维数组的增删改查操作
*/
public class ArrayOp {
public static void main(String[] args) {
//1.声明一个长度为5数据类型为int的一维数组
int[] arr1 = new int[5];
//打印数组中所有元素的数值
for(int i = 0; i < arr1.length; i++) {
System.out.println("第" + i + "个元素的数值为:" + arr1[i]);
}
System.out.println();
System.out.println("---------------------------------------------");
//2.将11 22 33 44 依次对数组中的前四个元素赋值
/*
arr1[0] = 11;
arr1[1] = 22;
arr1[2] = 33;
arr1[3] = 44;
*/
for(int i = 0; i < arr1.length - 1 ; i++) {
arr1[i] = (i + 1) * 11;
}
for(int i = 0; i < arr1.length; i++) {
System.out.println("第" + i + "个元素的数值为:" + arr1[i]);
}
System.out.println();
//3.将数据55插入到下标为0的位置,原有元素向后移动
/*
arr1[4] = arr1[3];
arr1[3] = arr1[2];
arr1[2] = arr1[1];
arr1[1] = arr1[0];
arr1[0] = 55;
*/
/*
System.out.println("---------------------------------------------");
for(int i = 0; i < arr1.length - 1; i++) {
arr1[4 - i] = arr1[3 - i];
}
arr1[0] = 55;
for(int i = 0; i < arr1.length; i++) {
System.out.println("第" + i + "个元素的数值为:" + arr1[i]);
}
System.out.println();
*/
System.out.println("---------------------------------------------");
for(int i = arr1.length - 1; i > 0; i--) {
arr1[i] = arr1[i - 1];
}
arr1[0] = 55;
for(int i = 0; i < arr1.length; i++) {
System.out.println("第" + i + "个元素的数值为:" + arr1[i]);
}
System.out.println();
System.out.println("---------------------------------------------");
//4.将数据55从数组中删除,即后续元素向前移动,最后一个位置置为0
for(int i = 0; i < arr1.length - 1; i++) {
arr1[i] = arr1[i + 1];
}
arr1[4] = 0;
for(int i = 0; i < arr1.length; i++) {
System.out.println("第" + (i + 1) + "个元素的数值为:" + arr1[i]);
}
System.out.println();
System.out.println("---------------------------------------------");
//5.查找数组中是否有元素22,若有,则修改为220后打印全部元素
for(int i = 0; i < arr1.length; i++) {
if(22 == arr1[i]) {
arr1[i] = 220;
}
}
for(int i = 0; i < arr1.length; i++) {
System.out.println("第" + (i + 1) + "个元素的数值为:" + arr1[i]);
}
System.out.println();
}
}
• 可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快。
• 数组要求所有元素的类型相同。
• 数组要求内存空间连续,并且长度一旦确定就不能修改。
• 增加和删除元素时可能移动大量元素,效率低。
案例题目
• 声明一个初始值为11 22 33 44 55的一维数组并打印所有元素
• 声明一个长度为3元素类型为int类型的一维数组并打印所有元素
• 实现将第一个数组中间3个元素赋值到第二个数组中
• 再次打印第二个数组中的所有元素
/*
编程实现,一位数组之间元素的拷贝
*/
public class ArrayCopy {
public static void main(String[] args) {
System.out.println();
System.out.println("---------------------------------------------");
System.out.println();
int[] arr1 = {11, 22, 33, 44, 55};
System.out.print("数组arr1中的元素有:");
for(int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + " ");
}
System.out.println();
System.out.println();
System.out.println("---------------------------------------------");
System.out.println();
int[] arr2 = new int[3];
System.out.print("数组arr2中的元素有:");
for(int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}
System.out.println();
System.out.println();
System.out.println("---------------------------------------------");
System.out.println();
/*
for(int i = 0; i < arr2.length; i++) {
arr2[i] = arr1[i + 1];
}
*/
//可以直接使用java官方提供的拷贝功能
System.arraycopy(arr1, 1, arr2, 0, 3); //表示将数组arr1中下标1开始的3个元素拷贝到数组arr2中下标0开始的三个位置
System.out.print("拷贝后数组arr2中的元素有:");
for(int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}
System.out.println();
System.out.println();
System.out.println("---------------------------------------------");
System.out.println();
//4.笔试考点
// 表示将变量arr1的数值赋值给arr2,覆盖原来变量arr2中的值
// 数组名arr1在内存空间中存放的是数据在堆区中的内存地址,赋值后让arr2中存放了arr1所指向的堆区的内存地址
// 也就是让arr2和arr1指向了同一块堆区空间
arr2 = arr1;
//这是在改变指向,是arr2指向arr1中的数据
System.out.print("拷贝后数组arr2中的元素有:");
for(int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}
System.out.println();
}
}
案例题目
• 编程统计用户输入任意一个正整数中每个数字出现次数的统计并打印。
• 如:123123 => 1出现2次,2出现2次,3出现2次
/*
一维数组统计数字出现次数
*/
import java.util.Scanner;
public class CountNum {
public static void main(String[] args) {
//1.提示用户输入一个正整数并用变量记录
System.out.print("请输入一个正整数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
//2.准备一个长度为10,元素类型int的数组
int[] arr = new int[10];
//3.拆分正整数中的每个数字并统计到数组中
int temp = num;
while(temp > 0) {
arr[temp%10]++;
temp /= 10;
}
//4.打印最终结果
for(int i =0; i < arr.length; i++) {
if(arr[i] != 0) {
System.out.println("数字" + i + "出现了" + arr[i] + "次!");
}
}
}
}
/*以下是自己写的代码:
import java.util.Scanner;
public class CountNum {
public static void main(String[] args) {
System.out.print("请输入一个正整数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] arr = new int[10]; //第一次错误把这里写成了 int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
int num1 = 0;
for(;;) {
num1 = num % 10;
num /= 10;
arr[num1]++;
if(0 == num) {
break;
}
}
for(int i =0; i < arr.length; i++) {
if(arr[i] != 0) {
System.out.println("数字" + i + "出现了" + arr[i] + "次!");
}
}
}
}
案例题目
• 提示用户输入学生的人数以及每个学生的考试成绩并打印出来。
• 计算该班级的总分和平均分并打印出来。
/*
编程实现,提示输入人数,再提示输入成绩并打印, 计算班级总分和平均分并打印
*/
import java.util.Scanner;
import java.util.Arrays;
public class ScoreSum {
public static void main(String[] args) {
//1.提示输入学生人数,并记录
System.out.print("请输入学生人数:");
Scanner sc = new Scanner(System.in);
int stnum = sc.nextInt();
int sum = 0;
double ave = 0.00;
//2.根据人数声明对应长度数组负责记录学生的成绩
//变长数组: 变量可以作为数组的长度,但绝不是数组的长度可以改变
int[] arr = new int[stnum];
//3.提示用户输入每个学生的成绩并记录在数组中
for(int i = 0; i < arr.length; i++) {
System.out.print("请输入第" + (i+1) + "名学生的成绩:");
arr[i] = sc.nextInt();
sum += arr[i];
System.out.println("第" + (i+1) + "名学生的成绩是:" + arr[i]);
System.out.println("---------------------------------------------");
}
//4.打印所有学生成绩
System.out.print("本班学生的成绩:");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
System.out.println("---------------------------------------------");
//5.计算总分及平均分
ave = sum / stnum;
System.out.println("班级总分是:" + sum);
System.out.println("班级平均分是:" + ave);
System.out.println("---------------------------------------------");
//6.查找最高分和最低分并打印
System.out.print("本班学生的成绩:" + Arrays.toString(arr));
//调用工具类中的排序方法对所有考试成绩进行从小到大排序
Arrays.sort(arr);
System.out.print("排序后的成绩:" + Arrays.toString(arr));
System.out.println("本班最高分和最低分分别为:" + arr[arr.length-1] + "," + arr[0]);
System.out.println();
System.out.println("---------------------------------------------");
//从数组中查找指定元素所在的下标位置
System.out.println("59分在数组中的下标位置是:" + Arrays.binarySearch(arr,59));
System.out.println("59分在数组中的下标位置是:" + Arrays.binarySearch(arr,60));
}
}
/*
public class ScoreSum {
public static void main(String[] args) {
System.out.println();
System.out.println("---------------------------------------------");
System.out.print("请输入学生人数:");
Scanner sc = new Scanner(System.in);
int stnum = sc.nextInt();
int[] arr = new int[stnum];
int sum = 0;
double ave = 0.0;
System.out.println("---------------------------------------------");
for(int i = 0; i < arr.length; i++) {
System.out.print("请输入第" + (i+1) + "名学生的成绩:");
arr[i] = sc.nextInt();
sum += arr[i];
System.out.println("第" + (i+1) + "名学生的成绩是:" + arr[i]);
System.out.println("---------------------------------------------");
}
ave = sum / stnum;
System.out.println("班级总分是:" + sum);
System.out.println("班级平均分是:" + ave);
System.out.println("---------------------------------------------");
}
}
*/
• java.util.Arrays类可以实现对数组中元素的遍历、查找、排序等操作。
/*
编程实现数组工具类的使用
*/
import java.util.Arrays;
public class ArraysTest {
public static void main(String[] args) {
//1.声明一个初始值为10,20,30,40,50的一位数组
int[] arr1 = {10, 20, 30, 40, 50};
//2.使用原始方式打印数组中的所有元素,要求打印格式为[10,20,30,40,50]
System.out.print("第一个数组中的元素有:[");
for(int i = 0; i < arr1.length; i++) {
//当打印元素是最后一个元素时,则直接打印元素本身即可
if(arr1.length - 1 == i) {
System.out.print(arr1[arr1.length - 1]);
//否则打印元素后打印逗号加空格
} else {
System.out.print(arr1[i] + ", ");
}
}
System.out.print("]");
System.out.println();
System.out.println("---------------------------------------------");
System.out.println();
//3.使用数组工具类实现数组中所有元素的打印
System.out.println("第一个数组中的元素有:" + Arrays.toString(arr1)); //[10, 20, 30, 40, 50]
System.out.println();
System.out.println("---------------------------------------------");
System.out.println();
//4.声明一个长度为5的类型为int的一位数组
int[] arr2 = new int[5];
System.out.println("第二个数组中的元素有:" + Arrays.toString(arr2)); //[0, 0, 0, 0, 0]
//使用数组工具类中的fill实现数组中元素的填充并打印
//表示使用10来填充数组arr2中的每个元素,也就是每个元素被赋值为10
Arrays.fill(arr2,10);
System.out.println("第二个数组中的元素有:" + Arrays.toString(arr2)); //[10, 10, 10, 10, 10]
System.out.println();
System.out.println("---------------------------------------------");
System.out.println();
//5.声明一个长度为5,类型int的数组并初始化
int[] arr3 = new int[5];
Arrays.fill(arr3,10);
System.out.println("第三个数组中的元素有:" + Arrays.toString(arr3)); //
//判断该数组是否与上述数组相等并打印
System.out.println(Arrays.equals(arr2, arr3));
System.out.println();
//修改数组3中的元素
arr3[4] = 20;
System.out.println("第三个数组中的元素有:" + Arrays.toString(arr3)); //
System.out.println(Arrays.equals(arr2, arr3));
System.out.println();
arr2[3] = 20;
System.out.println("第二个数组中的元素有:" + Arrays.toString(arr2));
System.out.println(Arrays.equals(arr2, arr3));
}
}
• 二维数组本质上就是由多个一维数组摞在一起组成的数组,
二维数组中 的每个元素都是一维数组,而一维数组中的每个元素才是数据内容。
• 数据类型[][] 数组名称 = new 数据类型[行数][列数];
• 数据类型[][] 数组名称 = { {元素1, 元素2,...}, ...};
/*
编程实现,二维数组的声明和使用
*/
public class ArrArr {
public static void main(String[] args) {
//1.声明一个2x3的int类型二维数组
int[][] arr1 = new int[2][3];
//打印数组中的每个元素
//使用外层for控制行数
for(int i = 0; i < arr1.length; i++) {
//使用内层for控制打印的列数
for(int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + " ");
}
System.out.println();
}
System.out.println("----------------------------------------------");
//2.实现二维数组中元素的赋值
int cnt = 1;
for(int i = 0; i < arr1.length; i++) {
//使用内层for控制打印的列数
for(int j = 0; j < arr1[i].length; j++) {
arr1[i][j] = cnt++;
}
}
for(int i = 0; i < arr1.length; i++) {
//使用内层for控制打印的列数
for(int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + " ");
}
System.out.println();
}
System.out.println("----------------------------------------------");
//3.二维数组元素的初始化操作
int[][] arr2 = {
{11, 22, 33, 44},{55, 66, 77, 88}};
//使用外层for控制行数
for(int i = 0; i < arr2.length; i++) {
//使用内层for控制打印的列数
for(int j = 0; j < arr2[i].length; j++) {
System.out.print(arr2[i][j] + " ");
}
System.out.println();
}
//4.考点
int[][] arr3 = new int[3][];
arr3[0] = new int[3];
arr3[1] = new int[4];
arr3[2] = new int[5];
}
}
案例题目
• 根据用户输入的行数n输出对应行数的杨辉三角,具体如下:
/*
编程打印杨辉三角
*/
import java.util.Scanner;
public class YHTriangle {
public static void main(String[] args) {
System.out.println("----------------------------------------------");
//1.提示用户输入一个行数并用变量记录
System.out.print("请输入要打印的行数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println("----------------------------------------------");
//2.根据用户输入的行数声明对应二维数组
int[][] arr = new int[n][];
//3.针对二维数组中的每个元素进行初始化,使用双重for
//使用外层for控制行下标
for(int i = 0; i < arr.length; i++) {
//针对二维数组中的每一行进行内存空间的申请
arr[i] = new int[i+1];
//使用内层for控制列下标
for(int j = 0; j <= i; j++) {
//当列下标为0或者下标与当前行的行下标相等时,则对应位置的元素就是1
if(0 == j || i == j) {
arr[i][j] = 1;
} else {
//否则对应位置的元素就是上一行当前列的元素加上上一行前一列的元素
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
for(int i = 0; i < arr.length; i++) {
//使用内层for控制打印的列数
for(int j = 0; j < arr[i].length; j++) {
System.out.printf("%-3d ",arr[i][j]);
}
System.out.println();
}
System.out.println("----------------------------------------------");
}
}
/*
public class YHTriangle {
public static void main(String[] args) {
System.out.println("----------------------------------------------");
System.out.print("请输入要打印的行数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println("----------------------------------------------");
int[][] arr = new int[n][];
for(int i = 0; i < arr.length; i++) {
arr[i] = new int[i+1];
}
for(int i = 0; i < arr.length; i++) {
arr[i][0] = 1;
arr[i][i] = 1;
if(i > 1) {
for(int j = 1; j < i; j++) {
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
for(int i = 0; i < arr.length; i++) {
//使用内层for控制打印的列数
for(int j = 0; j < arr[i].length; j++) {
System.out.printf("%-3d ",arr[i][j]);
}
System.out.println();
}
System.out.println("----------------------------------------------");
}
}
*/