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
来获取值。这样做不是更直观和方便吗?什么导致Array
和ArrayList
上的不同处理?
答案 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
时,将打印上面的内容。
但ArrayList
由AbstractCollection
类扩展,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(", ");
}
}