为什么打印数组的内存地址

时间:2014-12-16 00:18:21

标签: java arrays

所以这第一个代码返回整数数组的内存地址,但是我希望它打印出实际的数组。

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

为什么第一个返回内存地址?

5 个答案:

答案 0 :(得分:5)

当你没有为hashCode()指定toString()方法时,它不是内存地址,toString()和类名是Objectint[]的定义方式。您从Object

继承的{1}}类

就像

一样实现
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);但是丢弃结果(单个字符串),并返回原始值listSystem.out.println然后尝试将整个int[]数组转换为字符串,它不知道该怎么做,所以它会给你意想不到的输出。

在第二个示例中,您正在运行相同的实用程序函数,但这次将其输出传递给System.out.printlnSystem.out.println的输入现在是您想要的字符串。

您需要做的是让create函数返回String给出的Arrays.toString(list),而不是原来的int[]