Java-数组的定义和使用(中)

简介: Java-数组的定义和使用(中)

二、数组是引用类型



       2.1初始JVM的内存分布


       内存是一段连续的存储空间,主要用来存储程序运行时的数据,例如:程序运行时代码需要加载到内存;程序运行产生的中间数据要存放在内存;程序中的常量也要保存;有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁。如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦,故JVM也对所使用的内存按功能不同进行划分。


00e7f621e4724ef0978b7cc15e4b4290.png

              方法区和堆是由所有线程共享的数据区,而虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。


              程序计数器 : 只是一个很小的空间, 保存下一条执行的指令的地址

              虚拟机栈: 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁。


               本地方法栈: 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的。


              堆: JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。

              方法区: 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据, 方法编译出的的字节码就是保存在这个区域。


       2.2 基本类型变量和引用类型变量


 基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址

public static void func() {
                int a = 10;
                int b = 20;
                int[] arr = new int[]{1,2,3};
        }

             a、b、arr,都是函数内部的变量,故其空间都在main方法对应的栈帧中分配,a、b是内置类型的变量,故其空间中保存的就是给该变量初始化的值,array是数组类型的引用变量,其内部保存的内容是数组在堆空间中的首地址。引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。

ac01f9a19656402aab11572482a497ad.png


       2.3引用变量


 

public static void func() {
                int[] array1 = new int[3];
                array1[0] = 10;
                array1[1] = 20;
                array1[2] = 30;
                int[] array2 = new int[]{1,2,3,4,5};
                array2[0] = 100;
                array2[1] = 200;
                array1 = array2;
                array1[2] = 300;
                array1[3] = 400;
                array2[4] = 500;
                for (int i = 0; i < array2.length; i++) {
                System.out.println(array2[i]);
                }
        }

95035a5edcd14031a864e252edaf03a2.png

a46cafd0700b436893be1ce754219aae.png


       2.4 null


               null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用。null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作。


int[] arr = null;
        System.out.println(arr[0]);

1b3c1cb772534bda84d0259e9b45b095.png


三、数组的应用场景



     3.1保存数据

   

public static void main(String[] args) {
                int[] array = {1, 2, 3};
                for(int i = 0; i < array.length; ++i){
                System.out.println(array[i] + " ");
                }
        }

85c8471b74cb469b8f918468274cea73.png


     3.2作为函数的参数


       1.参数传基本数据类型


 

public static void main(String[] args) {
                int num = 0;
                func(num);
                System.out.println("num = " + num);
        }
        public static void func(int x) {
                x = 10;
                System.out.println("x = " + x);
        }

2481016891094a4bbee16f1ab26ef695.png647db3c5271749699d889756b20910d9.png


       2.参数传数组类型(引用数据类型)


   

public static void main(String[] args) {
                int[] arr = {1, 2, 3};
                func(arr);
                System.out.println("arr[0] = " + arr[0]);
        }
         public static void func(int[] a) {
                a[0] = 10;
                System.out.println("a[0] = " + a[0]);
        }

094767c054094ec980de1fa2073d7c1d.png

369a72c73edb4c899187d11436a3a715.png

               总结: 所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中。


    3.3 作为函数返回值


       示例 求斐波那契数列前N项

public static int[] fib(int n){
                if(n <= 0){
                return null;
                }
                int[] array = new int[n];
                array[0] = array[1] = 1;
                for(int i = 2; i < n; ++i){
                array[i] = array[i-1] + array[i-2];
                }
               return array;
        }
        public static void main(String[] args) {
                int[] array = fib(10);
                for (int i = 0; i < array.length; i++) {
                System.out.println(array[i]);
                }
        }

7a317bdddeb54ee3bf156dd0419516b1.png



目录
相关文章
|
6天前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
8天前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
13 3
|
14天前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
38 9
|
10天前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
14 1
|
12天前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
14 3
|
17天前
|
存储 算法 Java
Java一分钟之-数组的创建与遍历
数组作为Java中存储和操作一组相同类型数据的基本结构,其创建和遍历是编程基础中的基础。通过不同的创建方式,可以根据实际需求灵活地初始化数组。而选择合适的遍历方法,则可以提高代码的可读性和效率。掌握这些基本技能,对于深入学习Java乃至其他编程语言的数据结构和算法都是至关重要的。
19 6
|
13天前
|
存储 Java 程序员
【一步一步了解Java系列】:何为数组,何为引用类型
【一步一步了解Java系列】:何为数组,何为引用类型
19 1
|
14天前
|
存储 XML Java
如何在 Java 中将常见文档转换为 PNG 图像数组
如何在 Java 中将常见文档转换为 PNG 图像数组
12 1
|
25天前
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
|
6天前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
24 0