getChars () используя StringBuffer - PullRequest
       15

getChars () используя StringBuffer

1 голос
/ 11 декабря 2011

Я новичок в 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", которые внутри sb, почему я получил некоторые другие символы.

Ответы [ 6 ]

4 голосов
/ 11 декабря 2011

arr.toString() в вашем последнем предложении дает вам строковое значение вашего объекта (doc здесь ), вот массив. Вероятно, вы пытались достичь чего-то вроде Arrays.toString(arr), которое будет печатать содержимое вашего массива ( doc ).

2 голосов
/ 11 декабря 2011

Почему выводится 11 символов, и что означают эти символы?

Просто так получается, что строковое представление char[], как указано Object#toString(), состоит из 11 символов: [C указывает, что это char[], @ обозначает следующие 8 шестнадцатеричных цифр адрес в памяти. Как утверждает JavaDoc,

Этот метод возвращает строку, равную значению:

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

Class#getName() возвращает "C[" для массива символов, а стандартная hashCode() реализация (обычно) возвращает адрес объекта в памяти:

Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования Java ™.


Как это решить?

Если вы хотите распечатать содержимое массива, используйте Arrays.toString():

// Instead of this:
System.out.println("After altering : "+ arr.toString());
// Use this:
System.out.println("After altering : "+ Arrays.toString(arr));
1 голос
/ 11 декабря 2011

Вы должны иметь окончательный оператор печати, как это:

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

0 голосов
/ 11 декабря 2011

Одна часть этого вопроса, на которую я могу ответить, это # ​​1.Вы возвращаете 11 символов, потому что переменные начала и конца являются индексами.0 - допустимый индекс, поэтому от 0 до 10 - 11 различных чисел.

0 голосов
/ 11 декабря 2011

Выражение arr.toString() не преобразует char[] в строку, используя содержимое char[]; он использует метод Object.toString() по умолчанию, который печатает представление объекта (в данном случае объект массива). Вам нужно либо преобразовать символы в строку, используя new String(arr), либо представить массив символов, используя Arrays.toString(arr).

0 голосов
/ 11 декабря 2011

Массивы в java не имеют встроенных «удобочитаемых» реализаций toString (). То, что вы видите, это просто стандартный вывод, полученный из ячейки памяти массива.

Самый простой способ превратить char [] во что-то, что можно распечатать, это просто создать из него строку.

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