JavaRush /Java Blog /Random-TL /Klase ng string
articles
Antas

Klase ng string

Nai-publish sa grupo
  • Paraan
  • Pagbuo ng random na string
  • Paghahambing ng string: equals()o ==?
Ang klase ay Stringmadalas na ginagamit ng mga programmer, kaya dapat itong matutunan nang mabuti. Класс String - 1Tandaan na ang mga bagay sa klase Stringay hindi nababago. Kaya kapag sa tingin mo ay nagpapalit ka ng isang string, ikaw ay talagang gumagawa ng isang bagong string. Ang Java ay may mga espesyal na klase StringBufferat StringBuildernagbibigay-daan sa mga pagbabago sa isang string. Ang mga klase String, StringBuffer, StringBuilderay tinukoy sa java.lang package at awtomatikong magagamit nang walang deklarasyon sa pag-import. Ang lahat ng tatlong klase ay nagpapatupad ng interface CharSequence. Ang paglikha ng isang string ay napaka-simple. Halimbawa, magagawa mo ito:
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
Maaari kang lumikha ng isang hanay ng mga string:
String[] cats = {"Васька", "Barsik", "Murzik"};
Maaari kang lumikha ng isang walang laman na object ng klase String:
String str = new String();
Maaari kang lumikha ng isang string sa pamamagitan ng isang array ng character:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
Mayroon ding constructor na nagbibigay-daan sa iyong itakda ang hanay ng isang character array. Kailangan mong tukuyin ang simula ng hanay at ang bilang ng mga character na gagamitin:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
Maaari kang lumikha ng isang object ng klase Stringmula sa isang object ng klase StringBuffergamit StringBuilderang mga sumusunod na constructor:
String(StringBuffer an object_StrBuf)
String(StringBuilder an object_StrBuild)

Mga operator +at += para saString

Sa Java, ang plus sign ( +) ay nangangahulugan ng string concatenation, sa madaling salita, pagsasama-sama ng mga string.
String cat = "Кот";
String name = "Васька";
//складываем две строки и пробел между ними, чтобы слова не слиплись
String fullname = cat + " " + name; // получится Кот Васька
Kung ang isa sa mga operand sa isang expression ay naglalaman ng isang string, kung gayon ang iba pang mga operand ay dapat ding mga string. Samakatuwid, ang Java mismo ay maaaring mag-cast ng mga variable sa isang representasyon ng string, kahit na hindi ito mga string.
int digit = 4;
String paws = " лапы";
String aboutcat = digit + paws; // хотя мы складываем число и строку, но все равно получим строку
За кулисами Java за нас преобразовало число 4 в строку "4"

Pag-format ng mga string

Ipagpalagay natin na mayroon tayong string resource:
<string name="aboutcat">У кота по имени Барсик четыре лапы, один хвост. Ему 5 лет</string>
Upang ipakita ang string na ito sa programmatically sa elemento TextView, maaari mong gamitin ang code:
TextView tvCatsInfo = (TextView)findViewById(R.id.textView1);
tvCatsInfo.setText(R.string.aboutcat);
Isipin na mayroon kang maraming pusa. Maaari kang, siyempre, magkaroon ng iyong sariling linya para sa bawat pusa. Ngunit ang mga linya ay halos magkatulad, ang mga pangalan at edad lamang ang nagbabago. Maaari mo ring baguhin ang bilang ng mga paa at buntot (ano ang iyong naninigarilyo?). Sa ganitong mga kaso, maaari mong ilapat ang pag-format ng string. Kailangan nating tukuyin ang mga salita na babaguhin natin at palitan ang mga ito ng isang espesyal na hanay ng mga character na nagsisimula sa isang simbolo ng porsyento, pagkatapos ay isang numero na dinadagdagan ng isa, pagkatapos ay $spara sa mga string o $dpara sa mga numero. Kaya't baguhin natin ang aming mapagkukunan ng string tulad nito:
<string name="aboutcat">У кота по имени %1$s %2$s лапы, %3$s хвост. Ему %4$d лет</string>
Gumawa tayo ng mga pagbabago sa code:
String strBarsik = "Barsik";
String strPaws = "четыре";
String strTail = "one";
int year = 5;
String strCats = getResources().getString(R.string.aboutcat);
String strFinal = String.format(strCats, strBarsik, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
Kung mayroon kang pusang Vaska at siya ay anim na taong gulang, pagkatapos ay magdagdag ng dalawang variable at i-format ang linya
String strVaska = "Васька";
year = 6;
String strFinal = String.format(strCats, strVaska, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
Narito ang isang simpleng halimbawa ng pag-format. Tandaan ang tungkol dito at gamitin ito sa mga tamang lugar.

Mapagkukunan ng string

Maipapayo na mag-imbak ng mga string sa mga mapagkukunan. Ang programmatically access sa isang string resource ay ginagawa tulad nito:
String catName = getResources().getString(R.string.barsik);

I-extract ang mga string mula sa mga string array sa mga mapagkukunan

Sabihin nating mayroon kang string array na tinukoy sa isang strings.xml file na tinatawag na cats_array. Pagkatapos ay maa-access mo ang mga hilera mula sa mga mapagkukunang tulad nito:
Resources res = getResources();
String[] cats = res.getStringArray(R.array.cats_array);

Paraan

public char charAt (int index) returns символ с указанным смещением в этой строке. Отсчёт идет от 0. Не надо использовать отрицательные и несуществующие значения, будьте серьёзнее. Для извлечения нескольких символов используйте getChars().
String testString = "Котёнок";
char myChar = testString.charAt(2);
tv.setText(Character.toString(myChar)); // выводит третий символ - т
public int codePointAt(int index) returns Unicode-символ в заданном индексе
String testString = "Котёнок";
int myChar = testString.codePointAt(3);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointBefore(int index) returns Unicode-символ, который предшествует данному индексу
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointCount(int start, int end) Вычисляет количество Unicode-символов между позициями start и end
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar)); // возвращает 3
public int compareTo(String string) Сравнивает указанную строку, используя значения символов Unicode и вычисляет, Howая из строк меньше, равна or больше следующей. Может использоваться при сортировке. Регистр учитывается. Если строки совпадают, то возвращается 0, если меньше нуля, то вызывающая строка меньше строки string, если больше нуля, то вызывающая строка больше строки string. Слова с большим регистром стоят выше слова с нижним регистром.
String testString = "Котёнок";

if (testString.compareTo("котёнок") == 0) {
    tvInfo.setText("Строки равны");
} else {
    tvInfo.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок")); // возвращает -32
}
Отсортируем массив строк через пузырьковую сортировку.
String[] poem = { "Мы", "везём", "с", "собой", "кота" };

for (int j = 0; j < poem.length; j++) {
	for (int i = j + 1; i < poem.length; i++) {
		if (poem[i].compareTo(poem[j]) < 0) {
			String temp = poem[j];
			poem[j] = poem[i];
			poem[i] = temp;
		}
	}
	System.out.println(poem[j]);
}
В результате мы получим:
Мы
везём
кота
с
собой
Как видите, от перемены мест слагаемых сумма сортировки коты не меняются. public int compareToIgnoreCase (String string) Сравнивает указанную строку, используя значения символов Unicode, без учета регистра.
String testString = "Котёнок";

if (testString.compareToIgnoreCase("котёнок") == 0) {
    tv.setText("Строки равны"); // слова одинаковы, если не учитывать регистр
} else {
    tv.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок"));
}
public String concat (String string) Объединяет строку с указанной строкой. returnsся новая строка, которая содержит объединение двух строк. Обратите внимание, что само Name метода содержит кота!
String testString = "Сук";
String newString = testString.concat("кот");
tv.setText(newString);
Метод выполняет ту же функцию, что и оператор + и можно было написать Сук + кот. Но настоящий кошатник будет использовать "кошачий" метод. public boolean contains (CharSequence cs) Определяет, содержит ли строка последовательность символов в CharSequence
String testString = "котёнок";

if(testString.contains("кот")){
    infoTextView.setText("В слове котёнок содержится слово кот!");
}
public static String copyValueOf (char[] data, int start, int length) Создаёт новую строку, содержащую указанные символы из массива Data начиная с позиции start (нумерация начинается с нуля) длинной length. public static String copyValueOf(char[] data) Создаёт новую строку, содержащую символы из указанного массива. Изменение массива после создания строки не изменяет созданную строку. public boolean endsWith(String suffix) Проверяет, заканчивается ли строка символами suffix.
String str1 = "Суккот";

if(str1.endsWith("кот"))
    infoTextView.setText("Слово заканчивается на котике");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean equals (Object string) Сравнивает указанный an object и строку и возвращает true, если сравниваемые строки равны, т.е. содержит те же символы и в том же порядке с учётом регистра.
String str1 = "Кот";
String str2 = "Кошка";

if(str1.equals(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
Не путать метод с оператором ==, который сравнивает две ссылки на an objectы и определяет, ссылаются ли они на один и тот же экземпляр. Смотри пункт Сравнение строк: equals() or ==? public boolean equalsIgnoreCase(String string) Сравнивает указанную строку с исходной строкой без учёта регистра и возвращает true, если они равны. Диапазон A-Z считается равным диапазону a-z.
String str1 = "Кот";
String str2 = "кот";

if(str1.equalsIgnoreCase(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
public static String format(Locale locale, String format, Object... args)
returns отформатированную строку, используя прилагаемый формат и аргументы, локализованных в данной области. Например date or время
// выводим число типа float с двумя знаками после запятой
String.format("%.2f", floatValue);
Склеиваем два слова, которые выводятся с новой строки. При этом второе слово выводится в верхнем регистре.
String str1 = "Кот";
String str2 = "васька";
String strResult = String.format("%s\n%S", str1, str2);
// выводим результат в TextView
infoTextView.setText(strResult);
Конвертируем число в восьмеричную систему.
String str1 = "8";
int inInt = Integer.parseInt(str1); // конвертируем строку в число
String strResult = String.format("(Восьмеричное meaning): %o\n", inInt);

infoTextView.setText(strResult);
По аналогии выводим в шестнадцатеричной системе
String str1 = "255";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Шестнадцатеричное meaning): %x\n", inInt);
// число 255 будет выведено How ff
infoTextView.setText(strResult);
Для верхнего регистра используйте %X, тогда instead of ff будет FF. Для десятичной системы используйте %d. Дату тоже можно выводить по разному.
Date now = new Date();
Locale locale = Locale.getDefault();
infoTextView.setText(
		String.format(locale, "%tD\n", now) + // (MM/DD/YY)
		String.format(locale, "%tF\n", now) + // (YYYY-MM-DD)
		String.format(locale, "%tr\n", now) + // Full 12-hour time
		String.format(locale, "%tz\n", now) + // Time zone GMT offset
		String.format(locale, "%tZ\n", now)); // Localized time zone bbreviation
public byte[] getBytes(String charsetName) returns отформатированную строку, используя прилагаемый формат. public void getBytes(int start, int end, byte[] data, int index) и другие перегруженные версии Метод сохраняет символы в массив byteов, альтернатива методу getChars(). Часто используется при экспорте строк из различных источников, где используются другие символы Unicode. Например, Java по умолчанию работает с 16-битовые символы Unicode, а в интернете часто строки используют 8-битовый code Unicode, ASCII и др. public void getChars(int start, int end, char[] buffer, int index) Метод для извлечения нескольких символов из строки. Вам надо указать индекс начала подстроки (start), индекс символа, следующего за концом извлекаемой подстроки (end). Массив, который принимает выделенные символы находится в параметре buffer. Индекс в массиве, начиная с которого будет записываться подстрока, передаётся в параметре index. Следите, чтобы массив был достаточного размера, чтобы в нём поместorсь все символы указанной подстроки.
String unusualCat = "Котёнок по имени Гав";
int start = 5;
int end = 12;
char[] buf = new char[end - start];
unusualCat.getChars(start, end, buf, 0);
infoTextView.setText(new String(buf));
public int hashCode() returns целое число — хэш-code для данного an object. public int indexOf(int c) returns номер первой встречной позиции с указанным индексом с.
String testString = "котёнок";
// символ ё встречается в четвёртой позиции (index = 3)
infoTextView.setText(String.valueOf(testString.indexOf("ё")));
public int indexOf (int c, int start) Ищет индекс с, начиная с позиции start
String testString = "котёнок";
// вернёт -1, так How после 5 символа буквы ё нет
infoTextView.setText(String.valueOf(testString.indexOf("ё", 4)));
public int indexOf (String string) Ищет цепочку символов subString
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка")));
public int indexOf (String subString, int start) Ищет цепочку символов subString, начиная с позиции start
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка", 2)));
public String intern () «Xэширует» строку public boolean isEmpty () Проверяет, является ли строка пустой
if(catname.isEmpty()) {
    // здесь ваш code
}
Данный метод появился в API 9 (Android 2.1). Для старых устройств используйте String.length() == 0 public int lastIndexOf (String string) и другие перегруженные версии returns номер последней встречной позиции с указанным индексом. Например, получить file name без расширения можно так:
filename.toString().substring(0, filename.getString().lastIndexOf("."));
В этом примере мы получаем позицию последней точки и получаем подстроку до неё. public int length() returns длину строки
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.length())); // возвращает 7 (семь символов)
public boolean matches(String regularExpression) Проверяет, соответствует ли строка регулярным выражениям.
public int offsetByCodePoints (int index, int codePointOffset)
returns позицию, расположенную на расстоянии codePointOffset после начальной позиции, заданной параметром index public boolean regionMatches (int thisStart, String string, int start, int length) Метод сравнивает указанную часть строки с другой частью строки. Нужно задать индекс начала диапазон строки вызывающего an object класса String. Строка для сравнивания передаётся в параметре string. Индекс символа, начиная с которого нужно выполнять сравнение передаётся в параметре start, а длина сравниваемой подстроки в параметре length. public boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length) Перегруженная version. Метод сравнивает указанную часть строки с другой частью строки, игнорируя регистр. public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии Меняет символ or последовательность символов target на replacement
String testString = "whale";
// меняем и на о
infoTextView.setText(testString.replace("And", "о")); // возвращается кот
public String replaceAll (String regularExpression, String replacement) public String replaceFirst (String regularExpression, String replacement) Удаляет первые символы при помощи регулярного выражения. Например, если нужно удалить нули в начале чисел 001, 007, 000024, то можно использовать такой вызов.
String s = "001234-cat";
String s = s.replaceFirst ("^0*", ""); // останется 1234-cat
public String[] split (String regularExpression) и другие перегруженные версии Разбивает строку на массив из слов. Например, есть строка Васька Рыжик Мурзик Барсик и мы хотим получить массив имён котов:
String catnames = "Васька Рыжик Мурзик Барсик";
String aCats[] = catnames.split(" ");  // по пробелу
Получим:
aCats[0] = Васька
aCats[1] = Рыжик
aCats[2] = Мурзик
aCats[3] = Барсик
public boolean startsWith(String prefix) Проверяет, начинается ли строка символами prefix с начала строки
String str1 = "котлета";

if(str1.startsWith("кот"))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean startsWith(String prefix, int start) Проверяет, начинается ли заданная строка символами prefix с указанной позиции.
String str1 = "Суккот";

if(str1.startsWith("кот", 3))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public CharSequence subSequence (int start, int end) Аналогичен методу substring(), но может использоваться для CharSequence. public String substring(int start) и другие перегруженные версии Создаёт новую последовательность/строку с символами из данной строки начиная с позиции start до конца строки/заканчивая символом с позиции end. Новая строка содержит символы от start до end - 1, поэтому берём на один символ больше.
String testString = "скотина";

infoTextView.setText(testString.substring(1, 4)); // возвращается кот
public char[] toCharArray() Копирует символы в этой строке в массив символов. Тот же результат можно получить через метод getChars(). Документация не рекомендует использовать данный метод, предлагая метод charAt().
String unusualCat = "Котёнок по имени Гав";

char[] yomoe = unusualCat.toCharArray();
infoTextView.setText(String.valueOf(yomoe[3]));
public String toLowerCase() и другие перегруженные версии Преобразовывает строку в нижний регистр. Преобразованием управляет заданный по умолчанию региональный язык. String cat = "Кот"; String lower = cat.toLowerCase(); infoTextView.setText(lower); public String toString () returns строку. Для самой строки, которая сама уже является строкой, возвращать строку бессмысленно (о, How я загнул). Но на самом деле этот метод очень полезен для других классов. public String toUpperCase() Преобразовывает строку в верхний регистр. Преобразованием управляет заданный по умолчанию региональный язык.
String cat = "Кот";
String upper = cat.toUpperCase();
infoTextView.setText(upper);
public String trim() Удаляет пробелы в начале и в конце строки.
String str = "   Hello Kitty  ".trim();
infoTextView.setText(str);
public static String valueOf(long value) и другие перегруженные версии Конвертирует содержимое (числа, an objectы, символы, массивы символов) в строку.
int catAge = 7; // это число

infoTextView.setText(String.valueOf(catAge)); // преобразовано в строку

Генерируем случайную строку

Допустим, нам нужна случайная строка из заданных символов.
private static final String mCHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
private static final int STR_LENGTH = 9; // длина генерируемой строки
Random random = new Random();

public void onClick(View view) {
    TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
    infoTextView.setText(createRandomString());
}

public String createRandomString() {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < STR_LENGTH; i++) {
        int number = random.nextInt(mCHAR.length());
        char ch = mCHAR.charAt(number);
        builder.append(ch);
    }
    return builder.toString();
}

Сравнение строк: equals() or ==?

Рассмотрим пример.
String str1 = "Murzik";
String str2 = new String(str1);
boolean isCat = str1 == str2;

infoTextView.setText(str1 + " == " + str2 + " -> " + isCat);
Хотя в двух переменных содержится одно и то же слово, мы имеем дело с двумя разными an objectми и оператор == вернёт false. Однажды, когда деревья были большими, мне понадобилось сравнить две строки из разных источников. Хотя строки выглядели совершенно одинаково, сравнение при помощи оператора == возвращало false и путало мне все карты. И только потом я узнал, что нужно использовать метод equals(). Строка в Java — это отдельный an object, который может не совпадать с другим an objectом, хотя на экране результат выводимой строки может выглядеть одинаково. Просто Java в случае с логическим оператором == (а также !=) сравнивает ссылки на an objectы (при работе с примитивами такой проблемы нет):
String s1 = "hello";
String s2 = "hello";
String s3 = s1;
String s4 = "h" + "e" + "l" + "l" + "o";
String s5 = new String("hello");
String s6 = new String(new char[]{'h', 'e', 'l', 'l', 'o'});

infoTextView.setText(s1 + " == " + s2 + ": " + (s1 == s2));
// попробуйте и другие варианты
// infoTextView.setText(s1 + " equals " + s2 + ": " + (s1.equals(s2)));
// infoTextView.setText(s1 + " == " + s3 + ": " + (s1 == s3));
// infoTextView.setText(s1 + " equals " + s3 + ": " + (s1.equals(s3)));
// infoTextView.setText(s1 + " == " + s4 + ": " + (s1 == s4));
// infoTextView.setText(s1 + " equals " + s4 + ": " + (s1.equals(s4)));
// infoTextView.setText(s1 + " == " + s5 + ": " + (s1 == s5)); // false
// infoTextView.setText(s1 + " equals " + s5 + ": " + (s1.equals(s5)));
// infoTextView.setText(s1 + " == " + s6 + ": " + (s1 == s6)); // false
// infoTextView.setText(s1 + " equals " + s6 + ": " + (s1.equals(s6)));
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION