Java中的toString覆盖

时间:2013-04-04 14:29:00

标签: java performance tostring

这个问题来自作业。我必须在创建循环链接列表的类中覆盖toString()方法,实际上我有一个工作得很好的toString()方法,它将所有测试都传递给所有东西。所以我的项目是自动进行的,它显然不赞成我的方法100%。所以我的问题是:有没有更好的方法来编写这个更有效的toString()方法?

public String toString()
    {
        if (size == 0)
        {
            return "[]";
        }
        else
        {
            String output = "";
            Node<E> tempNode = actualElement;
            while (tempNode.next() != actualElement)
            {
                if (output.equals(""))
                {
                    output = "[" + output + tempNode.data().toString();
                    tempNode = tempNode.next();
                }
                else
                {
                    output = output + ", " + tempNode.data().toString();
                    tempNode = tempNode.next();
                }

            }
            output = output + ", " + tempNode.data().toString() + "]";
            return output;
        }

如果我需要详细说明课程结构,以便更有意义,请告诉我。

6 个答案:

答案 0 :(得分:4)

使用StringBuilder

StringBuilder builder = new StringBuilder();
builder.append("some text");
builder.append("more text");
return builder.toString();

答案 1 :(得分:0)

为了进一步改进,您可以使用StringBuilder并附加每个计算的字符串文字。这样可以节省JVM创建单个String文字的负载,从而提高性能。

答案 2 :(得分:0)

首先,您应该使用StringBuilder来串联字符串。

看看这里:

http://javarevisited.blogspot.co.at/2011/07/string-vs-stringbuffer-vs-stringbuilder.html

StringBuilder sb = new StringBuidler();
Node<E> tempNode = actualElement;

while (tempNode.next() != actualElement)
{
    if (sb.length() == 0)
    {
        sb.append("[").append(tempNode.data().toString());
    }
    else
    {
        sb.append(", ").append(tempNode.data().toString());
    }
    tempNode = tempNode.next();
}
sb.append(", ").append(tempNode.data().toString()).append("]");
return sb.toString();

答案 3 :(得分:0)

除非string builders在更简单的代码或更好的效果

方面提供优势,否则应始终使用

Strings

如果您需要连接大量字符串,则附加到StringBuilder object会更强

答案 4 :(得分:0)

使用StringBuilder可能会帮助您。这是从AbstractCollection.toString()复制的代码段,请看一下。

 public String 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(", ");
}
}

答案 5 :(得分:0)

我认为actualElement是在类的其他地方定义的,虽然更好的名称可能更好。 if (output.equals(""))是不必要的。只需使用[开始输出StringBuilder,然后添加到它。

但是,您依赖于您的列表实际上是循环的。如果此列表最终没有循环,您将获得NPE。并且,如果列表看起来更像6,如[A,B,C,D,E,C,D,E ...],那么循环将永远不会结束。