编辑: 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();现在在别的地方..。我试图用key = 1从列表中检索值。
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中的每一组值创建一个列表?或者我能用一个单子做这件事吗?
发布于 2014-07-07 11:08:07
而不是dataValues.clear();,
每次创建一个新实例时,都应该创建
dataValues = new ArrayList<String>();发布于 2014-07-07 11:11:41
之所以会发生这种情况,是因为每次都放置相同的对象,但使用不同的键。因此,当您调用clear()时,HashMap中的所有值都将被清除。尝试为每个值创建一个新对象。请记住,List<String> dataValues只存储对对象的引用。
发布于 2014-07-07 11:16:34
是。因此,在java和许多其他编程语言中,动态创建的对象存储在堆中,所以当
dataValues.clear()您仍然使用相同的项引用相同的列表。这样你就可以
dataValues = new ArrayList<String>();这与Android关系不大,但与计算机科学中更重要的概念有关。您一定要深入研究数据结构!
https://stackoverflow.com/questions/24609140
复制相似问题