包含和不添加空字符串的ArrayList行为

时间:2015-08-09 17:08:43

标签: java arraylist data-structures whitespace

新创建的ArrayList没有添加任何元素,就像ArrayList中添加了一个空字符串一样。

这让我觉得新创建的ArrayList即使没有添加任何元素也会在其中添加默认的空string或元素。

package cracking;

import java.util.ArrayList;

public class Ask
{
    public static void main(String[] args)
    {
        ArrayList<String> al = new ArrayList<String>();
        System.out.println(al.size());//0
        System.out.println(al);//[]

        al.add("");
        System.out.println(al.size());//1
        System.out.println(al);//[]
    }
}

但是,两种情况下ArrayList的大小之间的差异使它们不一致,特别是因为打印出的两个ArrayList看起来一样。

为了保持一致性,我觉得,两个中的任何一个都会很好:

  1. 刚创建的ArrayList的大小,即之前的大小 添加任何元素应该显示1暗示空字符串或 元素,因为即使添加到ArrayList也会使它看起来一样。
  2. 不应该允许打印出新创建的ArrayList 应该只打印NULL或其他东西而不是像它一样显示[] 现在显示

3 个答案:

答案 0 :(得分:6)

for (int i = 0; i < nodesAndServices.size(); i++) { List<Character> eachListRow = nodesAndServices.get(i); for (Character chr : eachListRow) { allChars.add(chr); } } 的{​​{1}}实施会让您受到欺骗。见这里:

toString

您的收藏集的大小为1,但它不会打印任何内容,包括逗号字符AbstractCollection,因为它只有一个。尝试添加multilpe emptry字符串,您将更清楚地看到结果。

public String More ...toString() {
   Iterator<E> i = iterator();
    if (! i.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = i.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! i.hasNext())
            return sb.append(']').toString();
        sb.append(", ");
    }
}

答案 1 :(得分:2)

[]代表空列表。这是按照惯例,但我认为你会发现这是合理的。

打印ArrayList在其包含的每个对象上使用toString以显示这些内容的打印表示。打印字符串时(使用toString),引号不包含在中。

考虑对您的代码进行以下修订:

ArrayList<String> al = new ArrayList<String>();

al.add("");
al.add("");
al.add("");
System.out.println(al);//[]

输出结果为:

[, , ]

我们也可能在打印ArrayList时抱怨使用括号,但请注意,toString的输出通常仅用于调试,不应依赖于编程。

来自toString的{​​{3}}:

  

通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于人们阅读。

对于您的示例,此分解一下:使用单个空ArrayList<strin>打印string并不是特别有用。如果您需要检查/验证收藏品的内容,例如为了进行调试,您还应该打印length

答案 2 :(得分:1)

ArrayList正在使用您在toString调用中放置的对象的toString。这看起来很奇怪的原因是因为打印空字符串不打印任何内容。

理想情况下,人们不会选择在列表中存储空字符串,而是会进行检查以确保只有非空字符串才会进入其中。

if(!"".equals(value)) {
    al.add(value);
}