Properties.contains()的意外输出

时间:2012-06-09 06:37:25

标签: java file properties

我从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不能按我的预期发挥作用。

3 个答案:

答案 0 :(得分:6)

这是预期的,因为Properties#contains()会调用File#equals()fs#compare()会委托{{1}},它会按字典顺序比较两个抽象路径名。即,指向同一路径的两个文件确实相同。

答案 1 :(得分:5)

我认为你的问题在于:

 pro.put("file", file);

来自Java文档:

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

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

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

你现在看到了问题吗?

进一步澄清:

执行:System.out.println(pro.contains(file3));时,您最终会file.equals(file3),因此true

当你这样做时:System.out.println(pro.contains(file4));你最终会file.equals(file4),因此false

答案 2 :(得分:1)

参见Property class definition

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方法确定;否则就是假。