articles
等級 15

字串類

在 Random-TW 群組發布
  • 方法
  • 產生隨機字串
  • 字串比較:equals()==?
該類別是String程式設計師經常使用的,所以應該學好。 類別字串 - 1請記住,類別物件String是不可變的。因此,當您認為正在更改字串時,實際上是在建立一個新字串。Java 有特殊的類StringBufferStringBuilder允許更改字串。類別StringStringBufferStringBuilder是在java.lang套件中定義的,無需導入聲明即可自動使用。所有三個類別都實作該介面CharSequence。建立字串非常簡單。例如,您可以這樣做:
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
您可以建立一個字串陣列:
String[] cats = {"Васька", "Barsik", "Murzik"};
您可以建立一個空的類別物件String
String str = new String();
您可以透過字元數組建立字串:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
還有一個建構函數可讓您設定字元數組的範圍。您需要指定範圍的開頭和要使用的字元數:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
您可以使用以下建構函式 String從類別物件 建立類別物件:StringBufferStringBuilder
String(StringBuffer an object_StrBuf)
String(StringBuilder an object_StrBuild)

運算符+和+=String

在Java中,加號(+)表示字串連接,即組合字串。
String cat = "Кот";
String name = "Васька";
//складываем две строки и пробел между ними, чтобы слова не слиплись
String fullname = cat + " " + name; // получится Кот Васька
如果表達式中的運算元之一包含字串,則其他運算元也必須是字串。因此,Java 本身可以將變數轉換為字串表示形式,即使它們不是字串。
int digit = 4;
String paws = " лапы";
String aboutcat = digit + paws; // хотя мы складываем число и строку, но все равно получим строку
За кулисами Java за нас преобразовало число 4 в строку "4"

格式化字串

假設我們有一個字串資源:
<string name="aboutcat">У кота по имени Барсик четыре лапы, один хвост. Ему 5 лет</string>
要以程式設計方式在 element 中顯示此字串TextView,您可以使用以下程式碼:
TextView tvCatsInfo = (TextView)findViewById(R.id.textView1);
tvCatsInfo.setText(R.string.aboutcat);
想像一下你有幾隻貓。當然,您可以為每隻貓擁有自己的線路。但台詞非常相似,只是名字和年齡改變了。您也可以更改爪子和尾巴的數量(您在吸什麼?)。在這種情況下,您可以套用字串格式。我們需要確定要更改的單詞,並將它們替換為一組特殊的字符,這些字符以百分號開頭,然後是遞增一的數字,然後是$s字串或$d數字。因此,讓我們像這樣更改字串資源:
<string name="aboutcat">У кота по имени %1$s %2$s лапы, %3$s хвост. Ему %4$d лет</string>
我們來修改一下程式碼:
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);
如果您有一隻貓 Vaska 並且它已經六歲了,那麼請添加兩個變數並格式化該行
String strVaska = "Васька";
year = 6;
String strFinal = String.format(strCats, strVaska, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
這是一個簡單的格式化範例。記住它並在正確的地方使用它。

字串資源

建議將字串儲存在資源中。以程式設計方式存取字串資源是這樣完成的:
String catName = getResources().getString(R.string.barsik);

從資源中的字串數組中提取字串

假設您在名為 的strings.xmlcats_array檔案中定義了一個字串陣列。然後您可以像這樣存取資源中的行:
Resources res = getResources();
String[] cats = res.getStringArray(R.array.cats_array);

方法

public char charAt (int index) 傳回此字串中指定偏移處的字元。倒數計時從0開始。沒有必要使用負值和不存在的值,嚴肅一點。若要提取多個字符,請使用getChars().
String testString = "Котёнок";
char myChar = testString.charAt(2);
tv.setText(Character.toString(myChar)); // выводит третий символ - т
public int codePointAt(int index) 傳回給定索引處的 Unicode 字符
String testString = "Котёнок";
int myChar = testString.codePointAt(3);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointBefore(int index) 傳回給定索引之前的 Unicode 字符
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointCount(int start, int end)start計算位置和 之間的 Unicode 字元數end
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar)); // возвращает 3
public int compareTo(String string) 使用 Unicode 字元值比較指定字串,並計算哪個字串小於、等於或大於下一個字串。可用於排序。考慮案例。如果字串匹配,則傳回 0,如果小於零,則呼叫字串小於 string string,如果大於零,則呼叫字串大於 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) 將字串與指定字串連接。傳回一個新字串,其中包含兩個字串的串聯。請注意,方法名稱本身包含一隻貓!
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為 length 的位置start(從零開始編號)開始的指定字元。 建立一個包含指定數組中的字元的新字串。建立行後更改數組不會更改創建的行。 檢查字串是否以 結尾。 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) 比較指定的物件和字串,如果比較的字串相等則傳回true ,即 包含相同的字元並且區分大小寫的順序相同。
String str1 = "Кот";
String str2 = "Кошка";

if(str1.equals(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
不要將該方法與運算符混淆==,後者比較兩個物件引用並確定它們是否引用同一個實例。請參閱字串比較:equals()==public boolean equalsIgnoreCase(String string) 以不區分大小寫的方式將指定字串與來源字串進行比較,如果相等則傳回true 。AZ 範圍被認為等於 az 範圍。
String str1 = "Кот";
String str2 = "кот";

if(str1.equalsIgnoreCase(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
public static String format(Locale locale, String format, Object... args)
使用提供的格式和本地化到給定範圍的參數傳回格式化字串。例如日期或時間
// выводим число типа 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,那麼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) 使用提供的格式傳回格式化字串。 public void getBytes(int start, int end, byte[] data, int index)和其他重載 該方法將字元儲存到位元組數組中,這是getChars(). 通常在從使用其他 Unicode 字元的各種來源匯出字串時使用。例如,Java預設使用16位元Unicode字符,而在網路上,字串經常使用8位元Unicode、ASCII等 public void getChars(int start, int end, char[] buffer, int index) 從字串中提取多個字元的方法。您需要指定子字串開頭的索引 ( start)、要提取的子字串末尾後面的字元的索引 ( end )。接收所選字元的陣列位於buffer參數中。數組中的索引(從其開始寫入子字串)在索引參數中傳遞。確保陣列足夠大以包含指定子字串中的所有字元。
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() 傳回一個整數,該整數是該物件的雜湊碼。 public int indexOf(int c) 傳回第一個遇到的具有指定索引 c 的位置的編號。
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 () “哈希”字串 public boolean isEmpty () 檢查字串是否為空
if(catname.isEmpty()) {
    // здесь ваш code
}
此方法出現在API 9(Android 2.1)。對於較舊的設備,請使用String.length() == 0 public int lastIndexOf (String string) и другие перегруженные версии 傳回指定索引處最後遇到的位置的編號。例如,您可以獲得不含副檔名的檔案名,如下所示:
filename.toString().substring(0, filename.getString().lastIndexOf("."));
在此範例中,我們取得最後一個點的位置並取得它之前的子字串。 public int length() 傳回字串的長度
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.length())); // возвращает 7 (семь символов)
public boolean matches(String regularExpression) 檢查字串是否與正規表示式相符。
public int offsetByCodePoints (int index, int codePointOffset)
codePointOffset傳回距離參數指定的起始位置 一定距離的位置。index public boolean regionMatches (int thisStart, String string, int start, int length) 此方法將字串的指定部分與字串的另一部分進行比較。您必須指定類別的呼叫物件的行範圍的開頭索引String。要比較的字串在參數中傳遞string。參數中傳入需要進行比較的字元的索引start,參數中傳入要比較的子字串的長度lengthpublic boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length) 重載版本。此方法將字串的指定部分與字串的另一部分進行比較,忽略大小寫。 public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии 將一個字元或字元序列變更targetreplacement
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) и другие перегруженные версии 將字串拆分為單字數組。例如,有一個字串 Vaska Ryzhik Murzik Barsik,我們想要取得貓名字的陣列:
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(),但可以用於CharSequencepublic String substring(int start)和其他重載 建立一個新的序列/字串,其中包含給定字串中從 位置 開始到start行尾/以位置 處的字元結尾的字元end。新行包含從start到結束的字元 - 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() и другие перегруженные версии 將字串轉換為小寫。預設區域設定控制轉換。字符串貓=“貓”;字串 lower = cat.toLowerCase(); infoTextView.setText(下); public String toString () 傳回一個字串。對於字串本身來說,它本身已經是一個字串,返回字串是沒有意義的(哦,我是如何彎曲它的)。但這個方法其實對於其他類別來說非常有用。 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)和其他重載 將內容(數字、物件、字元、字元陣列)轉換為字串。
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()==?

讓我們來看一個例子。
String str1 = "Murzik";
String str2 = new String(str1);
boolean isCat = str1 == str2;

infoTextView.setText(str1 + " == " + str2 + " -> " + isCat);
儘管這兩個變數包含相同的單字,但我們正在處理兩個不同的對象,並且運算子==將返回false。有一次,當樹很大時,我需要比較來自不同來源的兩個字串。儘管字串看起來完全相同,但使用運算符的比較==返回false並混淆了所有卡片。然後我才發現我需要使用equals(). Java 中的字串是一個單獨的對象,儘管字串的輸出在螢幕上看起來可能相同,但它可能與另一個對像不同。只是 Java 在邏輯運算子==(以及!=)的情況下比較物件的參考(使用基元時不存在這樣的問題):
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)));
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION