12 января 2008

String в вопросах и ответах

1
Какая разница между:
String s1="string";
и
String s2=new String("string");

В первом примере создаётся только один объект строка: "string" , а затем создаётся указатель s1 на эту строку. Во втором примере сначала создаётся первый объект "string", а затем второй объект строка оператором new. В итоге получается второй способ менее эффективным.

2
Когда следует использовать String, а когда StringBuffer ?
Оба класса String и StringBuffer предназначены для работы со строковыми переменными, которые содержат более одного символа. Класс String следует использовать для работы со строками, значение которых не будет меняться. Например, если вы передаёте в метод строковый параметр, который точно не будет изменятся внутри метода, то лучше передавать строку с помощью класса String.
Класс StringBuffer следует использовать для строковых переменных, которые будут изменяться. Например когда считіваются данные из файла и динамически создаётся строковая переменная. Это связано с тем, что String - константа, и при каждом изменении будет создаватся новая строка и переприсваиватся указатель на неё.

3
Как преобразовать 16ричной число в виде строки "FFFA" в 10чную форму.
Можно использовать функцию: Integer.parseInt(String s,Int r);
r- базис (radix) в десятичной системе для 16чных чисел равен 16ти.

4
Есть String, которая состоит из нескольких строчек разделённых символом '\n' , как их объеденить ?
Можно использовать класс java.util.StringTokenizer. Например следующим образом:

StringTokenizer t=new StringTokenizer(" 1 \n 2 \n 3 \n 4 ","\n");
while (t.hasMoreTokens()){
System.out.println(t.nextToken());
}

5
Как проверить что введённая строка состоит ТОЛЬКО из заглавных символов?

String onlyLowerCase="SOME STRiNG";
if ( onlyLowerCase.equals(onlyLowerCase.toUpperCase())){
// в строке только заглавные символы ...
}

1 комментарий:

black zorro комментирует...

Относительно строк я бы упомнял что начиная с java 1.5 есть уже три класса работы со строками:
String - когда хранящееся внутри строки значение не нужно менять
StringBuffer и StrinbgBuilder - эти два класса имеют одинаковое API и предназначены для изменения своего содержимого.
Отличие StringBuilder от StringBuffer в том, что первый является не безопасным и нерекомендуемым к использованию в многопоточных приложениях. если два потока одновременно попытаются изменять значение одной переменной то получится БАГ.
А использование StringBuffer-а является безопасным в этом плане.
Относительно скорости работы:
StringBuilder быстрее чем StringBuffer , который в свою очередь невероятно быстрее чем String
плюс все эти три класса поддерживают общий интерфейс CharSequence. Интерфейс достаточно прост, в нем есть метод для получения длины строки и получения символа по его номеру.