如果它是文件对象,Java如何比较密钥?

时间:2013-02-07 10:40:43

标签: java algorithm api

假设我有一个HashMap,它将实际的文件对象存储为键,值为它的最后修改日期。

HashMap<File, Long> hashMap = new HashMap<File, Long>();

如果我的HashMap中存在File(test.log)(我已添加它),但文件(test.log)被修改或稍后更改;当我发出替换时,它会找到现有的匹配对象,还是会更改文件的STATE,这将改变对象的性质。因此,我将间接添加一个新的Key,Value Pair。

hashMap.replace(file, newModifiedTime); 

5 个答案:

答案 0 :(得分:2)

来自javadoc equal's description

  

测试此抽象路径名与给定对象的相等性。当且仅当参数不为null并且是表示与此抽象路径名相同的文件或目录的抽象路径名时,返回true。两个抽象路径名是否相等取决于底层系统。

答案 1 :(得分:1)

File .equals() / .hashCode()测试文件名称,因此您的密钥是“安全的”。

Javadoc这样说。

注意:如果你使用JDK 7或更高版本,请帮个忙:放弃File,使用Files / Path

注意2:请注意,如果您在目录/foo中,new File("bar")new File("/foo/bar") 不一样。如果您想确保文件名是“完整的”,请使用.getCanonicalFile()

但是,再次帮自己一个忙,并使用Files。它的数量级要好一些。

答案 2 :(得分:0)

存储的内容有一个Key是文件的哈希值。这实际上并不意味着整个对象被散列。只有Path用于生成File对象的哈希值。

将对象作为键存储到哈希表时。它将在内部调用.hashCode()

http://docs.oracle.com/javase/6/docs/api/java/io/File.html#hashCode()

来自文档。

  

计算此抽象路径名的哈希码。因为平等   抽象路径名本质上是系统依赖的,因此也是如此   计算他们的哈希码。在UNIX系统上,一个哈希码   抽象路径名等于其唯一或哈希码   pathname字符串和十进制值1234321.在Microsoft Windows上   在系统中,散列码等于散列码或散列码   其路径名字符串转换为小写和小数值   1234321.在小写路径名字符串时不考虑区域设置。

答案 3 :(得分:0)

HashMap使用其密钥的hashCode()方法。根据{{​​3}} File.hashCode() {{1}}执行此操作。

  

计算此抽象路径名的哈希码。因为平等   抽象路径名本质上是系统依赖的,因此也是如此   计算他们的哈希码。在UNIX系统上,一个哈希码   抽象路径名等于其唯一或哈希码   pathname字符串和十进制值1234321.在Microsoft Windows上   在系统中,散列码等于散列码或散列码   其路径名字符串转换为小写和小数值   1234321.在小写路径名字符串时不考虑区域设置。

简而言之,哈希是根据路径名而不是文件内容计算的。

答案 4 :(得分:0)

HashMap使用hashCode()equals()类实例的方法作为键,即File。在File的情况下,它通过将功能委托给具体的文件系统包装器来比较抽象路径。

如果你想改变这种行为,你可能应该使用TreeMap并实现自己的自定义比较器,比较文件内容,上次修改日期等。