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

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

4

11 回答 11

5

prinln(someObject)将打印出在someObject'stoString()方法中实现的任何内容。

于 2013-06-13T08:48:46.330 回答
2

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

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

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

当你写

System.out.println(list)

实际上,您正在toString()隐式使用该方法。

于 2013-06-13T08:48:30.503 回答
1

查看您的问题和评论,我认为您的困惑最终源于您不确定打印的工作原理。一般来说,在这种情况下,我建议获取 JDK 源代码并简单地查看内部。

在这种情况下,我们将首先进入System班级并检查out成员(因为println被调用了System.out):

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

既然我们现在知道那out是 a 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将给定的ObjectList在这种情况下是您的)转换为Stringusing String.valueOf(Object)。让我们看看这个方法:

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

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

于 2013-06-13T11:29:31.093 回答
1

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

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

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

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

于 2013-06-13T09:02:15.070 回答
1

Docs 说关于集合中的 toString() :

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

于 2013-06-13T08:48:24.297 回答
0

在这里您正在创建 List 接口。因此它也允许在列表中添加重复值。我们也可以直接打印对象,如 System.out.println(obj); 在 List 类内部,toString 方法被覆盖,因此它将打印其所有内容而不是对象的地址。

于 2013-06-13T09:17:12.490 回答
0

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

于 2013-06-13T09:18:45.993 回答
0

您可以遍历列表中的所有项目以将它们打印出来。您可以使用 for 循环的 while 循环来执行此操作。

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

}

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

不知道这是否是你要找的,但它是一个选项。

于 2013-06-13T08:53:23.987 回答
0

之所以可以这样使用,是因为 List 类继承了 Object 类,而 Object 类有 toString() 方法,这意味着每个对象都可以变成一个 String。

于 2013-06-13T08:48:53.677 回答
0

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

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

好吧,您可以研究并尝试所有列表方法来修改它。例如添加、删除。

此外,如果您正在打印一个对象,则隐式调用 toString() 方法。

于 2013-06-13T08:51:37.530 回答
0

你需要 toString() 方法。当您打印 object Reference 时,默认情况下会调用 toString() 方法。如果您默认查看 toString() 方法,它会打印

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

现在根据您的要求,您可以覆盖它以打印列表中的值(字符串类也覆盖它)

于 2013-06-13T09:08:43.763 回答