Properties.contains()的意外输出

Rav*_*ain 1 java properties file

我从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
Run Code Online (Sandbox Code Playgroud)

我期待Properties检查是否存在File,但这似乎不起作用.有人可以帮我解释为什么file3不能像我期望的那样工作.

Edv*_*yse 6

这是预期的,因为Properties#contains()将调用File#equals(),而后者将按fs#compare()字典顺序委托比较两个抽象路径名.即,指向同一路径的两个文件确实相等.

  • +1.既然`file.equals(file3)`那么人们会怎么想呢?但是*首先不要将非String事物放入Properties对象*中! (5认同)

Kaz*_*ara 5

我认为你的问题在于:

 pro.put("file", file);
Run Code Online (Sandbox Code Playgroud)

来自Java文档:

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

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

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

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

进一步澄清:

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

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