JAVA错误变量引用?接收奇怪的输出 - 可能是内存地址?

时间:2014-03-07 07:03:36

标签: java pointers

public class working {

public static String str = "123zASdcvb/;[";

    public static void main(String[] args){
            System.out.println("!!!"+new LetterInventory(str));
    }

public static class LetterInventory {
    public char[] arr;


    public LetterInventory(String str){
        //Strips our string  of all non alphabetic garbage 
        //and assigns it. This regex removes all non a-z
        //without regard for case of alphabet (?!).
        this.arr = str.replaceAll("[^a-z]", "").toLowerCase().toCharArray();
        Arrays.sort(this.arr); //I want to have it sorted to make my life easier.

        System.out.printf("Our freshly sorted LI is : %s\n",this.toString());
    }


    //Simple enough.
    public String toString() {
        return this.arr.toString();
    }




}
}

输出:

Our freshly sorted LI is : [C@6d69c9a2
!!![C@6d69c9a2

这里出了什么问题?我浏览了我的调试器,我的数组正是我想要的,它被创建,清理和排序就好了。但每当我尝试打印我的char []。toString()时,它就会出现screwey。为什么这样?

2 个答案:

答案 0 :(得分:3)

您在数组上调用toString() - 数组不会覆盖toString(),因此您最终得到implementation from Object

  

toString的{​​{1}}方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和无符号的十六进制表示形式组成。对象的哈希码。换句话说,此方法返回一个等于值的字符串:

Object

当您处理getClass().getName() + '@' + Integer.toHexString(hashCode()) 时,您应该使用char[]构造函数来创建新字符串:

String

在其他情况下,您可能需要调用其中一个return new String(arr); 重载,以获得以逗号分隔的表示形式。

顺便说一下,为什么你自己在构造函数中做这些事情并不清楚。只使用Arrays.toString方法,您的程序就会更简单:

main

答案 1 :(得分:0)

public String toString(){         return String.copyValueOf(arr);     }

如果得到结果[C @ 6d69c9a2,则表示它是一个字符数组([for array,c for char],其哈希码为0x6d69c9a2