当 Java 属性文件中有重复的键时会发生什么情况?

2022-09-03 13:44:39

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

thing.valueA = 1
thing.valueB = 2

thing.valueA = 99

哪个值保证用于 ?1、99 还是未定义?这种行为是否在任何地方都有记录?thing.valueA

铌。我不是在问重复密钥是否被认为是最佳实践。


答案 1

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

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

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

加载方法基本上被设计为工作,就好像你已经坐下来打字一样。

propInstance.put("Key", "Value");
propInstance.put("Other", "Thing");
etc etc

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


答案 2

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

但是,由于java.util.Properties继承自java.utils.Hashtable,因此最有可能的实现与@jozefg所描述的完全相同,您可以在OpenJDK源代码中看到Sun实现以这种方式工作(Properties.java:345)。截至撰写本文时)。读取每一行,解析它以决定是否需要附加其他行,分离键和值,将键/值放在哈希表中。

没有:

  • 检查密钥是否存在
  • 基于密钥的存在引发的异常
  • 避免覆盖值
  • 无序处理

这一切都非常简单,基本上假设你没有使用重复的密钥,或者如果你有,那就是你的问题来解决。

现在,当然,为了完全确定您需要查看所有可能的JVM或至少是代码的目标JVM,以确保实现不会有所不同,但我认为此实现是最有可能的。