Java入门超经典内部教程-数组

Java入门超经典内部教程-数组叩丁狼教育Java基础教程1.数组1.1.JVM内存模型叩丁狼教育Java基础教程JVM内存划分。方法区:线程共享的内存区域,存储已被虚拟机加载

大家好,欢迎来到IT知识分享网。

Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

1. 数组

1.1. JVM内存模型(掌握)

Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

JVM内存划分,人为的根据不同内存空间的存储特点以及存储的数据。

  • 程序计数器:当前线程所执行的字节码的行号指示器。
  • 本地方法栈:为虚拟机使用的native方法服务。
  • 方法区:线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量即时编译器编译后的代码数据等(这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载)。
  • Java虚拟机栈:简称栈,每个方法被执行的时候都会同时创建一个栈帧用于存储该方法的局部变量、操作栈、动态链接、方法出口等信息。每当调用一个方法时,创建一个栈帧,存放了当前方法的局部变量,当方法调用完毕,该方法的栈帧就被销毁了。
  • Java堆:被所有线程共享的一块内存区域,在虚拟机启动时创建。所有的对象实例以及数组都要在堆上分配。每次使用new关键字,就表示在堆内存中开辟一块新的存储空间。

GC(Garbage Collection),垃圾回收器。

Java的自动垃圾回收机制可以简单理解为,不需要程序员手动的去控制内存的释放。当JVM内存资源不够用的时候,就会自动地去清理堆中无用对象(没有被引用到的对象)所占用的内存空间。

1.2. 数组定义(重点)

1.2.1. 什么是数组(了解)

在之前我们可以通过一个变量表示一个学生的年龄,如果现在需要表示全班100个人的年龄岂不是需要定义100个变量来分别表示。这样的操作太麻烦了,为了解决这种问题,Java就提供了数组。

所谓数组,把具有相同类型的多个常量值有序组织起来的一种数据形式。这些按一定顺序排列的多个数据称为数组。而数组中的每一个常量值称之为数组元素,数组中使用索引来表示元素存放的位置,索引从0开始,步长是1,有点像Excel表格的行号。

Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

1.2.2. 定义语法(重点)

回忆定义变量的语法:

数据类型 变量;如intage;

数组的定义语法:

数组元素类型[] 数组名; 如int[] ages;另一种方式:int ages[];不推荐

可以把int[]看成是一种数据类型——int类型的数组类型。

int[] 数组可以看出,该数组中的元素类型是int类型的。

String[] 数组可以看出,该数组中的元素是String类型的。

1.3. 数组的初始化(重点)

数组在定义后,必须初始化才能使用。所谓初始化,就是在堆内存中给数组分配存储空间,并为每一个元素赋上初始值,有两种方式:

  • 静态初始化;
  • 动态初始化;

无论以哪种,一旦初始化完成,数组的长度(元素的个数)就固定了,不能改变,除非重新对该初始化,也就是说数组是定长的。

一般,如果我们事先知道元素是多少,选用静态初始化,事先不知道元素是多少,选用动态初始化。

1.3.1. 静态初始化(重点)

程序员直接为每一个数组元素设置初始化值,而数组的长度由系统(JVM)决定。

语法:数组元素类型[] 数组名 = new 数组元素类型[]{元素1,元素2,元素3,…….};

int[] nums = new int[]{1,3,5,7,9};

简单写法:

int[] nums = {1,3,5,7,9};//简单写法,定义和初始化必须同时写出来

1.3.2. 静态初始化内存分析(重点)

public class ArrayDemo1{

public static void main(String[] args) {

//定义并初始化数组

int[] nums = new int[] { 1, 3, 5, 7 };

System.out.println(“数组长度=” + nums.length);

//重新初始化数组

nums = new int[] { 2, 4, 8 };

System.out.println(“数组长度=” + nums.length);

}

}

对上述代码做内存分析

int[] nums = new int[] { 1, 3, 5, 7 };

这一行代码,确实可以分成三步:

  • 在堆内存中开辟一块空间,用来存储数组数据:new int[] { 1, 3, 5, 7 }
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

  • 在栈中开辟一块空间nums
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

  • 把堆空间表示数组的内存地址赋给nums
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

这种把内存地址赋给一个变量,也被称之为引用关系(为了更清晰有人习惯画一根箭头来表示这种关系),也就是说nums变量引用了堆中某一块内存地址,当操作nums变量的时候,其实底层操作的是nums所引用内存地址里面的数据。好比遥控板和电视机的关系,因为遥控板和电视机之间有一个引用关系,表面上操作的是遥控板,其实操作的是电视机。

Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

所以此时,通过nums.length代码来查看nums数组中有几个元素,结果很明显是4。

nums = new int[] { 2, 4, 8 };

  • 因为存在new,说明又会在堆空间开辟一块新的空间,赋初始值。
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

  • 并把内存地址重新赋给nums变量,nums原来所引用的地址将被覆盖掉。
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

所以此时,通过nums.length代码来查看nums数组中有几个元素,结果很明显是3。

注意:此时地址为0x1234的内存空间没有被任何变量所引用,所以该空间就变成了无用的垃圾,就等着垃圾回收器回收该空间。

如果存在一行代码,如下:

nums = null;

null表示不再引用堆中的内存空间,那么此时nums就好比是没有初始化的,不能使用。

1.3.3. 动态初始化(重点)

程序员只设置数组元素个数,而数组的元素的初始值由系统(JVM)决定。

语法:数组元素类型[] 数组名 = new 数组元素类型[length];

int[] nums = new int[5];

不能同时指定元素值和数组长度,反例如下:

int[] nums = new int[5]{1,3,5,7,9};

不同数据类型的初始值:

Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

int[] arr1 = new int[3];int类型数组,每一个元素的初始值为0

double[] arr2 = new double[5];double类型数组,每一个元素初始值为0.0

String[] arr3 = new String[2];String类型数组,每一个元素的初始值为null

1.3.4. 动态初始化内存分析(重点)

public class ArrayDemo2 {

public static void main(String[] args) {

//定义并初始化数组

int[] nums = new int[4];

System.out.println(“数组长度=” + nums.length);

//重新初始化数组

nums = new int[5];

System.out.println(“数组长度=” + nums.length);

}

}

这一行代码,确实可以分成三步:int[] nums = new int[4];

  • 在堆内存中开辟一块空间,用来存储数组数据
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

  • 在栈中开辟一块空间nums
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

  • 把堆空间表示数组的内存地址赋给nums
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

所以此时,通过nums.length代码来查看nums数组中有几个元素,结果很明显是4。

nums = new int[3] ;

  • 因为存在new,说明又会在堆空间开辟一块新的空间,赋初始值。
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

  • 并把内存地址重新赋给nums变量,nums原来所引用的地址将被覆盖掉。
Java入门超经典内部教程-数组

叩丁狼教育Java基础教程

所以此时,通过nums.length代码来查看nums数组中有几个元素,结果很明显是3。

本系列教程为叩丁狼Java基础班内部教材,若要获得最好的学习效果,需要配合对应教学视频一起学习。需要教学视频,请私信作者即可。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/83734.html

(0)
上一篇 2024-09-19 16:45
下一篇 2024-09-19 19:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信