Java 数组内容笔记
1.一维数组基本概念
- 当需要记录多个类型相同的数据内容时,则声明一个一维数组即可,一维数组本质上就是在内存空间中申请一段连续的存储空间
- 数组是相同类型的多个元素的容器,元素是线性顺序排列,在Java中属于引用数据类型
2.一维数组的声明方式
-
数据类型[] 数组名称= new 数据类型[数组的长度];
-
数组.length可以获取数组的长度
-
通过索引或下标访问数组中的每一个元素(0 ~ n - 1)
-
基本类型的数组(数据元素为基本类型)创建后,其元素的初始值:
- byte、short、char、int、long为0
- float和double为0.0
- boolean为false
-
数组声明的种类:
-
动态数组:声明数组时没有初始化数据元素,保留默认值
-
静态数组:在声明数组时初始化数据元素
-
静态数组精简版
// 静态数组-简化版 char[] arr4 = {'a', 'b', 'c'}; for(int i = 0; i < arr4.length; i++) { System.out.println("THe index " + i + " : " + arr4[i]); }
-
静态数组标准版
// 静态数组-标准版 boolean[] arr5 = new boolean[]{true, false, true}; for(int i = 0; i < arr5.length; i++) { System.out.println("THe index " + i + " : " + arr5[i]); }
-
-
3.内存结构分析
-
int[] arr1 = new int[2]; // 对此语句进行分析,与一般定义一个变量进行类比,左侧相当于在内存中申请了一块内存空间,而右边的new也是申请了一块内存空间,进而分析两个部分
-
内存结构之栈区
- 栈用于存放程序运行过程当中所有的局部变量。一个运行的Java程序从开始到结束会有多次变量的声明。
- 局部变量:在方法体中直接声明的变量就叫局部变量
- 块变量:{ }或()中声明的变量叫做块变量
-
内存空间之堆区
- JVM会在其内存空间中开辟一个称为“堆”的存储空间,这部分空间用于存储使用new关键字创建的数组和对象。
自我总结:
-
在内存空间中为数组申请内存空间时,栈区存放堆区中通过new为数组申请的内存空间的地址,而堆区中才是真正存放数组的地方
-
基本数据类型在栈区中存放的是具体的数据内容,而像数组这些引用数据类型在栈区存放的是堆区中数组的内存地址
-
数组名仅仅代表的是数组的内存地址
4.数组的优缺点
- 优点:
- 可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快。
- 缺点:
- 数组要求所有元素的类型相同。
- 数组要求内存空间必须连续,并且长度一旦确定就不能修改。
- 增加和删除元素时可能移动大量元素,效率低。
5.考点
-
// 将arr1和arr2指向了堆区中同一块内存空间, arr2 = arr1; // 数组名只是记录堆区的内存空间 // arr2原来对应的堆区的内存空间就没有指向,就会丢失,根据JVM的自动垃圾回收机制,会自动扫描没有指向的内存空间,进行回收操作
-
变长数组
// 变长数组,主要指变量可以作为数组的长度,而不是说数组的长度可以变化 int[] scores = new int[num];
6.数组的工具类
-
java.util.Arrays类
-
可以实现对数组中元素的遍历、查找、排序等操作
-
toString()
-
int[] arr1 = new int[]{10, 20, 30, 40, 50}; // 可以实现对数组元素的遍历 System.out.println("第一个数组的元素有:" + Arrays.toString(arr1));
-
-
fill()
-
int[] arr2 = new int[5]; Arrays.fill(arr2, 10);
-
-
equals()
-
System.out.println("arr1, arr2数组是否相同:" + Arrays.equals(arr1, arr2));
-
-
sort()
-
int[] arr3 = new int[]{10, 50, 30, 20, 40}; // 默认升序排列 Arrays.sort(arr3); // 会直接修改原数组的值
-
-
binarySearch()
-
System.out.println("30在arr3数组中的下标是:" + Arrays.binarySearch(arr3, 30));
-
-
7.二维数组
- 二维数组本质上就是由多个一维数组摞在一起组成的数组,二维数组中的每个元素都是一维数组,而一维数组中的每个元素才是数据内容。
- 一维数组的长度(length)是元素的个数,二维数组的长度(length)是二维数组的行数,二维数组[n].length是二维数组第(n-1)行的列数
8.二维数组的声明和初始化
-
数据类型[][] 数组名称= new 数据类型[行数][列数];
-
// 1.声明一个int类型的两行三列二维数组 int[][] arr1 = new int[2][3];
-
-
数据类型[][] 数组名称= {{元素1, 元素2,...}, ...};
-
// 第一种初始化-标准型 int[][] arr2 = new int[][]{{1, 2, 3}, {4, 5, 6}}; // 第二种初始化-精简型 int[][] arr3 = {{1, 2, 3}, {4, 5, 6}};
-
-
// 创建二维数组必须要指定行或者行列都指定,不能单纯指定一个列 int[][] arr1 = new int[1][]; //int[][] arr2 = new int[][1]; int[][] arr3 = new int[1][1];
9.二维数组的考点
二维数组在底层并不是呈梯形存储,而依然是类似于一维数组式的存储,所以二维数组只给定行数也没有关系,不影响数组在底层的存储。
// 4.二维数组考点
int[][] arr4 = new int[3][];
arr4[0] = new int[3];
arr4[1] = new int[4];
arr4[2] = new int[5];
层并不是呈梯形存储,而依然是类似于一维数组式的存储,所以二维数组只给定行数也没有关系,不影响数组在底层的存储。
// 4.二维数组考点
int[][] arr4 = new int[3][];
arr4[0] = new int[3];
arr4[1] = new int[4];
arr4[2] = new int[5];