首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解HashMap -将数据插入HashMap

理解HashMap -将数据插入HashMap
EN

Stack Overflow用户
提问于 2014-07-07 11:05:47
回答 4查看 452关注 0票数 1

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

我很难理解HashMap是如何工作的。这是我在做的..。

代码语言:javascript
复制
Map<Integer, List<String>> data = new HashMap<Integer, List<String>>();
List<String> dataValues;

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

代码语言:javascript
复制
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();

现在在别的地方..。我试图用key = 1从列表中检索值。

代码语言:javascript
复制
List<String> dataValue = new ArrayList<String>();
dataValue = data.get(1);

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

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

我的问题是,当我这么做的时候,data.put(1,dataValues),它是否在HashMap中保持对dataValues的引用,因此我得到0的大小,因为我在下一步中清除它?如果是这样的话,我必须为要插入到HashMap中的每一组值创建一个列表?或者我能用一个单子做这件事吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-07 11:08:07

而不是dataValues.clear();

每次创建一个新实例时,都应该创建

代码语言:javascript
复制
dataValues = new ArrayList<String>();
票数 2
EN

Stack Overflow用户

发布于 2014-07-07 11:11:41

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

票数 0
EN

Stack Overflow用户

发布于 2014-07-07 11:16:34

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

代码语言:javascript
复制
dataValues.clear()

您仍然使用相同的项引用相同的列表。这样你就可以

代码语言:javascript
复制
dataValues = new ArrayList<String>();

这与Android关系不大,但与计算机科学中更重要的概念有关。您一定要深入研究数据结构!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24609140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档