Строки в Java — это неизменяемые объекты. Один раз создав строку мы не можем изменить ее, мы можем только создать новый объект–строку, на основе первой. Для создания изменяемых строк используются объекты StringBuffer и StringBuilder. Строка является объектом и поддерживает множество методов для обработки:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //создание объектов-строк
//пустая строка String str1 = new String(); //строка инициализирована константой String str2 = "Строка из константы"; //создание строки путем копирования из другой строки String str3 = new String(str2); //создание строки инициализацией из массива символов char[] char_arr = {'П', 'р', 'и', 'м', 'е', 'р'}; String str4 = new String(char_arr); //создание строки инициализацией частью массива символов String str5 = new String(char_arr, 0, 3); //создание строки с инициализацией массива байтов byte[] byte_arr = {0x3F, 100, 101, 102, 103, 104, 105}; String str6 = new String(byte_arr); //с инициализацией частью массива байтов String str7 = new String(byte_arr, 1, 5); //из StringBuffer StringBuffer sbuf = new StringBuffer(); sbuf.append("Эта строка добавлена в StringBuffer"); String str8 = new String(sbuf); //из StringBuilder StringBuilder sbu = new StringBuilder("Это строка добавлена в StringBuilder"); String str9 = new String(sbu); //из массива целых чисел (массив символов Unicode) int[] codePoints = {350, 351, 352, 353, 354}; String str10 = new String(codePoints, 0, 5);
//вывод созданных строк jTextArea1.append("Создание строковых переменных\n"); jTextArea1.append(str1 + "\n"); jTextArea1.append(str2 + "\n"); jTextArea1.append(str3 + "\n"); jTextArea1.append(str4 + "\n"); jTextArea1.append(str5 + "\n"); jTextArea1.append(str6 + "\n"); jTextArea1.append(str7 + "\n"); jTextArea1.append(str8 + "\n"); jTextArea1.append(str9 + "\n"); jTextArea1.append(str10 + "\n");
str1 = "Это тестовая строка"; //исчисление символов (получение символов из строки charAt()) jTextArea1.append(Character.toString(str1.charAt(0)) + "\n");
//если нужно извлечь несколько символов то делаем так char[] arrayofchar = new char[15]; str1.getChars(0, 15, arrayofchar, 0); jTextArea1.append(new String(arrayofchar) + "\n");
//извлекаем в массив байтов byte[] arrayofbyte = "Это тоже объект и он имеет методы".getBytes(); jTextArea1.append(new String(arrayofbyte) + "\n");
//всю строку в массив символов str1 = "всю строку в массив символов"; char[] arrayofchar2 = str1.toCharArray(); jTextArea1.append(new String(arrayofchar2) + "\n");
//сравнение строк методом equals(), который не чувствителен к регистру str1 = "absdefg"; str2 = "absdefg"; str3 = "abshefg";
if(str1.equals(str2)) jTextArea1.append("str1 и str2 равны (метод equals чувствителен к регистру)\n"); if(! str1.equals(str3)) jTextArea1.append("str1 и str3 не равны (метод equals чувствителен к регистру)\n");
str1 = "absdefg"; str2 = "absDefG"; if(str1.equals(str2)) jTextArea1.append("str1 и str2 равны (метод equals чувствителен к регистру). Эта строчка не отобразится. \n"); if(str1.equalsIgnoreCase(str2)) jTextArea1.append("str1 и str2 равны (метод equalsIgnoreCase не чувствителен к регистру)\n");
//сравнение подстроки данной строки с подстрокой в другой строке str1 = "у попа была собака"; str2 = "собака"; if(str1.regionMatches(12, str2, 0, 6)) jTextArea1.append("собака найдена в обеих строчках \n");
//определение начинается или заканчивается строка на определенную строку (специализированная версия regionMatches()) if("Всем привет".startsWith("Всем")) jTextArea1.append("Начинается на 'Всем' \n"); if("Всем привет".endsWith("привет")) jTextArea1.append("Кончается на 'привет' \n");
//для того, чтобы сранвивать строки не просто на равенство и неравенство //а определения больше, равна или меньше строка (для операций сортировок например)
String[] arrforsort = {"январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"}; String buf; for(int i = 0; i < arrforsort.length; i ++) for(int j = i + 1; j < arrforsort.length; j ++){ if(arrforsort[i].compareTo(arrforsort[j]) > 0){ buf = arrforsort[i]; arrforsort[i] = arrforsort[j]; arrforsort[j] = buf; } } jTextArea1.append("Отсортируем массив по возрастанию:\n"); for(int i = 0; i < arrforsort.length; i ++) jTextArea1.append(arrforsort[i] + "\n");
//поиск первого вхождения построки в строку if("Поиск в строке подстроки".indexOf("подстроки") > 0) jTextArea1.append("Найдено первое вхождение подстроки в строку \n"); //поиск последнего вхождения подстрооки в строку if("Поиск подстроки поиск подстроки поиск подстроки".lastIndexOf("подстроки") > 0) jTextArea1.append("Найдено последнее вхождение подстроки в строку \n");
//для извлечения подстроки из строки jTextArea1.append("Достанем из строки подстроку".substring(9) + "\n"); jTextArea1.append("Достанем из строки подстроку".substring(0, 8) + "\n");
//для конкатенации строк jTextArea1.append("Проссумируем" + "две строки" + "\n"); jTextArea1.append("Проссумируем".concat("две строки") + "\n");
//замена в строке jTextArea1.append("Может заменим что-нибудь в строке".replace("о", "О") + "\n"); jTextArea1.append("да давайте да заменим все да на нет".replace("да", "нет") + "\n");
//удаляем все пробелы справа и слева в строке jTextArea1.append(" удалим все пробелы справа и слева ".trim() + "\n");
//изменяем регистр строки jTextArea1.append("Эта СтРочКА с одИНакоВЫМ РегистрОМ".toLowerCase() + "\n"); jTextArea1.append("Эта СтРочКА с одИНакоВЫМ РегистрОМ".toUpperCase() + "\n"); } Классы для хранения изменяемых строк StringBuffer и StringBuilderКак известно, в Java строка является неизменяемым объектом. При попытки модификации строки мы получаем новый объект, содержащий новую строку. Если мы будем изменять строку в цикле, то получим не очень эффективное решение, связанное с пересозданием объектов строк в цикле. Для работы с изменяемой строкой используются два класса StringBuffer и StringBuilder. Оба эти класса предоставляют одинаковый функционал по обработке строки. Они оба наследуются от класса AbstractStringBuilder. Единственная разница — все методы StringBuffer синхронизированы (с директивой synchronized), поэтому предназначены для работы в многопоточной среде, методы StringBuilder не синхронизированы, поэтому его нужно использовать в однопоточной среде. Пример использования:
//создаем объект для хранения изменяемой строки StringBuffer sb1 = new StringBuffer("Исходная строка в StringBuffer"); jTextArea1.append(sb1 + "\n"); //различные методы по добавлению строки, числа, символа, последовательности символов в конц строки sb1.append("!"); sb1.append(" "); sb1.append(12345); jTextArea1.append(sb1 + "\n"); //удаление части строки с начального по конечный индекс sb1.delete("Исходная строка в StringBuffer".length(), sb1.length()); jTextArea1.append(sb1 + "\n"); //поиск подстроки if(sb1.indexOf("Buffer") > 0) jTextArea1.append("Подстрока Buffer найдена \n");
|