JavaRush /จาวาบล็อก /Random-TH /คลาสสตริง
articles
ระดับ

คลาสสตริง

เผยแพร่ในกลุ่ม
  • วิธีการ
  • การสร้างสตริงแบบสุ่ม
  • การเปรียบเทียบสตริง: equals()หรือ==?
โปรแกรมเมอร์มักใช้ คลาสนี้Stringบ่อยมาก ดังนั้นจึงควรเรียนรู้เป็นอย่างดี สตริงคลาส - 1โปรดจำไว้ว่าวัตถุคลาสStringไม่เปลี่ยนรูป ดังนั้นเมื่อคุณคิดว่าคุณกำลังเปลี่ยนสตริง แสดงว่าคุณกำลังสร้างสตริงใหม่จริงๆ Java มีคลาสพิเศษStringBufferและStringBuilderอนุญาตให้เปลี่ยนแปลงสตริงได้ คลาสString, StringBuffer, StringBuilderถูกกำหนดไว้ใน แพ็คเกจ java.langและพร้อมใช้งานโดยอัตโนมัติโดยไม่ต้องมีการประกาศการนำเข้า ทั้งสามคลาสใช้อินเทอร์เฟCharSequenceซ การสร้างสตริงนั้นง่ายมาก ตัวอย่างเช่น คุณสามารถทำได้:
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
คุณสามารถสร้างอาร์เรย์ของสตริงได้:
String[] cats = {"Васька", "Barsik", "Murzik"};
คุณสามารถสร้างวัตถุคลาสว่างString:
String str = new String();
คุณสามารถสร้างสตริงผ่านอาร์เรย์อักขระ:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
นอกจากนี้ยังมี Constructor ที่ให้คุณตั้งค่าช่วงของอาร์เรย์อักขระได้ คุณต้องระบุจุดเริ่มต้นของช่วงและจำนวนอักขระที่จะใช้:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
คุณสามารถสร้างคลาสอ็อบเจ็กต์Stringจากคลาสอ็อบเจ็กต์ได้StringBufferโดยใช้StringBuilderConstructor ต่อไปนี้:
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>
หากต้องการแสดงสตริงนี้โดยทางโปรแกรมในองค์ประกอบ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.xmlชื่อcats_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) คำนวณจำนวนอักขระ Unicode ระหว่างตำแหน่งstartและend
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar)); // возвращает 3
public int compareTo(String string) เปรียบเทียบสตริงที่ระบุโดยใช้ค่าอักขระ Unicode และคำนวณว่าสตริงใดมีค่าน้อยกว่า เท่ากับ หรือมากกว่าถัดไป สามารถใช้สำหรับการเรียงลำดับ กรณีจะถูกนำมาพิจารณา หากสตริงตรงกัน ระบบจะส่งคืนค่า 0 หากน้อยกว่าศูนย์ แสดงว่าสตริงที่เรียกมีค่าน้อยกว่า string stringหากมากกว่าศูนย์ แสดงว่าสตริงที่เรียกมีค่ามากกว่าstringstring คำตัวพิมพ์ใหญ่จะอยู่เหนือคำตัวพิมพ์เล็ก
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) เชื่อมต่อสตริงกับสตริงที่ระบุ สตริงใหม่จะถูกส่งกลับโดยมีการต่อข้อมูลของทั้งสองสตริงเข้าด้วยกัน โปรดทราบว่าชื่อวิธีการนั้นมี cat!
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) เปรียบเทียบวัตถุที่ระบุและสตริง และส่งคืนค่าจริงหากสตริงที่เปรียบเทียบเท่ากัน เช่น มีอักขระเหมือนกันและอยู่ในลำดับที่คำนึงถึงตัวพิมพ์เล็กและใหญ่เหมือนกัน
String str1 = "Кот";
String str2 = "Кошка";

if(str1.equals(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
อย่าสับสนวิธีการนี้กับตัวดำเนินการ==ซึ่งจะเปรียบเทียบการอ้างอิงออบเจ็กต์สองรายการและพิจารณาว่าอ้างอิงถึงอินสแตนซ์เดียวกันหรือไม่ ดูการเปรียบเทียบสตริง: equals()หรือ==? public boolean equalsIgnoreCase(String string) เปรียบเทียบสตริงที่ระบุกับสตริงต้นทางในลักษณะที่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ และส่งคืนค่าจริงหากเท่ากัน ช่วง 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 โดยค่าเริ่มต้นใช้งานได้กับอักขระ Unicode 16 บิต และบนอินเทอร์เน็ต สตริงมักใช้ Unicode 8 บิต, ASCII เป็นต้น public void getChars(int start, int end, char[] buffer, int index) วิธีการแยกอักขระหลายตัวจากสตริง คุณต้องระบุดัชนีของจุดเริ่มต้นของสตริงย่อย ( start) ดัชนีของอักขระที่อยู่หลังจุดสิ้นสุดของสตริงย่อยที่จะแยก ( end ) อาร์เรย์ที่ได้รับอักขระที่เลือกจะอยู่ในพารามิเตอร์บัฟเฟอร์ ดัชนีในอาร์เรย์ซึ่งเริ่มต้นจากการเขียนสตริงย่อยจะถูกส่งผ่านในพารามิเตอร์ดัชนี ตรวจสอบให้แน่ใจว่าอาร์เรย์มีขนาดใหญ่พอที่จะมีอักขระทั้งหมดในสตริงย่อยที่ระบุ
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และความยาวของสตริงย่อยที่จะเปรียบเทียบจะถูกส่งผ่านในlengthพารามิเตอร์ public boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length) เวอร์ชันโอเวอร์โหลด วิธีการเปรียบเทียบส่วนที่ระบุของสตริงกับส่วนอื่นของสตริง โดยไม่สนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии เปลี่ยนอักขระหรือลำดับของอักขระ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) и другие перегруженные версии แยกสตริงออกเป็นอาร์เรย์ของคำ ตัวอย่างเช่น มีสตริง 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()แต่สามารถใช้ได้สำหรับCharSequence. public 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() и другие перегруженные версии แปลงสตริงเป็นตัวพิมพ์เล็ก ภาษาเริ่มต้นจะควบคุมการแปลง แมวสตริง = "แมว"; สตริงล่าง = 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 ครั้งหนึ่ง เมื่อต้นไม้มีขนาดใหญ่ ฉันจำเป็นต้องเปรียบเทียบสองสายจากแหล่งที่ต่างกัน แม้ว่าสตริงจะดูเหมือนกันทุกประการ แต่การเปรียบเทียบโดยใช้ตัวดำเนินการ==กลับเป็นเท็จและทำให้การ์ดทั้งหมดสับสนสำหรับฉัน แล้วฉันก็พบว่าฉันจำเป็นต้องใช้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