当前位置: 首页 > 面试题库 >

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

朱俊雅
2023-03-14
问题内容
    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]输出,而for
array一些地址输出。当我们想要输出array值时,我们可以Arrays.toString(array);像使用一样使用它们list

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


问题答案:

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

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

  • 公众最终场长
  • 公共方法克隆,它覆盖类Object中相同名称的方法,并且不引发任何检查的异常。
  • 所有成员都从Object类继承;不继承的对象的唯一方法是其克隆方法。

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

为什么要做出这个决定是一个可能应该问给语言设计者的问题…



 类似资料:
  • 问题内容: 今天,我刚刚发现了一个问题,因为我的一个单元测试由于从Java 7升级到Java 8而失败了。该单元测试调用一个方法,该方法试图在子类上注释的方法上找到注释,但返回类型不同。 在Java 7中,似乎只有在代码中确实声明了注释时,才会找到注释。在Java 8中,似乎包含在子类中声明的注释。 为了说明这一点,我创建了一个简单的(??)测试类IAPTest(用于IsAnnotationPre

  • 问题内容: 有谁知道为什么python允许您在对象和称为“”的方法名称之间添加无限量的空格。? 这里有些例子: 另一个例子: 对于类也是如此。 我使用的是python 2.7,我尝试过进行一些Google搜索并查看python源代码,但找不到任何允许这样做的原因。 问题答案: 该就像一个运营商。你可以做同样的方式,你可以做或等。该语言参考说: 除逻辑行的开头或字符串文字外,空格字符空格,制表符和换

  • 好的,这是我的代码的一个紧凑版本 IDE(Eclipse)在emparray.add行上给出了以下错误 无法对非静态emparray进行静态引用 EmployeeClass无法解析为变量 令牌obj语法错误,请删除此令牌。 null

  • 问题内容: 我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。 那么两者之间有什么区别? 和 问题答案: 匹配项的实例,但不是。假设您要编写一个接受Strings到任何内容的映射的方法:如果您要编写 您无法提供。如果你写

  • 问题内容: 我想知道子句中和值之间的区别。当我使用而不是时,为什么会给我一个编译错误(一个值可能尚未初始化)。 下面是我的代码: 问题答案: 简短答案 对于编译器,可以推断出在读取之前已初始化的内容。这并非如此。 正式答案: 在读取之前, 所有局部变量都必须有一个 确定的赋值 (14.4.2。局部变量声明的执行): […]如果声明符没有初始化表达式, 则对变量的每次引用都必须在对变量的赋值之前执行

  • 我创建的以下地图之间有什么不同(在另一个问题中,人们似乎可以互换地使用它们来回答,我想知道它们是否/如何不同):