为什么toString()方法在Java中的Array和ArrayList对象之间的工作方式不同

时间:2012-12-08 18:16:34

标签: java arrays arraylist tostring

    String[] array = {"a","c","b"};
    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    System.out.println(array);
    System.out.println(list);

输出list [a, b, c],而array输出某个地址。当我们想要输出array值时,我们可以使用Arrays.toString(array);,就像list一样。

我只是想知道为什么我们无法直接在toString()上致电array来获取值。这样做不是更直观和方便吗?什么导致ArrayArrayList上的不同处理?

6 个答案:

答案 0 :(得分:13)

数组和arraylist之间的主要区别在于arraylist是一个用Java编写的类,它有自己的实现(包括重写toString的决定)而数组是语言规范本身的一部分。特别是JLS 10.7州:

  

数组类型的成员是以下所有成员:

     
      
  • 公共最终字段长度
  •   
  • 公共方法clone,它覆盖Object类中的同名方法,并且不会抛出任何已检查的异常。
  •   
  • 从Object类继承的所有成员;唯一没有继承的Object方法是它的克隆方法。
  •   

换句话说,语言规范会阻止数组的toString方法被覆盖,因此它使用Object中定义的默认实现来打印类名和哈希码。

为什么做出这个决定是一个应该向语言设计者提出的问题......

答案 1 :(得分:4)

  

我只是想知道为什么我们不能直接在数组上调用toString()来获取   价值观。

实际上,在数组对象上调用了toString方法。但是,由于数组类型不会覆盖toString类的Object方法,因此调用toString的默认实现,返回您看到的表单的表示形式。

表示形式为: -

[typeOfArray@hashCode

在你的情况下,它是这样的: -

[Ljava.lang.String;@3e25a5

然而,在ArrayList个实例的情况下,调用toString类中的重写ArrayList方法。

答案 2 :(得分:3)

简短的回答是因为toString是在几个不同的地方定义的,具有不同的行为。

Arrays类将toString定义为静态方法,可以像

一样调用
Arrays.toString(arr_name);

但是Arrays类也从Object类继承了非静态方法toString。因此,如果在实例上调用它,它会调用Object.toString,它返回对象的字符串表示形式(例如:[Ljava.lang.Object; @ 4e44ac6a]

因此Arrays.toString()和MyObject.toString()调用具有相同名称的不同方法。

ArrayList类从AbstractCollection类继承toString,它是一个非静态方法,因此可以在对象上调用,如:

MyArrayList.toString();

因为它是集合的字符串表示而不是对象,所以结果是可读格式的值,如[one,two]。

答案 3 :(得分:0)

因为当您打印toString()时,默认情况下会打印className@HashCode

因此,当您打印array时,将打印上面的内容。

ArrayListAbstractCollection类扩展,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(' ');
        }
    }

打印ArrayList对象的可读格式。

答案 4 :(得分:0)

这是ArrayList的toString方法调用。但是对于Arrays,你无法找到它。

 /**
 * 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
 * (<tt>"[]"</tt>).  Adjacent elements are separated by the characters
 * <tt>", "</tt> (comma and space).  Elements are converted to strings as
 * by {@link String#valueOf(Object)}.
 *
 * @return a string representation of this collection
 */
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(' ');
    }
}

答案 5 :(得分:-1)

对于array toString()方法,它会打印内存地址。但是在ArrayList中,此类会覆盖Object toString()方法。

to Array()实现ArrayList

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