(this) 覆盖 LinkedList class 的 tostring 方法如何工作?

How does (this) overriding tostring method for LinkedList class work?

我创建了一个 class Test 存储 class Pair 库中定义的链表数据结构中的对象。为了打印 Pair class 对象,我重写了成对 class 的方法,它的工作原理如下所示 -

import java.util.LinkedList;

class Test{
    static LinkedList<Pair> list=new LinkedList<Pair>();
    public static void main(String[] args){
        list.add(new Pair(31,78));
        list.add(new Pair(89,67));
        list.add(new Pair(90,43));

        System.out.println(list);
    }
}

class Pair{
    int x;
    int y;
    Pair(int m, int n){
        x=m;
        y=n;
    }
    @Override
    public String toString(){
        return "{ "+ this.x + ", " +this.y+" }";
    }
}

输出-

[{ 2, 4 }, { 6, 3 }, { 12, 6 }]

我对 toString() 方法有疑问-

LinkedList<E>.toString()的实现继承自AbstractCollection<E>documented 是这样的:

Returns a string representation of this collection. The string representation consists of a list of the collection's elements in the order they are returned by its iterator, enclosed in square brackets ("[]"). Adjacent elements are separated by the characters ", " (comma and space). Elements are converted to strings as by String.valueOf(Object).

因此对每个元素调用 String.valueOf - 这反过来又会为任何非空元素调用 Object.toString()。在你的例子中,你已经在 Pair 中覆盖了它,所以这就是所谓的。

如果在 Pair.toString 中添加一些登录信息,如下所示:

public String toString(){
    String ret = "{ "+ this.x + ", " +this.y+" }";
    System.out.println("toString called: returning " + ret;
    return ret;
}

...您可以看到它被调用(或者您可以使用调试器)。是的,如果列表包含整数,则列表的字符串表示形式将是“[1, 2, 3, 4, 5]”或其他任何内容。 (String.valueOf 可能被优化为直接处理数字类型,但 逻辑上 它会调用 Integer 中的 toString() 覆盖。)

这是 LinkedList 的源代码:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/LinkedList.java

哪个(几步之后)最终实现了 AbstractCollection

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/AbstractCollection.java

你可以看到 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(' ');
        }
    }

现在我们需要找出使用 .append()

添加 eStringBuilder 做了什么

可在 StringBuilder 源代码中找到

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/StringBuilder.java

    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

现在的问题是,String.valueOf 是做什么的?

这是来源:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java

    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

所以你的问题的答案是:是的,它会调用 IntegertoString 方法。

Does object class uses the end class's toString() method to print

不,println方法调用list对象toString()方法。

LinkedList 有一个 toString() 实现调用列表中所有对象的 toString() 方法来构建 [item1, item2, ...] 字符串。

这当然意味着您的 toString() 方法被 LinkedList 调用,而不是 Object class.

If I would have stored some integers in a linked list, would Integer class toString() method would have been called?

是的。