我正在使用HashSet,它具有一些用于所有元素的属性,然后将此Hashset添加到对应于每个元素的HashMap。此外,为特定元素添加的属性很少(例如THEAD)。
但是后来添加的属性 align 对于Table和THEAD都存在。以下代码中是否有问题。
private static HashMap<String, Set<String>> ELEMENT_ATTRIBUTE_MAP =
new HashMap<String, Set<String>>();
HashSet<String> tableSet =
new HashSet<String>(Arrays.asList(new String[]
{HTMLAttributeName.style.toString(),
HTMLAttributeName.color.toString(),
HTMLAttributeName.dir.toString(),
HTMLAttributeName.bgColor.toString()}));
ELEMENT_ATTRIBUTE_MAP.put(HTMLElementName.TABLE, new HashSet<String>(tableSet));
// Add align only for Head
tableSet.add(HTMLAttributeName.align.toString());
ELEMENT_ATTRIBUTE_MAP.put(HTMLElementName.THEAD, tableSet);
答案 0 :(得分:1)
您的代码应该按预期工作。请考虑以下(简化)示例,该示例显示行为:
public static void main(String[] args) {
String[] array = new String[] {"a", "b", "c"};
HashSet<String> strings = new HashSet(Arrays.asList(array));
Map<String, Set<String>> map = new HashMap();
Map<String, Set<String>> newMap = new HashMap();
Map<String, Set<String>> cloneMap = new HashMap();
map.put("key", strings);
newMap.put("key", new HashSet(strings));
cloneMap.put("key", (Set<String>) strings.clone());
strings.add("E");
System.out.println(map); //{key=[E, b, c, a]}
System.out.println(newMap); //{key=[b, c, a]}
System.out.println(cloneMap); //{key=[b, c, a]}
}
请注意,Java变量是对象的引用,而不是对象本身,因此当您调用map.put("key", strings)
时,它是对传递的基础HashSet
的引用;因此,当您稍后更新HashSet
时,HashMap
也会更新。