JavaRush /Blog Java /Random-VI /Lớp chuỗi
articles
Mức độ

Lớp chuỗi

Xuất bản trong nhóm
  • phương pháp
  • Tạo một chuỗi ngẫu nhiên
  • So sánh chuỗi: equals()hoặc ==?
Lớp này Stringthường được các lập trình viên sử dụng nên cần phải học thật kỹ. Chuỗi lớp - 1Hãy nhớ rằng các đối tượng lớp Stringlà bất biến. Vì vậy, khi bạn nghĩ rằng mình đang thay đổi một chuỗi, thực tế là bạn đang tạo một chuỗi mới. Java có các lớp đặc biệt StringBuffercho StringBuilderphép thay đổi chuỗi. Các lớp String, StringBuffer, StringBuilderđược định nghĩa trong gói java.lang và có sẵn tự động mà không cần khai báo nhập. Cả ba lớp đều thực hiện giao diện CharSequence. Tạo một chuỗi rất đơn giản. Ví dụ: bạn có thể làm điều này:
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
Bạn có thể tạo một chuỗi các chuỗi:
String[] cats = {"Васька", "Barsik", "Murzik"};
Bạn có thể tạo một đối tượng lớp trống String:
String str = new String();
Bạn có thể tạo một chuỗi thông qua một mảng ký tự:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
Ngoài ra còn có một hàm tạo cho phép bạn thiết lập phạm vi của một mảng ký tự. Bạn cần chỉ định phần bắt đầu của phạm vi và số lượng ký tự sẽ sử dụng:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
Bạn có thể tạo một đối tượng lớp Stringtừ một đối tượng lớp StringBufferbằng cách sử dụng StringBuildercác hàm tạo sau:
String(StringBuffer an object_StrBuf)
String(StringBuilder an object_StrBuild)

Toán tử +và += choString

Trong Java, dấu cộng ( +) có nghĩa là nối chuỗi, hay nói cách khác là kết hợp các chuỗi.
String cat = "Кот";
String name = "Васька";
//складываем две строки и пробел между ними, чтобы слова не слиплись
String fullname = cat + " " + name; // получится Кот Васька
Nếu một trong các toán hạng trong biểu thức chứa một chuỗi thì các toán hạng khác cũng phải là chuỗi. Do đó, bản thân Java có thể chuyển các biến thành biểu diễn chuỗi, ngay cả khi chúng không phải là chuỗi.
int digit = 4;
String paws = " лапы";
String aboutcat = digit + paws; // хотя мы складываем число и строку, но все равно получим строку
За кулисами Java за нас преобразовало число 4 в строку "4"

Định dạng chuỗi

Giả sử chúng ta có tài nguyên chuỗi:
<string name="aboutcat">У кота по имени Барсик четыре лапы, один хвост. Ему 5 лет</string>
Để hiển thị chuỗi này theo chương trình trong phần tử TextView, bạn có thể sử dụng mã:
TextView tvCatsInfo = (TextView)findViewById(R.id.textView1);
tvCatsInfo.setText(R.string.aboutcat);
Hãy tưởng tượng rằng bạn có một vài con mèo. Tất nhiên, bạn có thể có dòng riêng cho mỗi con mèo. Nhưng lời thoại rất giống nhau, chỉ có tên và tuổi thay đổi. Bạn cũng có thể thay đổi số lượng bàn chân và đuôi (bạn đang hút thuốc gì?). Trong những trường hợp như vậy, bạn có thể áp dụng định dạng chuỗi. Chúng ta cần xác định các từ mà chúng ta sẽ thay đổi và thay thế chúng bằng một bộ ký tự đặc biệt bắt đầu bằng ký hiệu phần trăm, sau đó là một số tăng dần một, sau đó là $schuỗi hoặc $dsố. Vì vậy, hãy thay đổi tài nguyên chuỗi của chúng ta như thế này:
<string name="aboutcat">У кота по имени %1$s %2$s лапы, %3$s хвост. Ему %4$d лет</string>
Hãy thực hiện các thay đổi đối với mã:
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);
Nếu bạn có một con mèo Vaska và nó sáu tuổi, hãy cộng hai biến và định dạng dòng
String strVaska = "Васька";
year = 6;
String strFinal = String.format(strCats, strVaska, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
Đây là một ví dụ định dạng đơn giản. Hãy nhớ về nó và sử dụng nó ở đúng nơi.

Tài nguyên chuỗi

Nên lưu trữ chuỗi trong tài nguyên. Việc truy cập tài nguyên chuỗi theo chương trình được thực hiện như thế này:
String catName = getResources().getString(R.string.barsik);

Trích xuất chuỗi từ mảng chuỗi trong tài nguyên

Giả sử bạn có một mảng chuỗi được xác định trong tệp strings.xml có tên là cats_array. Sau đó, bạn có thể truy cập các hàng từ các tài nguyên như thế này:
Resources res = getResources();
String[] cats = res.getStringArray(R.array.cats_array);

phương pháp

public char charAt (int index) Trả về ký tự ở offset đã chỉ định trong chuỗi này. Việc đếm ngược bắt đầu từ 0. Không cần sử dụng các giá trị âm và không tồn tại, hãy nghiêm túc hơn. Để trích xuất nhiều ký tự, hãy sử dụng getChars().
String testString = "Котёнок";
char myChar = testString.charAt(2);
tv.setText(Character.toString(myChar)); // выводит третий символ - т
public int codePointAt(int index) Trả về ký tự Unicode tại chỉ mục đã cho
String testString = "Котёнок";
int myChar = testString.codePointAt(3);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointBefore(int index) Trả về ký tự Unicode đứng trước chỉ mục đã cho
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointCount(int start, int end) Tính số ký tự Unicode giữa các vị trí startend
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar)); // возвращает 3
public int compareTo(String string) So sánh chuỗi đã chỉ định bằng cách sử dụng các giá trị ký tự Unicode và tính toán chuỗi nào nhỏ hơn, bằng hoặc lớn hơn chuỗi tiếp theo. Có thể được sử dụng để sắp xếp. Trường hợp được tính đến. Nếu các chuỗi khớp nhau thì trả về 0, nếu nhỏ hơn 0 thì chuỗi gọi nhỏ hơn chuỗi string, nếu lớn hơn 0 thì chuỗi gọi lớn hơn chuỗi string. Các từ viết hoa được đặt phía trên các từ viết thường.
String testString = "Котёнок";

if (testString.compareTo("котёнок") == 0) {
    tvInfo.setText("Строки равны");
} else {
    tvInfo.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок")); // возвращает -32
}
Hãy sắp xếp mảng chuỗi bằng cách sử dụng sắp xếp bong bóng.
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]);
}
Kết quả là chúng tôi nhận được:
Мы
везём
кота
с
собой
Như bạn có thể thấy, việc thay đổi vị trí của các số hạng không làm thay đổi tổng sắp xếp của các con mèo. public int compareToIgnoreCase (String string) So sánh chuỗi đã chỉ định bằng cách sử dụng các giá trị ký tự Unicode, không phân biệt chữ hoa chữ thường.
String testString = "Котёнок";

if (testString.compareToIgnoreCase("котёнок") == 0) {
    tv.setText("Строки равны"); // слова одинаковы, если не учитывать регистр
} else {
    tv.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок"));
}
public String concat (String string) Nối một chuỗi với chuỗi được chỉ định. Một chuỗi mới được trả về có chứa sự nối của hai chuỗi. Lưu ý rằng tên phương thức có chứa một con mèo!
String testString = "Сук";
String newString = testString.concat("кот");
tv.setText(newString);
Phương thức này thực hiện chức năng tương tự như toán tử +và có thể được viết Сук + кот. Nhưng một người yêu mèo thực sự sẽ sử dụng phương pháp "mèo". public boolean contains (CharSequence cs) Xác định xem một chuỗi có chứa một chuỗi ký tự trongCharSequence
String testString = "котёнок";

if(testString.contains("кот")){
    infoTextView.setText("В слове котёнок содержится слово кот!");
}
public static String copyValueOf (char[] data, int start, int length) Tạo một chuỗi mới chứa các ký tự được chỉ định từ mảng Databắt đầu tại vị trí start(đánh số dựa trên số 0) có độ dài . public static String copyValueOf(char[] data) Tạo một chuỗi mới chứa các ký tự từ mảng đã chỉ định. Việc thay đổi mảng sau khi hàng được tạo sẽ không làm thay đổi hàng đã tạo. public boolean endsWith(String suffix) Kiểm tra xem một chuỗi có kết thúc bằng suffix.
String str1 = "Суккот";

if(str1.endsWith("кот"))
    infoTextView.setText("Слово заканчивается на котике");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean equals (Object string) So sánh đối tượng đã chỉ định và một chuỗi và trả về true nếu các chuỗi được so sánh bằng nhau, tức là. chứa các ký tự giống nhau và theo cùng thứ tự phân biệt chữ hoa chữ thường.
String str1 = "Кот";
String str2 = "Кошка";

if(str1.equals(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
Không nên nhầm lẫn phương thức này với toán tử ==, nó so sánh hai tham chiếu đối tượng và xác định xem chúng có tham chiếu đến cùng một thể hiện hay không. Xem So sánh chuỗi: equals()hoặc ==? public boolean equalsIgnoreCase(String string) So sánh chuỗi đã chỉ định với chuỗi nguồn theo cách không phân biệt chữ hoa chữ thường và trả về true nếu chúng bằng nhau. Phạm vi AZ được coi là bằng phạm vi az.
String str1 = "Кот";
String str2 = "кот";

if(str1.equalsIgnoreCase(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
public static String format(Locale locale, String format, Object... args)
Trả về một chuỗi được định dạng bằng cách sử dụng định dạng được cung cấp và các đối số được bản địa hóa cho phạm vi đã cho. Ví dụ ngày hoặc giờ
// выводим число типа float с двумя знаками после запятой
String.format("%.2f", floatValue);
Chúng tôi dán hai từ xuất hiện trên một dòng mới. Trong trường hợp này, từ thứ hai được hiển thị bằng chữ in hoa.
String str1 = "Кот";
String str2 = "васька";
String strResult = String.format("%s\n%S", str1, str2);
// выводим результат в TextView
infoTextView.setText(strResult);
Chuyển số sang hệ bát phân.
String str1 = "8";
int inInt = Integer.parseInt(str1); // конвертируем строку в число
String strResult = String.format("(Восьмеричное meaning): %o\n", inInt);

infoTextView.setText(strResult);
Bằng cách tương tự, chúng tôi hiển thị trong hệ thập lục phân
String str1 = "255";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Шестнадцатеричное meaning): %x\n", inInt);
// число 255 будет выведено How ff
infoTextView.setText(strResult);
Đối với việc sử dụng chữ hoa %Xthì ffnó sẽ là FF. Để sử dụng hệ thập phân %d. Ngày cũng có thể được hiển thị theo nhiều cách khác nhau.
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) Trả về một chuỗi được định dạng bằng định dạng được cung cấp. public void getBytes(int start, int end, byte[] data, int index)và các tình trạng quá tải khác Phương thức này lưu trữ các ký tự vào một mảng byte, một giải pháp thay thế cho getChars(). Thường được sử dụng khi xuất chuỗi từ nhiều nguồn khác nhau sử dụng các ký tự Unicode khác. Ví dụ: Java theo mặc định hoạt động với các ký tự Unicode 16 bit và trên Internet, các chuỗi thường sử dụng Unicode 8 bit, ASCII, v.v. public void getChars(int start, int end, char[] buffer, int index) Phương pháp trích xuất nhiều ký tự từ một chuỗi. Bạn cần xác định chỉ số đầu chuỗi con ( start), chỉ mục ký tự theo sau cuối chuỗi con cần trích ( end ). Mảng nhận các ký tự đã chọn nằm trong tham số bộ đệm . Chỉ mục trong mảng, bắt đầu từ đó chuỗi con sẽ được viết, được truyền vào tham số chỉ mục . Đảm bảo rằng mảng đủ lớn để chứa tất cả các ký tự trong chuỗi con đã chỉ định.
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() Trả về một số nguyên là mã băm cho đối tượng này. public int indexOf(int c) Trả về số vị trí gặp đầu tiên với chỉ số đã chỉ định c.
String testString = "котёнок";
// символ ё встречается в четвёртой позиции (index = 3)
infoTextView.setText(String.valueOf(testString.indexOf("ё")));
public int indexOf (int c, int start) Tra cứu chỉ số từ, bắt đầu từ vị trístart
String testString = "котёнок";
// вернёт -1, так How после 5 символа буквы ё нет
infoTextView.setText(String.valueOf(testString.indexOf("ё", 4)));
public int indexOf (String string) Tìm kiếm một chuỗi ký tựsubString
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка")));
public int indexOf (String subString, int start) Tìm kiếm một chuỗi ký tự subStringbắt đầu từ vị trístart
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка", 2)));
public String intern () "Băm" một chuỗi public boolean isEmpty () Kiểm tra xem chuỗi đó có trống không
if(catname.isEmpty()) {
    // здесь ваш code
}
Phương pháp này đã xuất hiện trong API 9 (Android 2.1). Đối với các thiết bị cũ hơn, sử dụng String.length() == 0 public int lastIndexOf (String string) и другие перегруженные версии Trả về số vị trí gặp cuối cùng tại chỉ mục đã chỉ định. Ví dụ: bạn có thể lấy tên tệp không có phần mở rộng như thế này:
filename.toString().substring(0, filename.getString().lastIndexOf("."));
Trong ví dụ này, chúng ta lấy vị trí của điểm cuối cùng và lấy chuỗi con trước nó. public int length() Trả về độ dài của một chuỗi
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.length())); // возвращает 7 (семь символов)
public boolean matches(String regularExpression) Kiểm tra xem một chuỗi có khớp với biểu thức chính quy hay không.
public int offsetByCodePoints (int index, int codePointOffset)
Trả về một vị trí nằm cách một khoảng codePointOffsetso với vị trí bắt đầu được chỉ định bởi tham số.Phương index public boolean regionMatches (int thisStart, String string, int start, int length) thức so sánh phần đã chỉ định của chuỗi với phần khác của chuỗi. Bạn phải chỉ định chỉ mục ở đầu phạm vi hàng của đối tượng gọi của lớp String. Chuỗi cần so sánh được truyền vào tham số string. Chỉ mục của ký tự bắt đầu từ đó phép so sánh cần thực hiện được truyền vào tham số startvà độ dài của chuỗi con cần so sánh được truyền vào tham số length. public boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length) Phiên bản quá tải Phương thức này so sánh phần được chỉ định của chuỗi với phần khác của chuỗi, bỏ qua chữ hoa chữ thường. public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии Thay đổi một ký tự hoặc chuỗi ký tự targetthànhreplacement
String testString = "whale";
// меняем и на о
infoTextView.setText(testString.replace("And", "о")); // возвращается кот
public String replaceAll (String regularExpression, String replacement) public String replaceFirst (String regularExpression, String replacement) Loại bỏ các ký tự đầu tiên bằng cách sử dụng biểu thức chính quy. Ví dụ: nếu bạn cần xóa số 0 ở đầu các số 001, 007, 000024 thì bạn có thể sử dụng lệnh gọi này.
String s = "001234-cat";
String s = s.replaceFirst ("^0*", ""); // останется 1234-cat
public String[] split (String regularExpression) и другие перегруженные версии Tách một chuỗi thành một mảng các từ. Ví dụ: có một chuỗi Vaska Ryzhik Murzik Barsik và chúng tôi muốn lấy một mảng tên mèo:
String catnames = "Васька Рыжик Мурзик Барсик";
String aCats[] = catnames.split(" ");  // по пробелу
Chúng tôi nhận được:
aCats[0] = Васька
aCats[1] = Рыжик
aCats[2] = Мурзик
aCats[3] = Барсик
public boolean startsWith(String prefix) Kiểm tra xem một chuỗi có bắt đầu bằng các ký tự prefixtừ đầu chuỗi không
String str1 = "котлета";

if(str1.startsWith("кот"))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean startsWith(String prefix, int start) Kiểm tra xem chuỗi đã cho có bắt đầu bằng các ký tự prefixở vị trí đã chỉ định hay không.
String str1 = "Суккот";

if(str1.startsWith("кот", 3))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public CharSequence subSequence (int start, int end) Tương tự như phương pháp substring(), nhưng có thể được sử dụng cho CharSequence. public String substring(int start)và các tình trạng quá tải khác Tạo một chuỗi/chuỗi mới với các ký tự từ chuỗi đã cho bắt đầu từ vị trí startđến cuối dòng/kết thúc bằng ký tự ở vị trí end. Dòng mới chứa các ký tự từ startđến cuối - 1 nên ta lấy thêm 1 ký tự.
String testString = "скотина";

infoTextView.setText(testString.substring(1, 4)); // возвращается кот
public char[] toCharArray() Sao chép các ký tự trong chuỗi này vào một mảng ký tự. Kết quả tương tự có thể thu được thông qua getChars(). Tài liệu không khuyến nghị sử dụng phương pháp này, đề xuất tệp charAt().
String unusualCat = "Котёнок по имени Гав";

char[] yomoe = unusualCat.toCharArray();
infoTextView.setText(String.valueOf(yomoe[3]));
public String toLowerCase() и другие перегруженные версии Chuyển đổi một chuỗi thành chữ thường. Ngôn ngữ mặc định kiểm soát việc chuyển đổi. Chuỗi mèo = "Mèo"; Chuỗi thấp hơn = cat.toLowerCase(); infoTextView.setText(thấp hơn); public String toString () Trả về một chuỗi. Đối với chính chuỗi đó, bản thân nó đã là một chuỗi, việc trả lại chuỗi đó là vô nghĩa (ồ, tôi đã bẻ cong nó như thế nào). Nhưng phương pháp này thực sự rất hữu ích cho các lớp khác. public String toUpperCase() Chuyển đổi một chuỗi thành chữ hoa. Ngôn ngữ mặc định kiểm soát việc chuyển đổi.
String cat = "Кот";
String upper = cat.toUpperCase();
infoTextView.setText(upper);
public String trim() Loại bỏ khoảng trắng ở đầu và cuối chuỗi.
String str = "   Hello Kitty  ".trim();
infoTextView.setText(str);
public static String valueOf(long value)và các tình trạng quá tải khác Chuyển đổi nội dung (số, đối tượng, ký tự, mảng ký tự) thành chuỗi.
int catAge = 7; // это число

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

Tạo một chuỗi ngẫu nhiên

Giả sử chúng ta cần một chuỗi ký tự ngẫu nhiên.
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();
}

So sánh chuỗi: equals()hoặc ==?

Hãy xem một ví dụ.
String str1 = "Murzik";
String str2 = new String(str1);
boolean isCat = str1 == str2;

infoTextView.setText(str1 + " == " + str2 + " -> " + isCat);
Mặc dù hai biến chứa cùng một từ, nhưng chúng ta đang xử lý hai đối tượng khác nhau và toán tử ==sẽ trả về false . Một lần, khi cây đã lớn, tôi cần so sánh hai chuỗi từ các nguồn khác nhau. Mặc dù các chuỗi trông giống hệt nhau nhưng phép so sánh sử dụng toán ==tử trả về sai và khiến tôi nhầm lẫn tất cả các thẻ. Và chỉ sau đó tôi mới phát hiện ra rằng tôi cần sử dụng equals(). Chuỗi trong Java là một đối tượng riêng biệt, có thể không giống với đối tượng khác, mặc dù đầu ra của chuỗi có thể trông giống nhau trên màn hình. Chỉ là Java, trong trường hợp toán tử logic ==(cũng như !=), so sánh các tham chiếu với các đối tượng (không có vấn đề như vậy khi làm việc với các nguyên hàm):
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)));
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION