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 call File#equals(),它又委托fs#compare()which 按字典顺序比较两个抽象路径名。即,指向同一路径的两个文件确实是相等的。

于 2012-06-09T06:42:27.497 回答
5

我认为您的问题出在此处:

 pro.put("file", file);

来自 Java 文档:

因为 Properties 继承自 Hashtable,所以 put 和 putAll 方法可以应用于 Properties 对象。强烈建议不要使用它们,因为它们允许调用者插入键或值不是字符串的条目。应该改用 setProperty 方法。

当你调用contains()它时,根据 Java 文档:

当且仅当某些键映射到由 equals 方法确定的此哈希表中的 value 参数时,才返回 true;否则为假。

你现在看到你的问题了吗?

进一步澄清:

当你这样做时: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

请参阅属性类定义

public class Properties extends Hashtable<Object,Object>

并且containsHashtable的方法,它指出 -

    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).

当且仅当某些键映射到此哈希表中的 value 参数时,它才返回 true,由 equals 方法确定;否则为假。

于 2012-06-09T06:49:25.967 回答