本帖最后由 奋斗的蜗牛ksd 于 2014-12-10 00:54 编辑
晚上睡不着,看了你的问题:
我尽力理解你的问题,并且努力回答了,希望你能看明白,我也是初学,学的不深刻,有问题可以指教。
你第一个表述没有说到重点:
你认为:字符串实际存储在堆内存中,在结尾处以\0表示结束了,那获取字符串的长度值需要找到\0的地址。【这个其实是底层实现,不用管】
本质是:每一个字符串 是一个String类类型的对象,而String类 中定义了length()这个方法,可以直接获取每一个字符串对象的 长度,至于怎么实现的,这时底层的事情,
如果你非要问length()方法在哪里存储,那么很确定的告诉你是在内存中的方法区中,
第二个问题:你问“而普通的数组,例如int[] a=new int[5];这个长度5是如何确定的呢?到底存放在哪里?是堆内存中还是栈内存中?java是如何获取这个数组的长度的呢?”
你的问题是 数组 的长度5 如何确定,
数组是一种引用数据类型,记住 它是一种类型,可以认为数组就是对象,那么它就有自己的属性,这个属性 就是length,看清楚这是属性length不是字符串的方法length(),这个属性 是存储在堆中的。【因为堆是存放引用数据类型的内存,而栈是存放基本数据类型的,说白话一点,栈一般存的是 地址,而栈存的是具有很多熟悉和方法的实例对象】
举两个个栗子把:
先这样分开写,方便解释
int[] a=null;//声明数组,也是引用
a=new int[5];//初始化数组对象,给数组分配内存地址。
好了,
第一步:数组的引用,也就是a,当你在声明的时候,他会在【栈】中开辟一个地址空间。
第二步 new的作用,是在【堆】中开辟一个内存空间,存放的是数组对象的类型还,数组长度【你可以理解为存放了一个对象,对象有一系列熟悉】。
第二步 "="的作用是,把栈中的a地址指向堆中对象
总结下,数组的引用保存在栈中,同时实例的时候在堆中开辟连续空间,栈中的空间指向堆的首地址。
|