配色: 字号:
part1-数组及其内存管理
2018-06-23 | 阅:  转:  |  分享 
  
数组及其内存管理数组初始化:当数组的所有元素都(1)被分配了合适的内存空间,(2)并指定了初始值时,数组初始化完成,程序以后将不能重新改变数
组对象在内存中的位置和大小。数组初始化如果程序需要多个类型相同的变量时,就可以考虑定义一个数组。Java数组是静态的首先要明确静态
的特点就是不可变,因此Java中的数组在初始化后,就不可以改变了。而js中的数组是动态的,即可变的。在scala中存在定长数组和变
长数组。数组在内存中的分配定义3个数组:StrArr、names、books(1)初始化过程中数组的内存分配:在初始
化过程为:在堆内存中为3个数组分别分配空间,然后将堆内存的地址发送给栈,栈在接受到地址后,就会执行堆中相应的实例(对象)。(2)3
个数组相互赋值过程的内存分配Books=namesStrArr=nameS垃圾回收:上图中显然之前books和strArr所指向
的堆的对象都失去了引用,给予jvm的垃圾回收,这些失去引用的对象都将成为垃圾最终被回收栈堆的地址问题第一步第二步第一步:堆将相
应的内存地址发送给栈第二步:栈根据发送过来的地址指向对应的堆内存从内存分配上可以看出,最终strArr/names/books这
三个不同的地址引用,最终指向同一个对象。结果就是strArr==names==books成立。并且根据栈堆内存分配的过程可知,
三个引用地址最终是相同的。总之对象若是同一个,则地址引用也是相同的。数组初始化的两种方式静态初始化初始化时由程序员显示指定每个
数组元素的初始值,由系统决定数组长度。动态初始化初始化时程序员只指定数组长度,用系统为数组元素分配初始值。默认初始化的值整数:
0浮点数:0.0字符:空引用数据类型:nullBoolean:fall2数组一定要初始化吗首先对于数组要明确三个概念,数组变量和数
组对象、数组对象引用;数组变量指的是数组中的元素,数组对象指的是对象实例。对于数组的初始化,本质是对数组对象的初始化,即在堆内存中
创建数组对象,也就是为该数组对象分配一块连续的内存空间。事实上数组不是一定要初始化后才能使用,我们可以通过上述的数组赋值的方式间接
的实现了初始化。3、基本类型数组初始化(int[]arr=newint[10])数组本身是引用数据类型,而基本类型数组和引
用类型数组则是针对数组中的元素来说的。基本类型数组初始化:基本类型数组中的元素的值直接存放在数组元素变量中。注:首先我们需要注
意不能说基本数据类型变量的值是存放在栈内存中,如基本类型数组中元素变量的值就是存放在堆内存中的,这是因为数组属于引用类型,而其元素
包含在对象中,而引用类型变量所引用的对象是存在堆内存中的。应该说所有的局部变量(基本数据类型、引用数据类型)都是放在栈内存中保存,
而引用类型变量所引用的对象都是放在堆内存中保存。数组中区分3个概念数组对象:即实例部分,存储于堆内存中,newint[12]数
组对象引用:int[]arr=newint[12];中arr就是对象引用,存在于栈中数组变量:即数组中的元素,ar
r[0]属于对象实例的一部分,存在于堆内存中因此数组变量与一般的变量不一样,一般的便量存储于栈中。引用类型数组的初始化引用类型数
组中每个数组元素又是一个引用变量,既然是引用变量那么就应该去指向另一个对象实例。因此其内存图就不会向基本类型数组那样简单了。总结:
(1)数组中的每个元素都是一个变量,这个变量与其它变量不同的地方在于这个变量存在于对象中,因此这个变量位于堆内存中。(2)数组元素
类型有基本类型(基本类型变量)和引用类型(引用类型变量)这就导致了在给数组赋值的时候存在两种不同的形式。对于基本类型,所赋的值直接
存放到该数组变量中。对于引用类型元素,其本身就是一个引用变量,这个时候他相当于指针,给它赋值,本质就是让他去指向其他的对象实例。对
象只能给对象赋值使用数组1、数组元素就是变量当程序需要多个类型相同的变量来保存程序状态时,可以考虑使用数组来保存这些变量,当一一个
数组初始化完成后,就相当于定义了多个类型相同的变量。没有多维数组数组在堆内存中被分配了连续的内存空间,在java中是没有多维数组的概念的。最长使用的数组不会超过3维。
献花(0)
+1
(本文系实习生101首藏)