1

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

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

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

hashMap.replace(file, newModifiedTime); 
4

5 回答 5

2

来自javadoc equal 的描述

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

于 2013-02-07T10:44:06.390 回答
1

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

Javadoc是这么说的。

注意:如果您使用 JDK 7 或更高版本,请帮自己一个忙:丢弃File,使用Files/ Path

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

但同样,请帮自己一个忙并使用Files. 它好几个数量级。

于 2013-02-07T10:44:02.817 回答
0

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

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

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

从文档。

计算此抽象路径名的哈希码。因为抽象路径名的相等性本质上是系统相关的,所以它们的哈希码的计算也是如此。在 UNIX 系统上,抽象路径名的哈希码等于其路径名字符串的哈希码和十进制值 1234321 的异或。在 Microsoft Windows 系统上,哈希码等于其路径名字符串转换为小写和十进制值 1234321。在小写路径名字符串时不考虑区域设置。

于 2013-02-07T10:44:09.943 回答
0

HashMap使用hashCode()其键的方法。File.hashCode()根据文档,这样做:

计算此抽象路径名的哈希码。因为抽象路径名的相等性本质上是系统相关的,所以它们的哈希码的计算也是如此。在 UNIX 系统上,抽象路径名的哈希码等于其路径名字符串的哈希码和十进制值 1234321 的异或。在 Microsoft Windows 系统上,哈希码等于其路径名字符串转换为小写和十进制值 1234321。在小写路径名字符串时不考虑区域设置。

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

于 2013-02-07T10:44:15.733 回答
0

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

如果您想更改此行为,您可能应该使用TreeMap并实现您自己的自定义比较器来比较文件内容、最后修改日期等。

于 2013-02-07T10:46:30.717 回答