🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈
本期内容讲解数组的知识,你真的了解数组吗?通过本期内容的讲解,我们将会对Java中的数组有一个全面的了解,一起来看看吧!
文章目录
1. 数组的定义和使用
1.1 数组的定义
1.1.1数组使命
数组的使命:用来存储一组相同数据类型的数据
1.1.2 怎么存数组?
连续内存
1.2 数组的创建与初始化
1.2.1 数组的创建
T[] 数组名 = new T[N];
T:代表数组中存放数据的类型,如int、double、String等等
T[]:代表数组类型
N:代表数组的长度
举个例子~
int[] array1 = new int[15];
这就创建完成啦,代表创建了一个可以容纳15个int类型元素的数组
1.2.2 数组的初始化
以下为定义数组的三种方式:
Java当中的数组其实就是一个对象,记住:Java当中一切皆对象
【注意事项】
1)如果数组中存储元素类型为引用类型,默认值为null
如果数组中存储元素类型为int类型,默认值为0,
如果数组中存储元素类型为boolean类型,默认值为false
2)方式1不可以分两步写,方式2、3可以
编译会报错!!,下面就会报错!
int[] array;
array = {1,2,3,4,5,6}
1.3 数组的使用
1.3.1 数组元素的访问
数组的内存是一段连续的空间,下标从0开始,通过下标访问数组任意位置的元素
int[]array = new int[]{33, 44, 40, 66, 78};
System.out.println(array[0]);
System.out.println(array[1]);
//注意不要越界,最大下标为数组长度-1
//数组中的元素进行修改
array[0] = 100;
System.out.println(array[0]);
注意:不要越界!
1.3.2数组元素的遍历
有两种遍历数组的方式
1.数组长度
int[]array = new int[]{33, 44, 40, 66, 78};
for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}
array.length是该数组的长度
Q:为什么可以这样呢?
A:Arrays是一个类,调用它的属性length
补充知识:
打印数组1-5
public class Main {
public static void main(String[] args) {
int[] array = new int[5];
for(int i = 0; i < array.length;i++) {
array[i] = i+1;
}
System.out.println(Arrays.toString(array));
}
}
2.for-each遍历
int[]array = new int[]{33, 44, 40, 66, 78};
for (int x : array) {
System.out.println(x);
}
2. 类型及内存介绍
2.1 JVM内存分布
内存:一段连续的存储空间,主要用来存储程序运行时数据的。比如:
1.程序运行代码需要加载到内存中
2. 程序运行产生的中间数据要存放在内存
3. 程序中的常量保存等等
JVM对所使用的内存按照功能的不同进行划分,如下图所示:
程序计数器: 很小的空间,保存下一条执行指令地址
虚拟机栈: 方法调用相关,方法执行创建栈帧
本地方法栈: 与虚拟机栈作用类似,保存Native方法的局部变量
堆: new创建的对象保存在这里
方法区: 方法编译出的字节码保存在这个区域
2.2 基本、引用类型变量区别
基本数据类型变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
引用数据类型变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址
public static void fun1() {
int a = 33;
int[] array = new int[]{1,2,3,4};
画出上述变量的内存分配图,如!下:
由上图可以得出:
引用变量不直接存储对象本身,存储是对象在堆中空间起始地址,通过该地址,引用变量可以去操作对象
2.3 null注意事项
int[] array = null;
代表array这个引用不指向任何对象
1> null 在 Java 中表示 “空引用” ,表示一个不指向对象的引用,即一个对象为空,则不能对其进行操作,否则会抛出NullPointerException异常
2> null 的作用类似于 C 语言中的 NULL (空指针),都表示一个无效的内存位置
注意: Java 中没有约定 null 和 0 号地址的内存有任何关联,不能直接加上我们的主观想法,认为null就是存0号地址的
2.4 引用变量注意事项
2.4.1 等号的理解
下面我们先看看这段代码输出的结果是夺少?
public static void main(String[] args) {
int[] array1 = {22,43,56,77};
array1[0] = 11;
int[] array2 = array1;
array2[0] = 88;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
下面画出这段代码的内存分配图,我们可以清晰得分析出结果:
所以输出结果都为[88,43,56,77]
【注意】
1> int[] array2 = array1;
代表array2这个引用指向了array1这个引用所指向的对象
2> 通过其中任何一个引用修改这个对象的值,另一个引用quiz访问的时候,也是会被改变的
【总结】
1> 局部变量(方法内部定义的变量)内存在栈上开辟
2> 基本变量在内存放的是值,引用变量放的是对象的地址
3> 在Java当中局部变量在使用的时候,必须初始化!!!
2.4.2 传递的理解
下面看看这两段代码,可以自己先想想会输出什么结果!
public static void main(String[] args) {
int[] array1 = {22,43,56,77};
func1(array1);
System.out.println(Arrays.toString(array1));
}
public static void func1(int[] array) {
array[0] = 88;
}
通过上图分析得,输出结果为:[88,43,56,77]
再来分析这一段代码,先想想会输出什么吧~
public static void main(String[] args) {
int[] array1 = {22,43,56,77};
func2(array1);
System.out.println(Arrays.toString(array1));
}
public static void func1(int[] array) {
array = new int[] {5,7,8};
}
通过上图分析得,输出结果为:[22,43,56,77]
【总结】
当数组作为参数进行传递的时候,其实还是按值传递的,只不过测试的值是一个地址!!!
那么会出现两种情况:
1> 形参修改指向
【array = new int[] 只会影响形参指向】
2> 形参修改指向
【array[0] = 100 才会影响实参】
3. 数组的应用
3.1 保存数据
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
for(int i = 0; i < array.length; i++){
System.out.println(Array.toString(array));
}
}
3.2 作为函数参数
作为函数参数,既可以传基本数据类型,也可以传引用数据类型
传基本数据类型,改变形参的值,不改变实参
传引用数据类型,方法内部修改数组的内容, 方法外部的数组内容也发生改变
【因为数组是引用类型,按照引用类型来进行传递,可以修改其中存放的】
3.3 作为返回值
public static void main(String[] args) {
int[] array = func;
System.out.println(Array.toString(array));
}
public static int[] func() {
int[] array1 = {5, 7, 8};
return array1;
}
return了一个地址,仅此而已
4. 二维数组
二维数组是特殊的一维数组,Java将这一点诠释得非常好,下面我们一起来看看二维数组
4.1 二维数组的定义
数据类型[][] 数组名 = new 数据类型 [行数][列数] { 初始化数据 };
int[][] arr = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11,12}};
【注意】Java中必须定义行数,可以不定义列数,每行列数可以不同,不一样为不规则列表
int[][] array = new int[2]; //定义二维数组array,行数为2
array[0] = new int[3]; //定义二维数组的第一行有3列
array[1] = new int[4]; //定义二维数组的第一行有3列
以上为不规则二维数组定义
4.2 遍历二维数组
这里介绍5种:
1> 每行遍历
public static void main(String[] args) {
int[][] array = {22,43},{44,45}};
System.out.println(Arrays.toString(array[0]));
System.out.println(Arrays.toString(array[1]));
}
2> 双重for循环
public static void main(String[] args) {
int[][] array = {22,43},{44,45}};
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
System.out.print(arrat[i][j]+" ");
}
System.out.println();
}
}
3> length
public static void main(String[] args) {
int[][] array = {22,43},{44,45}};
for(int i = 0; i < array.lenth; i++) {
for(int j = 0; j < array[i].lenth; j++) {
System.out.print(arrat[i][j]+" ");
}
System.out.println();
}
}
4> for-each
public static void main(String[] args) {
int[][] array = {22,43},{44,45}};
for(int[] ret : array) {
for(int x : ret) {
System.out.print(x+" ");
}
System.out.println();
}
}
5>deepToString
public static void main(String[] args) {
int[][] array = {22,43},{44,45}};
System.out.println(Arrays.deepToString(array));
}
本期内容到此结束啦!有没有觉得收获颇多呢~学好数组,我们需要多画图帮助我们理解,画内存如何分配,就很清晰明了啦!下期见,一起继续加油吧