1

予期しない出力が発生していProperties.contains()ます...

これは私のコードです...

File file = new File("C:\\ravi\\non-existing.no");
Properties pro = System.getProperties();
pro.put("file", file);
System.out.println(pro.contains(file)); //PRINTS TRUE , AS EXPECTED

File file2 = file;
System.out.println(pro.contains(file2)); //PRINTS TRUE , AS EXPECTED

File file3 = new File("C:\\ravi\\non-existing.no");
System.out.println(pro.contains(file3)); //EXPECTED FALSE , BUT PRINTS TRUE

File file4 = new File("C:\\ravi\\non.no");
System.out.println(pro.contains(file4)); //PRINTS FALSE , AS EXPECTED

Propertiesの存在を確認することを期待していますがFile、これは機能していないようです。誰かがfile3私が期待どおりに機能しない理由を説明するのを手伝ってもらえますか?

4

3 に答える 3

6

Properties#contains()will が を呼び出しFile#equals()、次にwhich がfs#compare()2 つの抽象パス名を辞書式に比較する委譲を行うため、これは予想どおりです。つまり、同じパスを指す 2 つのファイルは実際には等しくなります。

于 2012-06-09T06:42:27.497 に答える
5

あなたの問題はここにあると思います:

 pro.put("file", file);

Java ドキュメントから:

Properties は Hashtable を継承しているため、put および putAll メソッドを Properties オブジェクトに適用できます。キーまたは値が文字列ではないエントリを呼び出し元が挿入できるようにするため、これらの使用は強くお勧めしません。代わりに setProperty メソッドを使用する必要があります。

contains()そして、Java docs によると、それを呼び出すと:

equals メソッドによって決定されたように、このハッシュテーブルの値引数にいくつかのキーがマップされている場合に限り、true を返します。それ以外の場合は false。

あなたは今あなたの問題を見ますか?

さらに明確にするために:

あなたがするとき:System.out.println(pro.contains(file3));あなたはすることになるfile.equals(file3)、したがってtrue

そして、あなたがするとき:System.out.println(pro.contains(file4));あなたはすることfile.equals(file4)になりfalseます。

于 2012-06-09T06:45:33.973 に答える
1

Property クラスの定義を参照してください。

public class Properties extends Hashtable<Object,Object>

そして、 Hashtablecontainsの方法は次のように述べています-

    Tests if some key maps into the specified value in this hashtable.
    This operation is more expensive than the containsKey method.
    Note that this method is identical in functionality to containsValue,
   (which is part of the Map interface in the collections framework).

また、equals メソッドによって決定されたように、このハッシュテーブルの値引数にいくつかのキーがマップされている場合に限り、true を返します。それ以外の場合は false。

于 2012-06-09T06:49:25.967 に答える