繁体   English   中英

println如何打印对象

[英]How can println print an object

{
  List list= new ArrayList();
  list.add("one");
  list.add("second");
  System.out.println(list);
}

如何使用对象“列表”,就像在print语句中一样? 我们不需要使用该对象来访问打印列表的方法吗?

prinln(someObject)将打印出someObjecttoString()方法中实现的内容。

您可以使用(假设)toString()为所有对象实现:

System.out.println(list.toString())

请注意,您不应该将返回的字符串用作您实际可以解析的任何内容; 它真的是一个视觉表现。 它也不需要唯一地表示对象。

当你写作

System.out.println(list)

实际上,您是隐式使用toString()方法。

文档说集合中的toString():

返回此集合的字符串表示形式。 字符串表示由一个集合元素的列表组成,它们的迭代器返回它们的顺序,用方括号(“[]”)括起来。 相邻元素由字符“,”(逗号和空格)分隔。 通过String.valueOf(Object)将元素转换为字符串。

当我们将任何对象传递给println()方法时,它将隐式调用该对象的toString()方法。 所以,实际执行的是

System.out.println( list.toString() );

ArrayList继承自类java.util.AbstractCollection,该类具有toString()方法。 因此,在您的情况下,应该执行toString()。

toString()方法返回此集合的字符串表示形式。 字符串表示由一个集合元素的列表组成,它们的迭代器返回它们的顺序,用方括号(“[]”)括起来。 相邻元素由字符“,”(逗号和空格)分隔。 通过String.valueOf(Object)将元素转换为字符串。

看看你的问题和评论,我认为你的困惑最终源于你不确定印刷如何运作。 通常在这种情况下,我建议获取JDK源代码并简单地查看内部。

在这种情况下,我们首先转到System类并检出out成员(因为在System.out上调用了println ):

public final class System {
     ...
     public final static PrintStream out = null;

既然我们现在知道out是一个PrintStream ,那么我们来看看那个类:

public class PrintStream extends FilterOutputStream
    implements Appendable, Closeable
{
    ...
    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

(我们知道它正在调用此方法,因为其他println签名与类型List不匹配)

好的,所以我们看到println使用String.valueOf(Object)将给定的Object (在本例中为List )转换为String 我们来看看这个方法:

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

所以现在我们知道ListtoString()方法用于生成输出。 正如其他人所指出的那样,它在ArrayList被覆盖以提供您看到的输出。

它可以像这样使用,因为类List继承了Object类,而Object类有toString()方法,这意味着每个对象都可以转换为String。

直接打印列表将给出列表的字符串表示。 如果要访问列表中的对象,则需要使用迭代器或循环或高级for循环来进行集合。 例如

for(String s : list){
    System.out.println(s);
  }

那么你可以学习并尝试所有列表方法来修改它。 例如,添加,删除。

此外,如果要打印对象,则会隐式调用toString()方法。

您可以遍历列表中的所有项目以将其打印出来。 你可以使用for循环的while循环来完成这个。

while (list.hasNext) {
  System.out.println((String) list.next());

}

for(String i in list){
   System.out.println(i) ;

不确定这是你想要的,但它是一个选项。

哟需要toString()方法。 当你打印对象Reference时,默认调用toString()方法。 如果你默认看到toString()方法,它会打印出来

 getClass().getName() + '@' + Integer.toHexString(hashCode())

现在根据您的要求,您可以覆盖它以打印列表中的值(String Class也会覆盖它)

在这里你创建了List接口。所以它也允许在列表中添加重复值。我们也可以直接打印像System.out.println(obj)这样的对象; 在List类中,重写了toString方法,以便它将打印其所有内容而不是对象的地址。

的System.out.println(Arrays.toString(myList.toArray()));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM