บทความนี้จะแนะนำคำถามที่พบบ่อย 10 ข้อเกี่ยวกับ String ใน Java:
1. สำหรับการเปรียบเทียบสตริง คุณควรใช้ "==" หรือเท่ากับ()?
พูดง่ายๆ ก็คือ "==" กำหนดว่าการอ้างอิงสองรายการอ้างถึงที่อยู่หน่วยความจำเดียวกัน (วัตถุทางกายภาพเดียวกัน)
และเท่ากับจะกำหนดว่าค่าของสองสตริงเท่ากันหรือไม่
เว้นแต่ว่าคุณต้องการตรวจสอบว่าการอ้างอิงสตริงสองตัวเป็นวัตถุเดียวกันหรือไม่ คุณควรใช้เมธอดเท่ากับ () เสมอ
คุณจะเข้าใจปัญหานี้ดีขึ้นหากคุณเข้าใจ string interning
2. สำหรับข้อมูลที่ละเอียดอ่อน เหตุใดจึงควรใช้ char[] มากกว่า String
สตริงเป็นวัตถุที่ไม่เปลี่ยนรูป ซึ่งหมายความว่าเมื่อสร้างขึ้นแล้ว วัตถุทั้งหมดจะไม่สามารถเปลี่ยนแปลงได้ แม้ว่ามือใหม่จะคิดว่าการอ้างอิงสตริงมีการเปลี่ยนแปลง แต่จริงๆ แล้วเป็นเพียงการอ้างอิง (ตัวชี้) ที่ชี้ไปยังวัตถุอื่น (ใหม่)
โปรแกรมเมอร์สามารถปรับเปลี่ยนอาร์เรย์อักขระได้อย่างชัดเจน ดังนั้นข้อมูลที่ละเอียดอ่อน (เช่น รหัสผ่าน) จะไม่ถูกเปิดเผยที่อื่นโดยง่าย (ตราบใดที่คุณตั้งค่า char[] เป็น 0 หลังการใช้งาน)
3. ใช้ String เป็นเงื่อนไขตัวพิมพ์ในคำสั่ง switch หรือไม่?
เป็นไปได้ตั้งแต่ JDK7 อย่างไรก็ตาม Java 6 และเวอร์ชันก่อนหน้าไม่รองรับสิ่งนี้
คัดลอกรหัสรหัสดังต่อไปนี้:
// ใช้ได้เฉพาะใน Java 7 ขึ้นไป!
สวิตช์ (str.toLowerCase()) {
กรณี "ก":
ค่า = 1;
หยุดพัก;
กรณี "ข":
ค่า = 2;
หยุดพัก;
-
4. แปลงสตริงให้เป็นตัวเลข
สำหรับตัวเลขจำนวนมาก โปรดใช้ Long รหัสจะเป็นดังนี้
คัดลอกรหัสรหัสดังต่อไปนี้:
อายุ int = Integer.parseInt("10");
long id = Long.parseLong("190"); // หากค่าอาจมีขนาดใหญ่
5. วิธีแยกสตริงด้วยอักขระช่องว่าง
สตริงที่ได้รับโดยเมธอด split() ของ String จะถูกแยกวิเคราะห์เป็นนิพจน์ทั่วไป
"/s" หมายถึงอักขระว่าง เช่น ช่องว่าง " ", แท็บ "/t", การป้อนบรรทัด "/n", การขึ้นบรรทัดใหม่ "/r"
เมื่อคอมไพลเลอร์แยกวิเคราะห์ซอร์สโค้ด คอมไพเลอร์จะทำการแปลงรหัสตามตัวอักษรด้วย ดังนั้นจึงจำเป็นต้องใช้ "//s"
คัดลอกรหัสรหัสดังต่อไปนี้:
สตริง[] strArray = aString.split("//s+");
6. วิธีการ substring() ประมวลผลภายในอย่างไร?
ใน JDK6 เมธอด substring() ยังคงแชร์อาร์เรย์ char[] ดั้งเดิมและสร้างสตริง "ใหม่" ผ่านออฟเซ็ตและความยาว
หากคุณต้องการให้ substring() ได้รับวัตถุที่สร้างขึ้นใหม่ ให้ใช้วิธีการต่อไปนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
สตริงย่อย = str.substring (เริ่มต้น, สิ้นสุด) + "";
แน่นอนว่าใน Java 7 นั้น substring() จะสร้างอาร์เรย์ char[] ใหม่แทนที่จะแชร์มัน
หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่: วิธีการ substring() และความแตกต่างใน JDK6 และ JDK7
7. String กับ StringBuilder กับ StringBuffer
StringBuilder ไม่สามารถเปลี่ยนแปลงได้ ดังนั้นค่าภายในสามารถแก้ไขได้หลังการสร้าง
StringBuffer ได้รับการซิงโครไนซ์และปลอดภัยต่อเธรด แต่มีประสิทธิภาพน้อยกว่า
8. จะประกบสายเดิมซ้ำๆ ได้อย่างไร?
ตัวเลือกที่ 1: ใช้คลาสยูทิลิตี้ StringUtils ของไลบรารี Apache Commons Lang
คัดลอกรหัสรหัสดังต่อไปนี้:
สตริง str = "abcd";
สตริงซ้ำ = StringUtils.repeat(str,3);//abcdabcdabcd
ตัวเลือก 2:
ใช้ตัวสร้าง StringBuilder มีความยืดหยุ่นมากขึ้น
คัดลอกรหัสรหัสดังต่อไปนี้:
สตริง src = "ชื่อ";
int len = src.length();
int ซ้ำ = 5;
StringBuilder builder = StringBuilder ใหม่ (len * ซ้ำ);
สำหรับ(int i=0; i<ซ้ำ; i++){
builder.ผนวก(src);
-
สตริง dst = builder.toString();
9. วิธีแปลงสตริงเป็นวันที่?
คัดลอกรหัสรหัสดังต่อไปนี้:
รูปแบบ SimpleDateFormat = SimpleDateFormat ใหม่ ("yyyy-MM-dd");
สตริง str = "2013-11-07";
วันที่ วันที่ = format.parse(str);
System.out.println(format.format(date));//2013-11-07
10. จะนับจำนวนครั้งที่ตัวละครบางตัวปรากฏได้อย่างไร?
นอกจากนี้ยังใช้คลาส StringUtils ไลบรารี Apache Commons Lang:
คัดลอกรหัสรหัสดังต่อไปนี้:
int n = StringUtils.countMatches("11112222", "1");
System.out.println(n);