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

2022-09-03 13:22:20
    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);

For 是输出,而对于某些地址是输出。当我们想要输出值时,我们可以使用 它的工作原理就像 .list[a, b, c]arrayarrayArrays.toString(array);list

我只是想知道为什么我们不能直接调用来获取值。这样做不是更直观,更方便吗?什么导致不同的治疗 和 ?toString()arrayArrayArrayList


答案 1

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

数组类型的成员全部为以下各项:

  • 公共最终字段长度
  • 公共方法克隆,它将重写类 Object 中同名的方法,并且不引发任何选中的异常。
  • 从类对象继承的所有成员;对象唯一未继承的方法是其克隆方法。

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

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


答案 2

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

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

该表示形式为: -

[typeOfArray@hashCode

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

[Ljava.lang.String;@3e25a5

而,对于实例,将调用类中重写的方法。ArrayListtoStringArrayList