15
    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);

forlist [a, b, c]是输出,而对于array某些地址是输出。当我们想要输出array值时,我们可以使用Arrays.toString(array);which 就像list.

我只是想知道为什么我们不能toString()直接调用array来获取值。这样做不是更直观方便吗?Array和的不同处理会导致什么结果ArrayList

4

6 回答 6

17

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

数组类型的成员全部如下:

  • 公共最终字段长度
  • 公有方法clone,覆盖Object类中的同名方法,不抛出检查异常。
  • 继承自类Object的所有成员;Object 唯一不被继承的方法是它的 clone 方法。

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

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

于 2012-12-08T18:21:09.747 回答
4

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

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

表示形式为: -

[typeOfArray@hashCode

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

[Ljava.lang.String;@3e25a5

而在实例的情况下,将调用类中ArrayList的覆盖toString方法。ArrayList

于 2012-12-08T18:20:31.047 回答
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();

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

于 2014-03-08T15:37:34.040 回答
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

于 2012-12-08T18:21:33.313 回答
0

这是 ArrayList 的 toString 方法调用。但是对于数组你找不到这样的。

 /**
 * 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(' ');
    }
}
于 2012-12-08T18:23:26.203 回答
-1

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

ArrayList 的 toString() 实现

   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(", ");
    }
}
于 2012-12-08T18:23:23.027 回答