【Java踩坑记】——ArrayList的toString()

本文详细探讨了在Java中ArrayList使用toString()方法时,数据之间出现额外空格的原因。通过追溯代码,发现在AbstractCollection类中的toString实现中,每个元素之间被拼接了一个空格。此外,文章还提到了sb.append(e == this ? "(this Collection)" : e)这段代码的重要性,避免了可能导致StackOverflowError的无限递归情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

        List<String> list=new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        System.out.println(list.toString());

结果输出:

[张三, 李四, 王五]

从结果我们会发现,不难发现,从第二个数据开始,每个数据的前面多了一个空格字符。

问题查找:

首先我们来看看ArrayList的定义:

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

在我们ArrayList中我们并没有看到toString的具体实现。我们猜测,这个toString方法应该是从AbstractList类中继承而来的。而AbstractList中也并没有toString方法。

继续向上看AbstractList的定义:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>

我们在AbstractCollection类中,发现了toString方法。来看看AbstractCollection中的toString的实现:

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

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

从代码中,我们确实可以看到,在toString方法中有一个.append(' ')来拼接了一个空格字符进去。所以我们在使用list.toString()方法的时候,出现了空格。

 

 

 

补充:

关于sb.append(e == this ? "(this Collection)" : e)

        List<Object> list=new ArrayList<Object>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add(list);
        System.out.println(list.toString());

假设我们将代码改成这样,  如果没有上面的判断语句会怎样?

那么我们的如果写入了这样上面的这样一段代码,  将会出现StackOverflowError的错误, 直接调用sb.append(e),  在循环到list的时候,还是会调用该toString()方法,导致无限循环.

我们可以来验证下我们的猜想

public class MyArrayList<E> extends ArrayList
    {
        @Override
        public String toString()
        {
            Iterator<E> it = iterator();
            if (! it.hasNext())
                return "[]";

            StringBuilder sb = new StringBuilder();
            sb.append('[');
            for (;;) {
                E e = it.next();
                sb.append(e);
                if (! it.hasNext())
                    return sb.append(']').toString();
                sb.append(',').append(' ');
            }
        }
    }

调用上面的类自己单步试试吧!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值