Все символы строки в виде массива символов можно получить методом toCharArray( ).
Если же надо включить в массив символов dst, начиная с индекса ind массива, подстроку от индекса begin включительно до индекса end исключительно, то используйте метод
getChars(int begin, int end, char[] dst, int ind) типа void. В массив будет записано end - begin символов, которые займут элементы массива, начиная с индекса ind до индекса ind + (end — begin) — 1.
Этот метод создает исключительную ситуацию в следующих случаях:
□ ссылка dst == null;
□ индекс begin отрицателен;
□ индекс begin больше индекса end;
□ индекс end больше длины строки;
□ индекс ind отрицателен;
□ ind + (end — begin) больше dst.length.
Например, после выполнения
char[] ch = {’К’, ’о’, ’н’, ’е’, ’ц’, ’ ’, ’с’, ’в’, ’е’, ’т’, ’а’};
"Пароль легко иайти".getChars(2, 8, ch, 2);
результат будет таков:
ch = {’К’, ’о’, ’р’, ’о’, ’л’, ’ь’, ' ', ’л’, ’е’, ’т’, ’а’};
Если надо получить массив байтов, содержащий все символы строки в байтовой кодировке ASCII, то используйте метод getBytes (). Этот метод при переводе символов из Unicode в ASCII использует локальную кодовую таблицу.
Если же надо получить массив байтов не в локальной кодировке, а в какой-то другой, применяйте метод getBytes (String encoding) или метод getBytes (Charset encoding).
Так сделано в листинге 5.1 при создании объекта msg. Строка "\"Россия в\"" перекодировалась в массив СР866-байтов для правильного вывода кириллицы в консольное окно Command Prompt операционных систем MS Windows.
Метод substring (int begin, int end) выделяет подстроку от символа с индексом begin включительно до символа с индексом end исключительно. Длина подстроки будет равна end — begin. Индекс можно задать любым целым типом, кроме типа long.
Метод substring ( int begin) выделяет подстроку от индекса begin включительно до конца строки.
Если индексы отрицательны, индекс end больше длины строки или begin больше, чем end, то возникает исключительная ситуация.
Например, после выполнения следующего фрагмента
String s = "Write once, run anywhere.";
String sub1 = s.substring(6, 10);
String sub2 = s.substring(16);
получим в строке sub1 значение "once", а в sub2-значение "anywhere.".
Метод split (String regExp) разбивает строку на подстроки, используя в качестве разделителей символы, входящие в параметр regExp, записывает подстроки в массив строк и возвращает ссылку на этот массив. Сами разделители не входят ни в одну подстроку.
Например, после выполнения следующего фрагмента
String s = "Write:once,:run:anywhere.";
String[] sub = s.split(":");
получим в строке sub[0] значение "Write", в строке sub[1] значение "once,", в строке sub[2] значение "run", а в sub[3] — значение "anywhere.".
Метод split(String regExp, int n) разбивает строку на n подстрок. Если параметр n меньше числа подстрок, то весь остаток строки заносится в последний элемент создаваемого массива строк. Применение метода
String[] sub = s.split(":", 2);
в предыдущем примере даст массив sub из двух элементов со значением sub[0], равным
"Write", и значением sub[1], равным "once, :run:anywhere.".
Разбить строку можно практически на любые подстроки, поскольку значением параметра regExp может быть любое регулярное выражение.
String[] word = s.split("\\s+");
Операция сравнения == сопоставляет только ссылки на строки. Она выясняет, указывают ли ссылки на одну и ту же строку. Например, для строк
String si = "Какая-то строка";
String s2 = "Другая строка";
сравнение s1 == s2 дает в результате false.
Значение true получится, только если обе ссылки указывают на одну и ту же строку, например после присваивания s1 = s2.
Интересно, что если мы определим s3 так:
String s3 = "Какая-то строка";
то сравнение s1 == s3 даст в результате true, потому что компилятор устроен так, что он создаст только один экземпляр константы "Какая-то строка" и направит на него все ссылки — и ссылку s1, и ссылку s3. Это не приводит к недоразумениям, поскольку строка типа String неизменяема.
Вы, разумеется, хотите сравнивать не ссылки, а содержимое строк. Для этого есть несколько методов.
Логический метод equals(Object obj), переопределенный из класса Object, возвращает true, если параметр obj не равен null, является объектом класса String, и строка, содержащаяся в нем, полностью идентична данной строке вплоть до совпадения регистра букв. В остальных случаях возвращается значение false.
Логический метод equalsIgnoreCase(Object obj) работает так же, но одинаковые буквы, записанные в разных регистрах, считаются совпадающими.