put(key,value)在java中的多级hashMap中

时间:2015-07-15 07:47:24

标签: java hashmap

该计划如下:

// REQUIRES ES6
var rightPane = $("#right");
// Draw the right pane
rightPane.html(`
    <h2>${task.task}<h2> <hr />
    data1: <input type="text" id="data1" value="${task.data1}" /> <br /> 
    data2: <input type="text" id="data2" value="${task.data2}" /> <br /> 
    data1: <input type="text" id="data3" value="${task.data3}" /> <br /> 
    <input type="button" id="subUpdated" value="Save">
    `);

假设&#34;数据&#34;在每个级别都不是空的。 问题出现在以下步骤中。

Hash<String, HashMap<String, HashMap<String, String>>> data = new Hash<String, HashMap<String, HashMap<String, String>>>();

HashMap<String, String> person = new HashMap<String, String>();
        person.put("Name", json.getString("Name"));
        person.put("Contact", json.getString("Contact"));
        person.put("Email", json.getString("Email"));
        person.put("Rent Start", json.getString("Rent Start"));
        person.put("Rent End", json.getString("Rent End"));

String period = json.getString("Rent Start").substring(0, 7) + " To " + json.getString("Rent End").substring(0, 7);

data.get(roomType).put(period, person);

当我这样做时,第二级中的hashmap中的所有值都成为人员hashmap。

  

例如,在&#34; roomtype1&#34;中,有2个时段,&#34; 2015-07到2016-07&#34;   和&#34; 2015-07至2017-07&#34;。

当我运行此代码时:

data.get(roomType).put(period, person);

获取的hashmap

data.get(roomtype1).put("2015-07 To 2016-07", person);

也变为data.get(roomtype1).get("2015-07 To 2017-07");

我可以知道为什么吗?

(p.s。原始的hashmap有5个级别。我为这篇文章减少了它,因为它更容易理解)

2 个答案:

答案 0 :(得分:0)

Java对象是引用类型。

data.get(key1)将获得第二级的hashmap对象。使用该对象,您将再添加一个对象。

答案 1 :(得分:0)

  

当我这样做时,hashmap中的所有值都在第二级   成为附加的hashmap。

data.get(roomType)是什么?它是否做了类似的事情:

public V get(K key) {
  V actual = super.get(key);
  if (null == actual) {
    actual = getANewV();
    super.put(key, actual);
  }
  return actual;
}

您确定getANewV()总是返回一个新实例而不是相同(这将解释第二级中的散列图中的所有值成为添加散列映射)。

你对Multimap的需求已经存在(见番石榴)。您可能应该看看是否适合您。 除此之外,我个人使用对象而不是多层地图。