所以这第一个代码返回整数数组的内存地址,但是我希望它打印出实际的数组。
import java.util.Arrays;
public class FinalsReview{
int[] list = new int[]{12, 435,546, 7, 24, 4, 6, 45, 21, 1};
public static void main(String[]args){
FinalsReview hello = new FinalsReview();
System.out.print(hello.create());
}
public int[] create(){
Arrays.toString(list);
return list;
}
}
但是,以下代码打印实际数组。
import java.util.Arrays;
public class FinalsReview{
int[] list = new int[]{12, 435,546, 7, 24, 4, 6, 45, 21, 1};
public static void main(String[]args){
FinalsReview hello = new FinalsReview();
hello.create();
}
public void create(){
System.out.println(Arrays.toString(list));
}
}
为什么第一个返回内存地址?
答案 0 :(得分:5)
当你没有为hashCode()
指定toString()
方法时,它不是内存地址,toString()
和类名是Object
中int[]
的定义方式。您从Object
就像
一样实现public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
虽然此Arrays.toString(list)
显式迭代Collection
并且每个元素的打印值
为什么from http://bugs.java.com/view_bug.do?bug_id=4168079
一个警告:toString()方法通常用于打印诊断。 如果涉及非常大的阵列,则必须小心。该 Lisp语言使用打印级别/打印长度机制处理此问题。 Java中也需要类似的东西。在实践中, 每个类中提供的'toString'方法应该是首选的 简短的选项适用于简洁的诊断,更详细 表示由其他特定于应用程序的转换方法提供 如果需要应用程序逻辑。
然而,无论其技术优势如何,我们都可以制造它是值得怀疑的 由于兼容性/稳定性问题,在这个较晚的日期发生了这样的变化。
william.maddox@Eng 1998-08-31
我同意。它绝对是1.0中的正确的东西,或者 也许甚至是1.1,但对于所有这些变化来说几乎肯定为时已晚 除了toString更改。一个令人安慰的是,它非常容易
答案 1 :(得分:2)
这是因为你从方法create
返回数组,当你试图打印它时,显示是Jigar Joshi所描述的。简单地调用Arrays.toString(list)
将不会重新格式化数组,以便在您尝试打印时提供您期望的输出。
如果您希望它打印数组的元素,请让您的方法返回String
,然后使用return Arrays.toString(list)
。
答案 2 :(得分:1)
Arrays.toString(list)
只返回在String
打印的System.out.println(Arrays.toString(list))
,但是在第一种方法中,您只是返回数组而不保存Arrays.toString(list)
的结果。您只打印yourList.toString()
,所以说:
int[] myList = ... //initialize
String s = Arrays.toString(list); //Save the returned String in a variable
System.out.println(myList); //Prints myList.toString()
System.out.println(s); //Prints out the contents of the array
答案 3 :(得分:1)
该行
System.out.print(hello.create());
通过首先调用create()方法,将其返回值(对int[]
类型的对象的引用)传递给System.out
的print()方法来计算。那种方法是Javadoc reads:
打印一个对象,然后终止该行。此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用print(String)然后调用println()。
和String.valueOf()
reads的Javadoc:
如果参数为null,则字符串等于" null&#34 ;;否则,返回obj.toString()的值。
好的,我们的数组引用不是null,那么它的toString方法有什么作用呢?答案在Java语言规范的第10.7节中,reads:
数组类型的成员是以下所有成员:
公共最终字段长度,包含数组的组件数。长度可以是正数或零。
公共方法clone,它覆盖Object类中相同名称的方法,并且不会抛出任何已检查的异常。数组类型T []的克隆方法的返回类型是T []。
多维数组的克隆很浅,也就是说它只创建一个新数组。子阵列是共享的。
所有成员都继承自Object类;唯一没有继承的Object方法是它的clone方法。
因此,toString方法必须从Object继承。 Object.toString reads的Javadoc:
返回对象的字符串表示形式。通常,toString方法返回一个"文本表示"的字符串。这个对象。结果应该是一个简洁但信息丰富的表示,便于人们阅读。建议所有子类都覆盖此方法。
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@'”以及哈希代码的无符号十六进制表示形式组成。宾语。换句话说,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
...这就是为什么在打印数组时看到数组对象的类型和hashCode的原因。 (顺便提一下,哈希码与内存地址并不完全相同。例如,多个对象可能具有相同的哈希码;否则java将限制为每个应用程序大约40亿个对象。)
这就是为什么Arrays.toString是一个有用的方法,因为它返回一个包含数组内容的String。 (你确实在create()中调用了这个方法,并且它构建了那个String,但是你没有对那个String对象做任何事情,这就是为什么它没有被打印出来的。)
答案 4 :(得分:0)
在第一个示例中,您正在运行Arrays.toString(list);
但是丢弃结果(单个字符串),并返回原始值list
。 System.out.println
然后尝试将整个int[]
数组转换为字符串,它不知道该怎么做,所以它会给你意想不到的输出。
在第二个示例中,您正在运行相同的实用程序函数,但这次将其输出传递给System.out.println
。 System.out.println
的输入现在是您想要的字符串。
您需要做的是让create
函数返回String
给出的Arrays.toString(list)
,而不是原来的int[]
。