(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()
方法有疑问-
- 打印链表时内部发生了什么?
- 如果我将一些整数存储在链表中,Integer class 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 的源代码:
哪个(几步之后)最终实现了 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(' ');
}
}
现在我们需要找出使用 .append()
添加 e
时 StringBuilder
做了什么
可在 StringBuilder 源代码中找到
@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();
}
所以你的问题的答案是:是的,它会调用 Integer
的 toString
方法。
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?
是的。
我创建了一个 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()
方法有疑问-
- 打印链表时内部发生了什么?
- 如果我将一些整数存储在链表中,Integer class 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 byString.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 的源代码:
哪个(几步之后)最终实现了 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(' ');
}
}
现在我们需要找出使用 .append()
e
时 StringBuilder
做了什么
可在 StringBuilder 源代码中找到
@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();
}
所以你的问题的答案是:是的,它会调用 Integer
的 toString
方法。
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
classtoString()
method would have been called?
是的。