A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© as604049322 金牌黑马   /  2014-12-9 19:44  /  1304 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

7 个回复

倒序浏览
本帖最后由 杨金龙 于 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
回复 使用道具 举报
是在堆内存中新开辟一个长度为5的数组
回复 使用道具 举报
本帖最后由 奋斗的蜗牛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地址指向堆中对象
总结下,数组的引用保存在栈中,同时实例的时候在堆中开辟连续空间,栈中的空间指向堆的首地址。


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
奋斗的蜗牛ksd 发表于 2014-12-10 00:46
晚上睡不着,看了你的问题:
我尽力理解你的问题,并且努力回答了,希望你能看明白,我也是初学,学的不深 ...

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

用length属性获取长度,只是调用了java提供的接口,我只想知道java底层怎么实现的。
回复 使用道具 举报
去学数据结构吧
回复 使用道具 举报
as604049322 发表于 2014-12-10 09:03
大哥,其实我目的就是要知道底层怎么实现的,把一个东西形象化后谁都能理解,但却不知道本质。比如字符a ...

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

每个人学习目的不同吧,我学java就为了进黑马学习编程能力,你学习思考的底层实现,更多的是跨学科的知识,超出java语言的层面了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马