1

我是 Java 新手。我成功执行了以下程序,但我不明白输出。这是程序。

public class StringBufferCharAt {
    public static void main(String[] args)
    {
        StringBuffer sb = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
        System.out.println("Length of sb : " + sb.length());

        int start = 0;
        int end   = 10;

        char arr[] = new char[end - start];
        sb.getChars(start, end, arr, 0);
        System.out.println("After altering : "+ arr.toString());

    }
}

执行此程序后:我得到以下输出:

Length of sb : 26
After altering : [C@21a722ef

我的问题:

  1. 不是在输出中打印 10 个字符,而是 11 个字符。
  2. 而不是打印 sb 内部的原始字符“abcdefghij”,为什么我会得到一些其他字符。
4

6 回答 6

4

最后一句中的 Thearr.toString()为您提供了 Object 的 String 值(此处为文档),这是一个数组。您可能试图实现的目标是Arrays.toString(arr)打印数组(doc)的内容。

于 2011-12-11T06:35:20.913 回答
2

为什么输出 11 个字符,这些字符是什么意思?

恰好char[]由 指定的的字符串表示Object#toString()是 11 个字符:[C表示它是char[]@表示后面的 8 个十六进制数字是内存中的地址。正如 JavaDoc 所述,

此方法返回一个等于以下值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Class#getName()返回"C["一个 char 数组,默​​认实现hashCode()通常)返回对象在内存中的地址:

这通常通过将对象的内部地址转换为整数来实现,但 Java™ 编程语言不需要这种实现技术。


这应该如何解决?

如果要打印数组的内容,请使用Arrays.toString()

// Instead of this:
System.out.println("After altering : "+ arr.toString());
// Use this:
System.out.println("After altering : "+ Arrays.toString(arr));
于 2011-12-11T06:34:08.173 回答
1

你需要有这样的最终打印语句:

System.out.println("After altering : "+ new String(arr));

或者

System.out.println("After altering : "+ java.util.Arrays.toString(arr));

输出

For 1st case: abcdefghij
For 2nd case: [a, b, c, d, e, f, g, h, i, j]

注意: arr.toString()不打印数组的内容,这就是为什么您需要构造一个新的`String object from char array like in my answer above or callArrays.toString(arr)`。

于 2011-12-11T06:36:31.473 回答
0

java 中的数组没有任何内置的“人类可读” toString() 实现。您看到的只是从数组的内存位置派生的标准输出。

将 char[] 转换为可打印内容的最简单方法是从中构建一个字符串。

System.out.println("After altering : " + String.valueOf(arr));
于 2011-12-11T06:36:07.653 回答
0

该表达式arr.toString()char[]使用 ; 的内容将 a 转换为字符串char[]。它使用默认Object.toString()方法,即打印对象的表示(在本例中为数组对象)。您想要的是使用将字符转换为字符串,new String(arr)或者使用Arrays.toString(arr).

于 2011-12-11T06:39:26.077 回答
0

我可以回答的这个问题的一部分是#1。您将返回 11 个字符,因为 start 和 end 变量是索引。0 是一个有效的索引,所以从 0 到 10 有 11 个不同的数字。

于 2011-12-11T06:42:46.627 回答