java.util.Properties中的重复键

aaa*_*dan 11 java configuration tomcat

当Java .properties文件中存在重复键时,定义的行为是什么?

thing.valueA = 1
thing.valueB = 2

thing.valueA = 99
Run Code Online (Sandbox Code Playgroud)

保证使用哪个值thing.valueA?1,99还是未定义?这种行为记录在哪里吗?

NB.我不是问复制键是否被认为是最佳实践.

Dan*_*zer 7

根据我的理解Properties,load方法的工作方式与此类似:

  1. 将文件拆分为行,
  2. 看下一行,
  3. 使用一些规则确定键值对(参见此处)
  4. 以与put()方法类似的方式将键值对放入Properties实例中

这意味着您的示例将显示99.

加载方法基本上设计为像你坐下来打字一样工作

propInstance.put("Key", "Value");
propInstance.put("Other", "Thing");
etc etc
Run Code Online (Sandbox Code Playgroud)

要了解此行为,请参阅其文档Hashtable.put(),指明它使用新值更新任何重复项.由于Hashtable是Properties的超类,因此Properties也会复制此行为.


Geo*_*man 6

因为这没有在类的规范中定义,我会说这个问题最正确的答案是结果是未定义的,并且可能因实现而异.

但是,因为java.util.Properties继承自java.utils.Hashtable,所以最有可能的实现与@jozefg完全相同,您可以在OpenJDK源中看到Sun实现以这种方式工作(Properties.java:345 as这篇文章的时间).读取每一行,解析它以决定是否需要追加其他行,单独的键和值,将键/值放在Hashtable中.

没有:

  • 检查密钥是否存在
  • 基于密钥的存在而抛出的异常
  • 避免重写值
  • 无序处理

这一切都非常简单,基本上假定你没有使用重复的密钥,或者如果你有,那么你的问题就是整理出来.

现在,当然,要完全确定您要查看所有可能的JVM或至少是您的代码的目标JVM,以确保实现没有区别,但我认为这种实现最有可能.