HashSet值被错误地计算

时间:2012-10-10 09:53:21

标签: java hashmap hashset

我正在使用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);

1 个答案:

答案 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也会更新。