了解HashMap - 将数据插入HashMap

时间:2014-07-07 11:05:48

标签: android hashmap

[编辑]:HashMap存储对ArrayList的引用,而不是副本。因此,创建一个新的ArrayList实例对于插入新的项目集是必要的。


我无法理解HashMap的工作原理。这就是我在做什么..

Map<Integer, List<String>> data = new HashMap<Integer, List<String>>();
List<String> dataValues;

代码中的某处..添加虚拟数据..

dataValues = new ArrayList<String>();
dataValues.clear();

dataValues.add("Product - Nike : 20% OFF just today");
dataValues.add("Product - Adidas : 30% OFF on Shoes");
dataValues.add("Product - Puma : 40% OFF Weekend Sale");
dataValues.add("Product - Zapper : 50% OFF Clearence Sale");
data.put(1, dataValues);

dataValues.clear();

dataValues
        .add("Product - Dining Table : FLAT 50% OFF on all dining tables - Just for today");
dataValues
        .add("Product - Chairs : New Arrival - SOFA cum CHAIR convertible");
dataValues.add("Product - Organisers : Buy 1 Get one Free");
dataValues
        .add("Product - Decorative Pillows : New Arrival - Transformers 4 theme");
data.put(2, dataValues);

dataValues.clear();

dataValues
        .add("Product - Ice Cream Bonanza : Get 25% more on all IceCreams");
dataValues
        .add("Product - Vanilla : Get 50% extra in the next one hour");
dataValues
        .add("Product - Butterscoth : Get 100% extra in the next 15 mins");
dataValues
        .add("Product - Pista : Get Family pack icecream free if you visit our store in the next 5 mins");
data.put(3, dataValues);

dataValues.clear();

dataValues
        .add("Product - Skaters Delight : Get skating set for FLAT 50% OFF");
dataValues
        .add("Product - Cricket Mania : Get Cricketing gear for 25% OFF");
dataValues
        .add("Product - Football Fever : Buy any shoe and get a Football Free");
dataValues.add("Product - Rugby : Kill yourself with a Rugby armour");
data.put(4, dataValues);

dataValues.clear();

现在在其他地方..我正在尝试从List中检索值,键= 1。

List<String> dataValue = new ArrayList<String>();
dataValue = data.get(1);

当我尝试使用dataValue.size()获取dataValue的大小时,我得到的大小为0.

如果我没有清除dataValues列表,在上面的代码中的每个data.put()语句之后,那么它的工作就好了。我得到dataValue.size()

的非零值

我的问题是,当我这样做时,data.put(1,dataValues),它是否继续引用HashMap中的dataValues,因此我的大小为0,因为我将在下一步中清除它?如果是这样,我必须为我想插入HashMap的每组值创建一个List?或者我有一种方法可以使用一个List吗?

3 个答案:

答案 0 :(得分:2)

而不是dataValues.clear();

每次都要创建

的新实例
dataValues = new ArrayList<String>();

答案 1 :(得分:0)

这是因为您每次都放置相同的对象但使用不同的键。因此,当您致电clear()时,HashMap中的所有值都会被清除。尝试为每个值创建一个新对象。请记住,List<String> dataValues只存储对象的引用。

答案 2 :(得分:0)

是。所以在java和许多其他编程语言中,动态创建的对象都存储在堆上,所以当你

dataValues.clear()

您仍然使用相同的项目引用相同的列表。所以你可以设置

dataValues = new ArrayList<String>();

这与Android没什么关系,但与计算机科学中更重要的概念有关。你绝对应该深入研究数据结构!