2013-08-25 46 views
6

大家好。 我正在制作一个词汇应用程序,其中我需要创建一个 List<String>(或ArrayList)。要做到这一点,我创建了下面的一段代码(只是一个例子):ArrayList自动添加空项

List<String> tempSOLUTION = new ArrayList<String>(); 
String temp = "abc123"; 
tempSOLUTION.add(temp); 

我也试过如下:

tempSOLUTION.add(new String(temp)); 

他们两个的项目添加到列表,但在调试时,我发现它的阵列有12个对象,有以下几种:

[abc123, null, null, null, null, null, null, null, null, null, null, null] 

我的问题是,我不能有那些空的项目,因为这个新的列表是一个HashableMap<String>关键,所以任何改变意志导致异常,因为密钥不存在。 http://www.pabloarteaga.es/stackoverflow.jpg

我如何将项目添加到列表中,而无需创建所有的空项:使用调试器列表(tempSOLUTION)细节的

截图?

已经搜索完毕之后,我发现如何删除这些空项目一个答案,那就是:

tempSOLUTION.removeAll(Collections.singleton(null)); 

但它并不适用于我的目的工作。

在此先感谢。

回答

15

你可能正在用调试器查看它的内部数组。这没关系;它只是一个实现细节。

重要的是通过其公共API可以看到什么。换句话说,要求size()(等等)告诉你。 (如果这不你的代码示例返回1,然后奇怪的事情是怎么回事!)

+0

非常感谢你,解决了我的问题:) 只要系统允许我接受它作为答案。 – vagaerg

6

从你的截图很清楚,究竟是什么

[abc123, null, null, null, null, null, null, null, null, null, null, null] 

不是ArrayList本身,而是其成员变量objectData恰好是ArrayList的内部缓冲区(它实际上存储了添加到其中的元素)。

此缓冲区的尺寸大于ArrayList的实际尺寸,否则每次添加新元素时,整个objectData都应该重新分配为更大的阵列并复制所有元素,但这确实很昂贵。

按照Oli的建议,只需忽略实现细节并只信任接口。

+0

好的,非常感谢。不知道是那样。 那么,如果我的数组大于12个项目,那么缓冲区会更大? 抱歉没有投票,但我没有足够的代表。 – vagaerg