getChars()使用StringBuffer

时间:2011-12-11 06:30:08

标签: java stringbuffer

我是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. 而不是打印原始字符“abcdefghij” 在某人内部,为什么我会得到其他一些角色。

6 个答案:

答案 0 :(得分:4)

你最后一句中的arr.toString()给你一个对象的字符串值(doc here),这是一个数组。您可能尝试实现的是类似Arrays.toString(arr)的内容,它将打印数组的内容(doc)。

答案 1 :(得分:2)

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

恰好char[]指定Object#toString()的字符串表示形式为11个字符:[C表示它是char[],{ {1}}表示以下8个十六进制数字是内存中的地址。正如JavaDoc所述,

  

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

@

Class#getName()为char数组返回getClass().getName() + '@' + Integer.toHexString(hashCode()) the default hashCode() implementation(通常)返回对象在内存中的地址:

  

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


如何解决这个问题?

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

"C["

答案 2 :(得分:1)

你需要有这样的最终印刷声明:

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

OR

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 call Arrays.toString(arr)`。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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