理解java数组的内部机制

我们知道,数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的,下面介绍数组在内存中的运行机制。

1.内存中的数组

数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可以通过该数组变量来访问数组元素,因为,引用变量是访问真实对象的根本方式。也就是说,如果我们希望在程序中访问数组,则只能通过这个数组的引用变量来访问它。而实际的数组元素被存储在堆(Heap)内存中,引用变量则被存储在栈(Stack)内存中。

当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会被逐个存入这块栈内存里,当方法执行结束,这个方法的内存栈也就自然被销毁了。所以在所有方法中定义的变量都是存放在内存栈里的;当我们在内存中创建一个对象时,这个对象将被保存在“运行时数据区中”,以便于反复利用,这是因为对象的创建成本通常较大,这个运行时数据区就是堆内存,对内存中的对象不会随着方法的结束而销毁,只有当一个对象没有任何引用变量引用它的时候,系统的垃圾回收机制才会在合适的时候回收它。

如果堆内存中数组不再有任何变量引用指向自己,那么这个数组将成为垃圾,它所占的内存将会被系统的垃圾回收机制所回收。

这里要注意的一点是:在java中,只要类型相互兼容,可以让一个数组变量指向另一个实际的数组,好多人在这儿会认为java数组的长度可变,其实只是这种机制让人产生的错觉。

所以当我们在看待数组的时候,应该把数组看成两个部分:一个是数组引用,也就是在代码中定义的引用变量,另外一个就是实际数组本身,这个部分是在系统内存里的,我们通常无法直接访问它,只能通过数组引用变量来访问。

2.数组元素的初始化

如下列代码:

public class ShuZu{

public static void main(String[] args){

int[] iArr;

iArr = new int[5];

for(int i=0;i<iArr.length;i++){

iArr[i] = i + 10;

}

}

}

上述程序中,首先定义了一个int类型的数组引用变量,当执行 int[] iArr; 后,只是在栈内存中定义了一个空引用,这个引用并未指向任何有效的内存,因此也就无法指定数组的长度,当执行  “iArr = new int[5];”  实现动态初始化后,系统将负责为该数组分配内存空间,并分配默认的初始值,所有数组元素都被默认赋为0。

时间: 2024-08-08 22:03:13

理解java数组的内部机制的相关文章

【深入理解Java虚拟机】类加载机制

本文内容来源于<深入理解Java虚拟机>一书,非常推荐大家去看一下这本书. 本系列其他文章: [深入理解Java虚拟机]Java内存区域模型.对象创建过程.常见OOM [深入理解Java虚拟机]垃圾回收机制 1.类加载机制概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在java中,类型的加载.连接和初始化过程都是在程序运行期间完成的,这种策略虽然会带来一些性能开销,但是却为jav

Java千问:七个问题帮助初学者深入理解Java数组

几乎所有的高级语言当中,都提供了一种叫做"数组"的东西,Java语言当然也不例外.我们通过数组可以很方便的存储和管理一组数据.因为在Java语言当中使用数组非常的方便,所以导致很多初学者忽略了对数组的深入学习,本文就通过七个问题,来帮助初学者深入理解一下Java语言的数组到底是怎么回事. 一.数组是变量的简单叠加吗? 我们在学习Java的时候,知道一个int类型的变量可以存储一个整数,而一个int类想的数组可以存储多个整数.于是很多人认为数组只不过是变量的简单叠加而已,无非是变量存1个

深入理解 Java 数组

目录   1. 简介  2. 声明数组  3. 创建数组  4. 访问数组  5. 数组的引用  6. 泛型和数组  7. 多维数组  8. Arrays 类  9. 小结  10. 参考资料 ?? 本文已归档到:「javacore」 ?? 本文中的示例代码已归档到:「javacore」 1. 简介 1.1. 数组的特性 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同.几乎所有程序设计语言都支持数组. 数组代表一系列对象或者基本数据类型,所有相同的类型

全面理解Java异常的运行机制

1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. <span style="">package Test; public class TestException { pu

深入理解java同步、锁机制

本片文章尝试从另一个层面来了解我们常见的同步(synchronized)和锁(lock)机制.如果读者想深入了解并发方面的知识推荐一本书<java并发编程实战>,非常经典的一本书,英语水平好的同学也可以读一读<Concurrent programming in Java - design principles and patterns>由Doug Lea亲自操刀,Doug Lea是并发方面的大神,jdk的并发包就是由他完成的. 我们都知道在java中被synchronized修饰的

一张图,理解JAVA体系结构、运行机制、JVN运行机制、Java平台(初学)

初学JAVA,学一门语言不仅仅是学其语法,逻辑思维能力,还有每一门语言都有自己独特的一方面,所以才有那么多语言要学啊 = =,所以想要真的学好语言,其编译机制,运行机制多少也要涉猎一些啊.这是初学JAVA一些机制的理解,如果有哪里不妥当,请指教.

深入理解Java虚拟机—内存管理机制

前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思了.下面让我们来详细介绍下这五部分: 运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都拥有自己的用途,并随着JVM进程的启动或者用户线程的启动和结束建立和销毁. 先让我们了解下进程和线程的区别: 进程是资源分配的最小单位,线程是程序执行的

如何理解java中的反射机制,为什么利用反射可以写开源框架?(1)

当诸君在使用idea或者eclipse/vscode等代码编辑器时,有没有想过当你在字符串后面或者一个类实例后输入.的时候 后面跟随出来的字符串方法以及类内方法调用是怎样给出提示的? The answer is 反射. 反射的具体介绍 程序可以访问,检测和修改它本身状态或行为的能力,即自描述和自控制. 可以在运行时加载,探知和使用编译期间完全未知的类. 给Java插上动态语言特性的翅膀,弥补强类型语言的不足. java.lang.reflect包,在Java2时代就有,在Java5得到改善. 反

深入理解Java虚拟机-----------虚拟机类加载机制

虚拟机类加载机制 类从被加载到虚拟机内存开始,到卸载出内存为止,整个生命周期包括:加载,验证,准备,解析,初始化,使用,卸载等7个阶段.其中,验证,准备,解析3个部分称为连接. 以上7个阶段中,加载,验证,准备,初始化和卸载五个阶段的顺序是确定的,类的加载过程必需按照这种顺序按部就班的开始(开始并不意味着按部就班的"进行"或"完成",因为这些阶段通常是互相交叉地混合式进行的).而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运