黑马程序员技术交流社区
标题:
关于java内存
[打印本页]
作者:
王涵
时间:
2013-9-27 14:38
标题:
关于java内存
java,对象的引用是存放在栈内存中,它的值是堆上对象的地址值吗?
class Demo
{ }
classObjectDemo
{
public static void main(String args[])
{
Demo d1=new Demo();
System.out.println(d1.hashCode());
}
}
任何时候运行结果一直是
12677476
JDK-API 上说
“由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(
这一般是通过将该对象的内部地址转换成一个整数来实现的。
)”
那么按照这种说法 难道这个对象任何时候都使用的是同一片内存?
作者:
杨增坤
时间:
2013-9-27 15:07
你多运行几试一试,我运行测试了几遍,他们不是一直都是同一个值的。
作者:
周志龙
时间:
2013-9-27 15:09
哥们,有点看不懂你代码了,是不是把方法名写错了?
class Demo
{ }
classObjectDemo
{
...
}
复制代码
对象确实是放在堆中,而引用放在栈里,你说的"这个对象任何时候都使用的是同一片内存"是半对的,每个对象的属性值在堆中也有不同的地址内存的,你如果想获得对象的内存就回返给你第一个属性值的地址,如果你需要得到对象每个属性值的地址,那就不一样了
作者:
doitforyou
时间:
2013-9-27 16:16
java中可以把内存分为栈内存、堆内存、方法区、本地方法区(更多和操作系统的方法有关,不用太过关注)
经常使用的是前面三个:
栈内存:存放局部变量及引用变量,方法运行调用时也会临时在栈内存中开辟空间
堆内存:new出新对象时才会在堆内存中开辟新空间并初始化成员变量
方法区:也称静态区或共享区,用来存放静态成员(变量和方法)和非静态成员方法
楼主问题1:对象的引用存放位置,他不是static成员,也没有使用new,只是一个变量申明,所以存在于栈内存中,new出来的对象存放于堆内存中,他会把首地址赋给同类型的引用。
楼主问题2:为什么哈希值一直一样?
如果你在主函数中,new出两个对象,你会发现他们的哈希值肯定不同。
当你new出一个时,主函数执行结束,就会使用垃圾回收机制释放资源,你再次运行的时候,有很大可能再次获得同一个值,因为在此期间你可能只有这一部分使用了内存,但是不代表这个对象任何时候使用的都是同一个内存,你可以多new出几个对象,你会发现,以前的那个哈希值就会改变。
学习总结:哈希值的用法,它主要是用在集合中,区分不同对象,所以研究单个对象的哈希值意义不大,不用太过于纠结在底层他的算法中。先得大概,而后慢慢深入,毕竟现在时间宝贵。
作者:
酱爆
时间:
2013-9-27 16:24
class A
{
int i;
int j;
}
class TestMemo
{
public static void main(String[] args)
{
A aa = new A(); //相当于C语言的 (A *)malloc(sizeof(A));
// new A(); 在堆中动态分配一块区域,被当做了A对象
// aa本身的内存是在栈中分配的
// 堆中内存的地址付给了aa
// aa指向堆中的内存,aa代表了堆中的内存
// aa.i 代表: aa这个静态指针变量所指向的动态内存中的A对象的i这个成员
// aa.j 代表: aa这个静态指针变量所指向的动态内存中的A对象的j这个成员
aa.i = 10;
aa.j = 20;
System.out.printf("%d, %d\n", aa.i, aa.j);
//int i = 10;
}
}
复制代码
作者:
黄炳期
时间:
2013-9-27 18:39
杨增坤 发表于 2013-9-27 15:07
你多运行几试一试,我运行测试了几遍,他们不是一直都是同一个值的。
坤坤一语中的啊!
作者:
杨增坤
时间:
2013-9-27 21:35
黄炳期 发表于 2013-9-27 18:39
坤坤一语中的啊!
呵呵
作者:
乔兵
时间:
2013-10-3 19:03
问题解决后,请修改帖子分类为:提问结束
作者:
麦子
时间:
2013-10-3 20:34
那是你两次之间运行得太快,虚拟机还没有释放你刚才建立的那个对象资源,两次地址一样,说明指向的是堆内存中同一个对象
你可以试着稍微间隔一点时间再次运行,看看两次的hash值是否相同
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2