在Java中什么时候使用Properties,什么时候使用Map?

14

Map和Properties都是键值对,它们之间的区别在哪里?

9个回答

13

12

Properties是一个用于Map<String,String> + 一些I/O方法的外观模式

是否需要I/O方法?需要就使用,不需要就不用。


2
使用实现了Map接口但不是Properties类的类。Properties类存在问题。由于它底层是Hashtable,所以有些方法会破坏一致的字符串到字符串映射。它的不变量很容易被打破(无论是错误地还是故意地)。使用其他实现Map接口的类。如果你想要线程安全,使用Collections.synchronizedMap(myUnsyncdMap)来创建一个。
理想情况下,这两个类之间除了其他答案中提到的1或2个方法没有区别。然而,Properties实现实际上是奇怪的 - 其他从Map接口派生的类更安全,提供更好的静态类型和可能更快的速度(取决于你需要什么)。快速查看实现(特别是它派生自哪个类)足以使你避免它 :)

1

每个键的默认系统 是 Properties 的另一个特性,Hashtable 中没有。例如:

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;

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


1
有趣的观点,但请注意,如果在示例中将“Properties”替换为“Hashtable”(并将“getProperty”替换为“get”),则结果将相同。 但是,在p0上的setProperty调用之前构建p1的移动,引用与复制语义将变得清晰明了。然而,调用get而不是getProperty将绕过Properties的默认值行为。 - SensorSmith

1

0

Properties IS-A Map which IS-A Hashtable. 是否应该这样做是一个不同的问题 - 我认为它应该通过组合获得Map,而不是实现Map接口。

Properties类用于Properties文件 - 这就是为什么它有load方法来读取文件。所以如果你正在处理属性文件等。

propa = bob
propb = jane

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


3
修正:Properties是Hashtable的一种,而Hashtable又是Map的一种。 - BalusC

0

Properties 主要用于基于配置数据和本地化,而 Map 更通用。


0

0
根据文档,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接