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

tub*_*bby -1 java whitespace arraylist data-structures

新创建的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);//[]
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,ArrayList两个场景中的大小之间的差异使它们不一致,特别是因为ArrayList打印出来的两个看起来一样.

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

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

Kon*_*Kon 6

你被toString实施所欺骗了AbstractCollection.看这里:

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(", ");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

al.add("");
al.add("");
al.add("");
al.add("");
al.add("");
System.out.println(al); // Prints [, , , , ]
Run Code Online (Sandbox Code Playgroud)

  • 故事的道德是:不要依赖`toString()`来获得代码的正确性.它不是为它而设计的. (3认同)