Java中的toString覆盖

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

public String toString() { if (size == 0) { return "[]"; } else { String output = ""; Node 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; } 

如果我需要详细说明类结构,那么这更有意义让我知道。

使用StringBuilder 。

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

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

除非字符串构建器在更简单的代码或更好的性能方面提供优势,否则应始终使用字符串

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

我假设在类中的其他位置定义了actualElement ,尽管更好的名称可能更好。 if (output.equals(""))是不必要的。 只需使用[启动输出StringBuilder ,然后添加它即可。

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

使用StringBuilder可能会帮你一个忙。这是从AbstractCollection.toString()复制的片段,看看它。

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

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

看看这里:

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

 StringBuilder sb = new StringBuidler(); Node 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();