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



目录
相关文章
|
19天前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
28天前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
31 4
|
28天前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
22 2
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
24 3
|
1月前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
46 9
|
1月前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
19 1
|
1月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
23 3
|
1月前
|
存储 Java 程序员
【一步一步了解Java系列】:何为数组,何为引用类型
【一步一步了解Java系列】:何为数组,何为引用类型
23 1
|
1月前
|
存储 XML Java
如何在 Java 中将常见文档转换为 PNG 图像数组
如何在 Java 中将常见文档转换为 PNG 图像数组
14 1
下一篇
无影云桌面