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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王涵 中级黑马   /  2013-9-27 14:38  /  2457 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java,对象的引用是存放在栈内存中,它的值是堆上对象的地址值吗?


class Demo
{ }
classObjectDemo
{

public static void main(String args[])


{


Demo d1=new Demo();


System.out.println(d1.hashCode());


}

}
任何时候运行结果一直是 12677476




JDK-API 上说
“由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的。)”
那么按照这种说法 难道这个对象任何时候都使用的是同一片内存?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

8 个回复

倒序浏览
你多运行几试一试,我运行测试了几遍,他们不是一直都是同一个值的。
回复 使用道具 举报
哥们,有点看不懂你代码了,是不是把方法名写错了?
  1. class Demo
  2. { }
  3. classObjectDemo
  4. {
  5. ...
  6. }
复制代码
对象确实是放在堆中,而引用放在栈里,你说的"这个对象任何时候都使用的是同一片内存"是半对的,每个对象的属性值在堆中也有不同的地址内存的,你如果想获得对象的内存就回返给你第一个属性值的地址,如果你需要得到对象每个属性值的地址,那就不一样了

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
java中可以把内存分为栈内存、堆内存、方法区、本地方法区(更多和操作系统的方法有关,不用太过关注)

经常使用的是前面三个:
栈内存:存放局部变量及引用变量,方法运行调用时也会临时在栈内存中开辟空间
堆内存:new出新对象时才会在堆内存中开辟新空间并初始化成员变量
方法区:也称静态区或共享区,用来存放静态成员(变量和方法)和非静态成员方法

楼主问题1:对象的引用存放位置,他不是static成员,也没有使用new,只是一个变量申明,所以存在于栈内存中,new出来的对象存放于堆内存中,他会把首地址赋给同类型的引用。
楼主问题2:为什么哈希值一直一样?
如果你在主函数中,new出两个对象,你会发现他们的哈希值肯定不同。
当你new出一个时,主函数执行结束,就会使用垃圾回收机制释放资源,你再次运行的时候,有很大可能再次获得同一个值,因为在此期间你可能只有这一部分使用了内存,但是不代表这个对象任何时候使用的都是同一个内存,你可以多new出几个对象,你会发现,以前的那个哈希值就会改变。
学习总结:哈希值的用法,它主要是用在集合中,区分不同对象,所以研究单个对象的哈希值意义不大,不用太过于纠结在底层他的算法中。先得大概,而后慢慢深入,毕竟现在时间宝贵。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报 1 0
  1. class A  
  2. {  
  3.     int i;  
  4.     int j;  
  5. }  
  6.   
  7. class TestMemo  
  8. {  
  9.     public static void main(String[] args)  
  10.     {  
  11.         A aa = new A(); //相当于C语言的 (A *)malloc(sizeof(A));  
  12.             // new A(); 在堆中动态分配一块区域,被当做了A对象  
  13.             // aa本身的内存是在栈中分配的  
  14.             // 堆中内存的地址付给了aa  
  15.             // aa指向堆中的内存,aa代表了堆中的内存  
  16.             // aa.i 代表: aa这个静态指针变量所指向的动态内存中的A对象的i这个成员  
  17.             // aa.j 代表: aa这个静态指针变量所指向的动态内存中的A对象的j这个成员  
  18.         aa.i = 10;   
  19.         aa.j = 20;  
  20.         System.out.printf("%d, %d\n", aa.i, aa.j);  
  21.          
  22.          
  23.         //int i = 10;  
  24.     }  
  25. }  
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
杨增坤 发表于 2013-9-27 15:07
你多运行几试一试,我运行测试了几遍,他们不是一直都是同一个值的。

坤坤一语中的啊!
回复 使用道具 举报
黄炳期 发表于 2013-9-27 18:39
坤坤一语中的啊!

呵呵
回复 使用道具 举报
乔兵 高级黑马 2013-10-3 19:03:58
8#
问题解决后,请修改帖子分类为:提问结束
回复 使用道具 举报
麦子 中级黑马 2013-10-3 20:34:54
9#
那是你两次之间运行得太快,虚拟机还没有释放你刚才建立的那个对象资源,两次地址一样,说明指向的是堆内存中同一个对象
你可以试着稍微间隔一点时间再次运行,看看两次的hash值是否相同

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马