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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
一直不明白  为什么 我打印  对象实体引用tt打印的地址哈希值一值是一样的重启后电脑打印的值也是一样  ,但换一台电脑就不一样了呢?
各们大神帮我解释一下呢?


class Test01
{
public static void main(String[]args)
{
  Test01 tt=new Test01();
  System.out.println(tt);
}
}
控制台输出结果

D:\javabin>cd 02天
系统找不到指定的路径。
D:\javabin>cd day02
D:\javabin\day02>dir
驱动器 D 中的卷没有标签。
卷的序列号是 0004-0656
D:\javabin\day02 的目录
2015/10/11  14:49    <DIR>          .
2015/10/11  14:49    <DIR>          ..
2015/10/11  14:53               416 Test01.class
2015/10/11  14:48               142 Test01.java
               2 个文件            558 字节
               2 个目录 60,873,252,864 可用字节
D:\javabin\day02>javac Test01.java
D:\javabin\day02>java Test01
Test01@15db9742
D:\javabin\day02>


18 个回复

倒序浏览
Test01@15db9742  看过教学视频我知道  Test01 是对象的引用 @ 是 在的意思  在15db9742 这个地址  ,但如果我的电脑重启内存不就是释放了吗?释放了之后我重新编译运行  为什么这个值还是这个值呢?
回复 使用道具 举报
你好
    冒昧说一句,hashcode()取到的是 对象在 JVM中虚拟内存的地址,不是电脑的。至于结果相等,我推测下,可能是偶然,或者,你重启,并没有断电,内存不一定释放了,可能导致系统保存了相关数据。
   以上只是推测,仅供参考。
回复 使用道具 举报
你new的这个对象在内存中一直未释放,所以打出来的还是同一个哈希地址值;别人电脑上new出来的是不同对象,肯定地址值不一样,你可以自己在电脑上再另外new一个对象打印地址值,肯定会变得。
回复 使用道具 举报
VV烽火 发表于 2015-10-11 23:35
你new的这个对象在内存中一直未释放,所以打出来的还是同一个哈希地址值;别人电脑上new出来的是不同对象, ...

我的意思 虽然是同一个对象  打印的值是这个值 ,但在我重启电脑后 内存已经释放了;为什么重新编译 运行后值 还是这个值呢
回复 使用道具 举报
kamo 发表于 2015-10-11 22:18
你好
    冒昧说一句,hashcode()取到的是 对象在 JVM中虚拟内存的地址,不是电脑的。至于结果相等,我推 ...

这个我 试一下 谢谢你了兄弟
回复 使用道具 举报
雨来 高级黑马 2015-10-12 09:09:56
7#
雨来 发表于 2015-10-12 09:07
这个我 试一下 谢谢你了兄弟

兄弟说的这个情况  ,我确实是重启的电脑,我再断电编译 运行一下
回复 使用道具 举报
这个问题问的有水平,这可能涉及到,java虚拟机运行开辟计算机的内存,是否会加关机的时候清空的问题,或者说虚拟机开辟空间中的数据在关机的时候会被计算机以某种方式保存到硬盘中,当再次开机,并运行java虚拟机的时候是否会重新加载之前的数据,个人见解
回复 使用道具 举报
雨来 发表于 2015-10-12 09:04
我的意思 虽然是同一个对象  打印的值是这个值 ,但在我重启电脑后 内存已经释放了;为什么重新编译 运行 ...

因为内存地址值没变啊,如果电脑重启后内存就释放了,那么还怎么用java做开发?好不容易编一个程序,只因为重启一下电脑,结果new的对象都不在了,值,方法什么的全都不能用,还用java开发个什么。
java虚拟机中专门有一个垃圾回收机制,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间,这时内存才释放了。
回复 使用道具 举报
kamo 中级黑马 2015-10-12 21:30:55
10#
雨来 发表于 2015-10-12 09:07
这个我 试一下 谢谢你了兄弟

不客气。
回复 使用道具 举报
看完上面的,认可一点机器不会因为你重启而导致对象的释放,那么既然您已经存储在堆内存中,是否可以用new出来的对象,重新赋值或者说是更换地址?
回复 使用道具 举报
只是打酱油路过,想到了一个更无厘头的注意,换条内存再检验下?{:3_48:}
回复 使用道具 举报
问题 好细呀
回复 使用道具 举报
哈希值是随机出现的!等你学到集合那边你就会清除的,那边有关于哈希值的讲解。
回复 使用道具 举报
同一对象的哈希值必定相同,不同对象的哈希值可以相同
回复 使用道具 举报
应该是偶然吧。。。。
回复 使用道具 举报
雨来 高级黑马 2015-12-10 22:13:46
17#
744919632 发表于 2015-12-10 09:06
应该是偶然吧。。。。

原理是什么?
回复 使用道具 举报
雨来 高级黑马 2015-12-10 22:18:35
18#
我好像也找到了答案:  应该说 在同一时候段内,但是也解释不通,  因为new 是在向 内存申请空间, 对象消失后,再次编译 运行的时候,是再次向内存申请空间, 这个值会改变,但解释不通的是  为什么一个 一个时间段内 这个值一直是一样呢? 在对象消失后,java 的垃圾回收机制,不就执行了吗? 回收之后,我们再编译 运行,值应该不一样的,  这个时候段的机制是什么呢?
回复 使用道具 举报
雨来 高级黑马 2015-12-10 22:21:33
19#
VV烽火 发表于 2015-10-12 15:09
因为内存地址值没变啊,如果电脑重启后内存就释放了,那么还怎么用java做开发?好不容易编一个程序,只因 ...

垃圾回收机制是对的,但是 我们再次编译运行的时候,这个对象的内存不已经释放了吗? 为什么重新编译运行 这个值还是一样的呢? 但经过多次编译运行,这个值就变了呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马