为什么我必须在Split方法中使用Array.toString?

时间:2011-11-02 19:09:29

标签: java arrays tostring

我不知道为什么我必须在split(String reges)方法中使用Array.toString。我试过,如果我离开Array.toString()方法,但之后该方法只写出内存地址。

这是原始代码:

public static String knights=
        "Then, when you have found the shrubbery, you must " +
        "cut down the mightiest tree in the forest... " +
        "with... a herring!";

public static void split(String regex){
    System.out.println(Arrays.toString(knights.split(regex)));
}

我试过这个:

public static void split(String regex){
    System.out.println(knights.split(regex).toString());
}

但它只写出了地址,并没有包含骑士。

或者如何在不使用Arrays.toString()方法的情况下重写split方法?

7 个答案:

答案 0 :(得分:2)

Arrays.toString调用是必要的,因为String#split返回一个字符串数组。或者,您可以迭代结果,如下所示:

String[] results = knights.split(regex);
for (String result : results) {
    System.out.println(result);
}

输出的格式会略有不同,但它实现了相同的想法。但正如您所看到的,Arrays.toString更简洁,您需要的工作量更少。但是,迭代方法(上面)使您可以更好地控制输出的格式。

答案 1 :(得分:2)

程序打印内存地址的原因是因为这就是数组的toString()方法的行为(而String.split()返回一个String-array)。

为什么不想使用Arrays.toString()?你想要的输出并不完全清楚。如果你只是想要另一种方法来获得相同的输出,你可以这样做:

String[] splitted = knights.split(regex);
List<String> list = Arrays.asList(splitted);
System.out.println(list);

答案 2 :(得分:0)

使用String.split()方法时,它返回一个String数组,最初根据你的正则表达式进行分隔。

Array Class已覆盖toString()方法,因此当您在System.out语句中使用它时,您可以看到所有标记。

答案 3 :(得分:0)

数组是Java中的一种特殊类型的对象,它必须由编译器以不同方式处理(例如索引)。它使用Object的默认toString()方法,该方法仅打印地址。数组(此处为String[])不是Arrays的实例,它只是一个用于处理数组的辅助类。

答案 4 :(得分:0)

...试

public static void split(String regex){
    String[] strArr = knights.split(regex); // Split the knights string using the specified delimiter
    // Cycle through the array
    for (String a : strArr) {
        System.out.print(a + " ");
    }
    System.out.println();
}

纯数组没有像Java中的其他对象那样的良好toString方法(这解释了为什么你得到了一个地址而不是一个元素列表)。因此,要打印出数组的内容,您几乎总是需要使用for循环遍历它或使用Array类的静态toString方法,就像您在第一个代码段中所做的那样同样适合你。

总而言之,隐式toString(例如System.out.println(someArray))与Array.toString(someArray)不同。

答案 5 :(得分:0)

有关Arrays的实用方法toString,请参阅此API Doc,您需要了解将数组传递给它时的作用。这就是“原始代码”中使用的方法。

但是在您的代码中,您调用的是另一种toString方法。

答案 6 :(得分:0)

回到Java 1.0时代,数组上的.toString()方法是默认实现,所以

knights.split(regex).toString()

会打印出来

[java.lang.String@01234abcdef]

或其他(我不记得确切的格式)。最终决定应该有一个很好的方法来打印漂亮的数组,但是改变行为或者array.toString()为时已晚。

因此,java.util.Arrays上的一个静态帮助器方法是新的.toString(数组)方法,这就是为什么你不能只在数组上调用.toString()。

正如其他人所指出的那样,如果确实想要避免使用Arrays.toString(),那么可以使用循环。但是可以使用库函数。