Java数组
1.数组介绍
1.基本介绍
数组可以存放多个同一类型的数据,数组也是一种数据类型,是引用数据类型。
数组主要是对同一类型的数据进行处理
2.简单创建一个数组,代码如下:
int a[] = {1, 2, 3, 4, 5}
Tips:
①我们可以通过a[下标]来访问数组中的元素
②下标是从0开始,比如第一个元素是a[0],第二个元素是a[1]… 依此类推。或者说一个长度为n的数组,它的下标范围是0到n-1。
③我们通过for就可以循环访问数组的元素了。
④可以通过 数组名.length 得到数组的长度。
2.数组的定义1
1.使用方式1 ----- 动态初始化
数组的定义
数据类型 数组名[] = new 数据类型[长度]
或者
数据类型[] 数组名 = new 数据类型[长度]
这两种写法是本质上一样的
代码示例:
int a1[] = new int[5];
int[] a2 = new int[5];
说明:我们定义数组,相当于在内存中开辟了一块空间来存放数组中的元素。
2.数组的引用
我们通过数组名[下标\索引]来引用数组中的元素。
比如你要使用a1数组中的第2个数。代码如下:
System.out.println(a1[1]); // 输出结果为: 0
3.写一个程序,输入五个成绩,并保存到double数组中,并输出。代码如下:
// 声明并开辟空间
double score[] = new double[5];
// 赋值
for (int i = 0;i < score.length;i++){
System.out.println("请输入第"+(i+1)+"位成绩: ");
score[i] = input.nextDouble();
}
// 打印
for (int i = 0;i < score.length;i++){
System.out.println("第"+(i+1)+"位成绩: "+score[i]);
}
3.数组的定义2
1.先声明数组
语法:数据类型 数组名[];
示例:
int a[]; // 这时a是null
2.创建数组:
语法:数组名 = new 数据类型[长度]
示例:
a = new int[5];
3.其实和基本数据类型的先声明再赋值差不多。这里就不写出代码了。
4.数组的定义3
1.语法:数据类型 数组名 = {元素值1,元素值2,元素值3,…}
示例:
int a[] = {1, 2, 3, 4, 5};
这种写法一般用于知道数组中有多少个元素,并且知道具体值是什么。
相当于:
int a[] = new int[5];
a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4; a[4] = 5;
5.数组的细节
1.数组是多个相同类型数据的组合,实现对这些数据的统一管理。代码举例如下:
int arr1[] = {1,2,3,4,1.2,'a'}; // 报错 double -> int, 不会报错char -> int
double arr2[] = {1.2, 1, 2, 3, 4, 5}; // 符合自动类型转换可以编译通过
2.数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。代码举例如下:
String arr3[] = {"hh6879","jack", "tom"};
3.数组创建后,如果没有赋值,有默认值int 0, short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000, boolean false, String null。这里以short为例,代码如下:
short arr4[] = new short[3];
System.out.println("=====数组arr4=====");
for (int i = 0; i < arr4.length; i++){
System.out.println(arr4[i]);
}
输出结果为:
=====数组arr4=====
0
0
0
4.使用数组的步骤1.声明数组并开辟空间 ;2.给数组各个元素赋值; 3.使用数组。说了很多,这里不代码演示。
5.数组的下标是从0开始的。说了很多,这里不代码演示。
6.数组下标必须在指定范围内使用,否则报:下标越界异常,代码举例如下:
int arr5[] = new int[5];
System.out.println(arr5[5]); // 运行报错, 下标越界异常
7.数组属引用类型,数组型数据是对象(Object), 知道就行了
6.数组的传递机制
1.基本数据类型,值是具体的数据,不会相互影响。代码举例:
int num1 = 2; int num2 = num1;
num2 = num2 -1;
System.out.println("num1="+num1); // 输出结果: 2
System.out.println("num2="+num2); // 输出结果: 1
2.数组在默认情况下是引用传递,赋得值是地址。代码举例:
// 数组在默认情况下是引用传递,赋的值是地址,赋值方式为引用传递
// 传的是地址, arr2的变化会影响到arr1
int arr1[] = {1, 2, 3};
int arr2[] = arr1;
arr2[0] =5;
System.out.println("arr1="+ Arrays.toString(arr1)); // 输出结果: arr1=[5, 2, 3]
System.out.println("arr2="+ Arrays.toString(arr2)); // 输出结果: arr2=[5, 2, 3]
3.示意图:
JVM虚拟机粗略划分可以化为三个区:栈,堆,方法区。示意图如下:
7.数组拷贝
既然数组不能直接通过赋值给,那么我们应该如何进行数组拷贝呢?
1.我们可以通过for循环遍历,代码如下:
// 将int[arr1 = {1,2,3}拷贝到 arr2数组,要求数据空间是独立的.
int arr1[] = {1, 2, 3};
// 创建一个新的数组arr2,开辟新的数据空间
// 大小arr1.length;
int arr2[] = new int[arr1.length];
// 遍历arr1 ,把每个元素拷贝到对应的位置
for (int i =0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
arr2[0] = 3;
System.out.println("arr1="+ Arrays.toString(arr1)); // 输出结果: arr1=[1, 2, 3]
System.out.println("arr2="+Arrays.toString(arr2)); //输出结果: arr1=[3, 2, 3]
2.程序自带的方法
int arr3[] = Arrays.copyOf(arr1,arr1.length);
int arr4[] = arr1.clone();
System.out.println("arr3="+ Arrays.toString(arr3)); // 输出结果: arr3=[1, 2, 3]
System.out.println("arr4="+ Arrays.toString(arr4)); // 输出结果: arr4=[1, 2, 3]
8.数组翻转
1.找规律翻转,代码如下:
// 要求:把数组的元素内容反转。
// arr {1,2,3,4,5,6} -> {6,5,4,3,2,1}
//定义数组
int arr[] = {1, 2, 3, 4, 5, 6};
// 1.把arr[0]和arr[5]进行交换{6,2,3,4,5,1}
// 2.把arr[1]和arr[4]进行交换{6,5,3,4,2,1}
// 3.把arr[2]和arr[3]进行交换{6,5,4,3,2,1}
// 4.一共交换3次 = arr.length / 2
// 5.每次交换是,对应的下标 是 arr[i] 和 arr[arr.length - 1 - i]
int temp = 0, len = arr.length;
for (int i = 0 ; i < len / 2;i++) {
temp = arr[len - 1 - i];
arr[len -1 -i] = arr[i];
arr[i] = temp;
}
System.out.println(Arrays.toString(arr)); // 输出结果: [6, 5, 4, 3, 2, 1]
2.逆序赋值法, 代码如下:
// 1.先创建一个新的数组 arr2, 大小 arr.length
int arr2[] = new int[arr.length];
// 2.逆序遍历arr, 讲 每个元素拷贝到 arr2的元素中(顺序拷贝)
for (int i = arr.length-1,j = 0;i >= 0;j++, i--){
arr2[j] = arr[i];
}
arr = arr2; // 使原来的数组不被指向,释放空间,垃圾回收。
System.out.println(Arrays.toString(arr2)); // 输出结果: [6, 5, 4, 3, 2, 1]
9.数组扩容
实际上是通过新的数组来进行扩容在写完后,重新指向,代码如下:
// 创建Scanner用于接受数据
Scanner input = new Scanner(System.in);
// 1.定义初始数组int arr[] = {1,2,3} // 下标0-2
int arr[] = {1,2,3};
do {
// 2.定义一个新的数组int arrNew[] = new int[arr.length + 1]
int arrNew[] = new int[arr.length + 1];
// 3.遍历arr数组, 依次将arr的元素拷贝到arrNew数组中
for (int i =0; i < arr.length;i++) {
arrNew[i] = arr[i];
}
System.out.println("请输入你要添加的元素: ");
int addNum = input.nextInt();
// 4.将addNum赋给arrNew[ arrNew.length - 1]
arrNew[arrNew.length - 1] = addNum;
// 5.让arr指向arrNew
arr = arrNew; // 原来的数组就被销毁了
// 问用户是否继续
System.out.println("请选择是否继续(y/n)");
char re = input.next().charAt(0);
if (re == 'n'){
break;
}
}while (true);
// 显示扩容结果
System.out.println(Arrays.toString(arr));
10.数组缩减
也是一样,通过建立新的数组来完成数组缩减。不过要注意长度只能减到1就不能在减了。代码如下:
Scanner input = new Scanner(System.in);
int arr[] = {1, 2, 3, 4, 5};
do {
// 判断数组长度能不能进行缩减,不行跳出循环
if (arr.length == 1){
System.out.println("不能在缩减了");
break;
}
// 定义一个新的数组int arrNew[] = new int[arr.length - 1]
int arrNew[] = new int[arr.length - 1];
// 遍历arr数组, 除了最后一个元素,依次将arr的元素拷贝到arrNew数组中
for (int i =0 ;i < arrNew.length;i++) {
arrNew[i] =arr[i];
}
// 让arr指向arrNew
arr = arrNew; // 原来的数组就被销毁了
// 问用户是否继续
System.out.println("请输入是否继续(y/n)");
char re = input.next().charAt(0);
if (re == 'n') {
break;
}
}while (true);
// 打印缩减结果
System.out.println(Arrays.toString(arr));
11.二维数组
多维数组其实就是二维数组的延申,所以只讲二维数组,不讲多维数组,按照二维数组推多维数组就行了。
1.介绍
① 二维数组从定义上,int[][];
②我们也可以这样理解,二维数组的每个元素都是一个一维数组。这些一维数组构成了二维数组
Tips:
①二维数组的元素的个数可以通过数组名.length调用出来。代码如下:
// (1)二维数组的元素的个数
System.out.println("二维数组的元素的个数= "+ arr.length);
②二维数组的每个元素是一维数组, 所以如果需要得到每个一维数组的值,还需要再次遍历。代码如下:
// for循环打印二维数组
for ( int i = 0; i < arr.length; i++){
for (int j = 0; j < arr[0].length; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
③如果我们要访问第 (i+1) 个一维数组的第(j+1)个值。那么我们就应该 arr[i][j]来调用元素。代码如下:
// 举例访问3 访问第3个一维数组的第4个值 arr[2][3]
System.out.println(arr[2][3]);
12.二维数组的定义
与一维数组一样也是那三种,这里就不详细些说了。
13.二维数组的细节
1.一维数组的声明方式有:
int[] x或者int x[]
2.但是二维数组的声明方式有:
int[][] y或者int[] y[]或者int y[][]
3.二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。
比如:map[][]是一个二维数组map [][]= {{1,2},{3,4,5}}
map由map[0]是一个含有两个元素的一维数组,和map[1]是一个含有三个元素的维数组构成,我们也称为列数不等的二维数组。代码如下:
int map[][]= {{1,2},{3,4,5}};
System.out.println("map[0]的长度为: "+map[0].length); // 输出结果: map[0]的长度为: 2
System.out.println("map[1]的长度为: "+map[1].length); // 输出结果: map[1]的长度为: 3