1

実際のファイル オブジェクトをキーとして格納し、値を最終変更日として格納する HashMap があるとします。

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

ファイル (test.log) が HashMap (追加済み) に存在するが、ファイル (test.log) が後で変更または変更された場合。置換を発行すると、既存の一致するオブジェクトが見つかるか、ファイルの STATE が変更され、オブジェクトの性質が変更されます。したがって、新しいキーと値のペアを間接的に追加します。

hashMap.replace(file, newModifiedTime); 
4

5 に答える 5

2

javadoc equal の説明から

この抽象パス名が指定されたオブジェクトと等しいかどうかをテストします。引数が null ではなく、この抽象パス名と同じファイルまたはディレクトリを示す抽象パス名である場合にのみ、true を返します。2 つの抽象パス名が等しいかどうかは、基礎となるシステムに依存します。

于 2013-02-07T10:44:06.390 に答える
1

File.equals()/.hashCode()ファイルの名前をテストするため、キーは「安全」です。

Javadocはそう言っています。

注: JDK 7 以降を使用している場合は、drop File、 use Files/を使用してくださいPath

/foo注 2: ディレクトリにいる場合は、同じnew File("bar")new File("/foo/bar")はないことに注意してください。ファイル名が「完全」であることを確認したい場合は、..getCanonicalFile()

しかし、繰り返しますが、あなた自身を支持して使用してくださいFiles。それは桁違いに優れています。

于 2013-02-07T10:44:02.817 に答える
0

キーを持って保存されるのは、ファイルのハッシュです。これは実際には、オブジェクト全体がハッシュされるという意味ではありません。File オブジェクトのハッシュの生成には Path のみが使用されます。

オブジェクトをキーとしてハッシュ テーブルに格納する場合。内部的に呼び出します.hashCode()

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

ドキュメントから。

この抽象パス名のハッシュ コードを計算します。抽象パス名の等価性は本質的にシステムに依存するため、それらのハッシュ コードの計算も同様です。UNIX システムでは、抽象パス名のハッシュ コードは、そのパス名文字列と 10 進値 1234321 のハッシュ コードの排他的論理和と等しくなります。Microsoft Windows システムでは、ハッシュ コードは、次のハッシュ コードの排他的論理和と等しくなります。パス名文字列は小文字に変換され、10 進値は 1234321 になります。パス名文字列の小文字化では、ロケールは考慮されません。

于 2013-02-07T10:44:09.943 に答える
0

HashMaphashCode()キーのメソッドを使用します。docsFile.hashCode()によると、これを行います:

この抽象パス名のハッシュ コードを計算します。抽象パス名の等価性は本質的にシステムに依存するため、それらのハッシュ コードの計算も同様です。UNIX システムでは、抽象パス名のハッシュ コードは、そのパス名文字列と 10 進値 1234321 のハッシュ コードの排他的論理和と等しくなります。Microsoft Windows システムでは、ハッシュ コードは、次のハッシュ コードの排他的論理和と等しくなります。パス名文字列は小文字に変換され、10 進値は 1234321 になります。パス名文字列の小文字化では、ロケールは考慮されません。

つまり、ハッシュはファイルの内容ではなく、パス名に基づいて計算されます。

于 2013-02-07T10:44:15.733 に答える
0

HashMapキーとして使用されるクラスインスタンスの用途hashCode()equals()メソッド、つまりFileあなたの場合。ファイルの場合、機能を具体的なファイル システム ラッパーに委譲することにより、抽象パスを比較します。

この動作を変更したい場合はTreeMap、ファイルの内容や最終更新日などを比較する独自のカスタム コンパレータを使用して実装する 必要があります。

于 2013-02-07T10:46:30.717 に答える