6

大家好。我正在制作一个词汇应用程序,我需要在其中创建一个 List<String>(或 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]

我的问题是我不能拥有那些空项目,因为这个新列表是 a 上的键HashableMap<String>,所以任何更改都会导致异常,因为键不存在。

使用调试器的列表(tempSOLUTION)详细信息的屏幕截图:http: //www.pabloarteaga.es/stackoverflow.jpg

如何在不创建所有这些空项目的情况下将项目添加到列表中?

搜索后,我找到了关于如何删除这些空项的答案,即:

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

但这对我的目的不起作用。

提前致谢。

4

2 回答 2

14

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

重要的是通过其公共 API 可见的内容。换句话说,调用size()(等等)会告诉你什么。(如果在您的代码示例中没有返回1,那么就会发生一些奇怪的事情!)

于 2013-08-25T23:46:08.460 回答
6

从您的屏幕截图中可以清楚地看出,究竟是什么

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

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

这个缓冲区的大小比实际大小要大,ArrayList因为否则,每次添加新元素时,都objectData应该将整体重新分配为更大的数组并复制所有元素,但这肯定很昂贵。

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

于 2013-08-25T23:52:13.893 回答