在Java中何时使用属性和何时映射?

在Java中何时使用属性和何时映射?,java,Java,Map和Properties之间的区别在于它们都有键值对。Properties类实现Map接口。 Properties类具有将其内容保存到流的方法 看看: 如果不需要保存内容,请使用“普通”映射实现,如HashMap映射用于代码中的正常键值对使用。属性通常用于存储和加载文件中的配置值。属性的底层实现使用映射 有关如何以及何时使用特性的快速教程,请参见下面的链接 属性主要用于基于配置的数据和本地化,而Map则更通用。属性对象是Map。例如,见。即Properties类实现映射接口。根据文档 是一

Map和Properties之间的区别在于它们都有键值对。

Properties类实现Map接口。 Properties类具有将其内容保存到流的方法

看看:


如果不需要保存内容,请使用“普通”映射实现,如HashMap

映射用于代码中的正常键值对使用。属性通常用于存储和加载文件中的配置值。属性的底层实现使用映射

有关如何以及何时使用特性的快速教程,请参见下面的链接


属性主要用于基于配置的数据和本地化,而Map则更通用。

属性对象是Map。例如,见。即Properties类实现映射接口。

根据文档

  • 是一个接口
  • 是实现该接口的类

    • 属性是一个映射,它是一个哈希表。是否应该是一个不同的问题-我认为它应该真正通过合成获得地图,而不是实现地图接口

      Properties类用于属性文件-这就是为什么它有load方法来读取文件。因此,如果您正在处理属性文件,例如

      propa = bob
      propb = jane
      

      然后使用属性。否则,您将需要创建自己的映射接口并选择适当的实现,例如HashMap

      使用正在实现映射接口但不是Properties类的类。属性类已断开。因为它下面是一个哈希表,所以有一些方法会破坏原本一致的字符串到字符串的映射。它的不变量很容易被破坏(无论是错误的还是故意的)。使用实现映射接口的任何其他方法。如果您的目标是线程安全,请使用Collections.synchronizedMap(myUnsyncdMap)创建一个


      理想情况下,除了其他答案中提到的一种或两种方法外,这两个类之间没有区别。然而,属性实现实际上很奇怪——从Map接口派生的其他类更安全,提供更好的静态类型,并且可能更快(取决于您的需要)。快速查看实现(特别是它派生的类)应该足以说服您避免它:)

      Properties
      是一些I/O方法的映射


      您需要I/O方法吗?使用它:不要使用。

      A每键默认系统
      属性的另一个功能
      哈希表中不存在。例如:

      Properties p0 = new Properties();
      p0.setProperty("a", "0");
      p0.setProperty("b", "1");
      Properties p1 = new Properties(p0);
      p1.setProperty("a", "10");
      assert p1.getProperty("a").equals("10");
      assert p1.getProperty("b").equals("1");
      assert p1.getProperty("c") == null;
      

      在父属性中递归搜索默认值。

      重分类:属性是一个哈希表,它是一个映射。有趣的一点是,在示例中,如果将
      属性
      替换为
      哈希表
      (以及
      getProperty
      替换为
      get
      ),结果将是相同的。但是,在
      setProperty
      调用
      p0
      之前移动
      p1
      的构造,引用与复制语义将变得清晰。但是,调用
      get
      而不是
      getProperty
      将绕过
      Properties
      的默认值行为。