【问题标题】:ArrayList automatically adding null itemsArrayList 自动添加空项
【发布时间】:2013-08-28 09:27:46
【问题描述】:

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

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

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

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

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

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

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

提前致谢。

【问题讨论】:

    标签: java android list arraylist null


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢,解决了我的问题:) 只要系统允许,我就会接受它作为答案。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 好的,非常感谢。不知道是这样的。那么,如果我的数组大于 12 项,那么缓冲区会更大吗?很抱歉没有投票,但我没有足够的代表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多