2013-02-07 38 views
1

假设我有一个HashMap,它将实际的文件对象存储为关键字,并将该值存储为上次修改日期。如果Java是一个文件对象,它如何比较一个Key?

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

如果文件(test.log中)在我的HashMap的存在(我已经添加了),但该文件(test.log中)被修改或者后来改变;当我发出替换时,它是否会找到现有的匹配对象,或者是否会改变文件的状态更改,这将改变对象的性质。因此,我将间接添加一个新的关键值对。

hashMap.replace(file, newModifiedTime); 
+1

您是否尝试过阅读)File.equals的代码(? – Augusto

+0

不,但基于我明确应该有的答案:) –

回答

2

javadoc equal's description

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

1

File.equals()/.hashCode()测试的文件名,所以你的钥匙是‘安全’。

Javadoc这样说。

注意:如果您使用的是JDK 7或更高版本,请帮忙:drop File,使用Files/Path

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

但是,再次为自己做个忙,并使用Files。这是好几个数量级。

0

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

将对象存储为散列表的关键字时。它会在内部调用.hashCode()

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

从文档。

计算此抽象路径名的哈希码。因为抽象路径名的平等本质上是依赖于系统的,所以它们的哈希码的计算也是如此。在UNIX系统上, 抽象路径名的哈希码等于其 路径名字符串和十进制值1234321的哈希码。在Microsoft Windows 系统上,哈希码等于排除或其路径名字符串的散列码 转换为小写字母,并且十进制值 1234321.在降低路径名字符串的低位时不考虑语言环境。

0

HashMap使用其键的hashCode()方法。并且File.hashCode()这么做,根据the docs

计算这个抽象路径名的哈希码。因为抽象路径名的平等本质上是依赖于系统的,所以它们的哈希码的计算也是如此。在UNIX系统上, 抽象路径名的哈希码等于其 路径名字符串和十进制值1234321的哈希码。在Microsoft Windows 系统上,哈希码等于排除或其路径名字符串的散列码 转换为小写字母,并且十进制值 1234321.在降低路径名字符串的低位时不考虑语言环境。

简而言之,散列是基于路径名而不是文件内容计算的。

0

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

如果你想改变这种行为,你应该使用TreeMap并实现自己的自定义比较该文件内容进行比较,最后修改日期等

相关问题