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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张小锋 中级黑马   /  2012-5-10 12:04  /  1883 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当new连个相同的字符串的时候,使用equals比较两个字符串比较的是两个对象的值,也就是比较在常量池里的字符串
下面有一种情况不知道是不是类似:
File file=new File("F:\\a.txt");
File file2=new File("F:\\a.txt");
System.out.println(file.equals(file2));
打印:true

当new一个File对象时,file,file2引用会保存在栈内存中,指向堆内存中的new对象,new对象又指向常量池里字符串”F:\\a.txt“,他们三者都是连在一起的,但真正的实体文件txt是怎样与file对象练习起来的呢?

图片1.jpg (26.52 KB, 下载次数: 23)

图片1.jpg

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
我不是按照楼主的方式理解的。我觉得new出来的实例对象应该不是指向常量池的字符串,而是字符串做参数传入File的构造函数中。

当new了两个File的实例对象file1 和 file2 ,这时,他们传入的参数是都是字符串类型的文件名
然后jvm利用底层机制,去搜索OS的文件系统,因为只要文件存在,就说明它被存储在数据库中
这时就会把这个字符串类型的文件名当做索引条件,去匹配对应路径下的文件。
如果找不到,你使用对应的file实例对象就会抛出异常。

当然这里面涉及的内容也有深度的。比如说利用引用地址,去寻找文件所在的物理地址等等。
如果楼主需要了解相关的内容,我建议找一本java虚拟机的详解书籍来参考。
应该会有所收获的。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

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