黑马程序员技术交流社区

标题: 数组的长度在内存是如何存储的? [打印本页]

作者: as604049322    时间: 2014-12-9 19:44
标题: 数组的长度在内存是如何存储的?
字符串实际存储在堆内存中,在结尾处以\0表示结束了,那获取字符串的长度值需要找到\0的地址。
而普通的数组,例如int[] a=new int[5];这个长度5是如何确定的呢?到底存放在哪里?是堆内存中还是栈内存中?java是如何获取这个数组的长度的呢?


作者: 杨金龙    时间: 2014-12-9 20:33
本帖最后由 杨金龙 于 2014-12-9 20:36 编辑

应该怎么说
int[] a=new int[5];
中的5   是告诉jvm  我要开辟一个堆空间  空间里有5个位置
每个位置都有一个脚标,分别是0,1,2,3,4
并记住脚标为0的内存地址,返回给引用变量a
不应该说是存起来  ,应该说是告诉计算机我要开辟多大的空间
还有 java内部怎么获取这个长度我不知道 ,不过我有方法可以获取
那就是引用名.length
int[] a=new int[5];
也就是a.length

作者: zmhlnrs    时间: 2014-12-9 21:35
是在堆内存中新开辟一个长度为5的数组

作者: 奋斗的蜗牛ksd    时间: 2014-12-10 00:46
本帖最后由 奋斗的蜗牛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地址指向堆中对象
总结下,数组的引用保存在栈中,同时实例的时候在堆中开辟连续空间,栈中的空间指向堆的首地址。



作者: as604049322    时间: 2014-12-10 09:03
奋斗的蜗牛ksd 发表于 2014-12-10 00:46
晚上睡不着,看了你的问题:
我尽力理解你的问题,并且努力回答了,希望你能看明白,我也是初学,学的不深 ...

大哥,其实我目的就是要知道底层怎么实现的,把一个东西形象化后谁都能理解,但却不知道本质。比如字符a它的本质就是97这个数字,而97这个数字的本质就是内存中16个2进制位,而每个2进制位本质实际就是高电平与低电平。可以确定的是数组是一种数据结构,它的实体存储于堆内存。数组这种数据结构,它的长度肯定也跟字符串的实现方式一样,在结尾加了标识符号,或是在开头加上了这个数组的长度。
作者: as604049322    时间: 2014-12-10 09:05
杨金龙 发表于 2014-12-9 20:33
应该怎么说
int[] a=new int[5];
中的5   是告诉jvm  我要开辟一个堆空间  空间里有5个位置

用length属性获取长度,只是调用了java提供的接口,我只想知道java底层怎么实现的。
作者: 黄小橙    时间: 2014-12-10 09:23
去学数据结构吧
作者: 奋斗的蜗牛ksd    时间: 2014-12-10 23:15
as604049322 发表于 2014-12-10 09:03
大哥,其实我目的就是要知道底层怎么实现的,把一个东西形象化后谁都能理解,但却不知道本质。比如字符a ...

那你就研究的很深了,我理解错你的意思 抱歉了。
佩服你每个问题研究的这么深刻,

每个人学习目的不同吧,我学java就为了进黑马学习编程能力,你学习思考的底层实现,更多的是跨学科的知识,超出java语言的层面了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2