黑马程序员技术交流社区

标题: 问题请教? [打印本页]

作者: 张小锋    时间: 2012-5-10 12:04
标题: 问题请教?
当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, 下载次数: 21)

图片1.jpg

作者: 云惟桉    时间: 2012-5-10 12:32
我不是按照楼主的方式理解的。我觉得new出来的实例对象应该不是指向常量池的字符串,而是字符串做参数传入File的构造函数中。

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

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2