1. บทนำ
Java จัดเตรียมเมธอดและคลาสจำนวนมากสำหรับการต่อสตริงเข้าด้วยกัน
ในบทช่วยสอนนี้เราจะเจาะลึกลงไปในหลายข้อพร้อมทั้งสรุปข้อผิดพลาดทั่วไปและแนวทางปฏิบัติที่ไม่ดี
2. StringBuilder
อันดับแรกคือStringBuilder ที่ต่ำต้อย ชั้นนี้ให้อาร์เรย์ของString-สาธารณูปโภคอาคารที่ทำให้การทำงานง่ายStringจัดการ
มาสร้างตัวอย่างสั้น ๆ ของการต่อสตริงโดยใช้คลาสStringBuilder :
StringBuilder stringBuilder = new StringBuilder(100); stringBuilder.append("Baeldung"); stringBuilder.append(" is"); stringBuilder.append(" awesome"); assertEquals("Baeldung is awesome", stringBuilder.toString());
ภายในStringBuilderรักษาอาร์เรย์ของอักขระที่ไม่แน่นอน ในตัวอย่างโค้ดของเราเราได้ประกาศให้มีขนาดเริ่มต้น 100ผ่านตัวสร้างStringBuilder เพราะการประกาศขนาดนี้StringBuilderอาจจะเป็นที่มีประสิทธิภาพมากวิธีการ concatenate สตริง
นอกจากนี้ยังเป็นที่น่าสังเกตว่าStringBufferชั้นเป็นรุ่นที่ตรงกันของStringBuilder
แม้ว่าการซิงโครไนซ์มักจะตรงกันกับความปลอดภัยของเธรด แต่ก็ไม่แนะนำให้ใช้ในแอพพลิเคชั่นมัลติเธรดเนื่องจากรูปแบบตัวสร้างStringBuffer แม้ว่าการโทรแต่ละครั้งไปยังวิธีการซิงโครไนซ์จะปลอดภัยสำหรับเธรด แต่การโทรหลายครั้งจะไม่
3. ตัวดำเนินการเพิ่มเติม
ถัดไปคือตัวดำเนินการเพิ่มเติม (+) นี่คือตัวดำเนินการเดียวกับที่ส่งผลให้เกิดการเพิ่มตัวเลขและมีการโอเวอร์โหลดเพื่อเชื่อมต่อกันเมื่อใช้กับStrings
มาดูวิธีการทำงานอย่างรวดเร็ว:
String myString = "The " + "quick " + "brown " + "fox..."; assertEquals("The quick brown fox...", myString);
ในตอนแรกสิ่งนี้อาจดูกระชับกว่าตัวเลือกStringBuilder แต่เมื่อคอมไพล์รหัสที่มาสัญลักษณ์ + แปลโซ่ของStringBuilder.append ()โทร เนื่องจากนี้ผสมStringBuilderและวิธี +ของการเรียงต่อกันจะถือว่าปฏิบัติไม่ดี
นอกจากนี้ควรหลีกเลี่ยงการต่อสตริงโดยใช้ตัวดำเนินการ + ภายในลูป เนื่องจากอ็อบเจกต์Stringไม่เปลี่ยนรูปการเรียกใช้การต่อกันแต่ละครั้งจะส่งผลให้มีการสร้างอ็อบเจกต์Stringใหม่
4. วิธีการสตริง
Stringระดับตัวเองให้พื้นที่ทั้งหมดของวิธีการในการเชื่อมโยงสาย
4.1. String.concat
ไม่น่าแปลกใจที่เมธอดString.concatเป็นพอร์ตการโทรแรกของเราเมื่อพยายามเชื่อมต่อวัตถุString เมธอดนี้จะส่งคืนอ็อบเจ็กต์Stringดังนั้นการโยงเมธอดเข้าด้วยกันจึงเป็นคุณสมบัติที่มีประโยชน์
String myString = "Both".concat(" fickle") .concat(" dwarves") .concat(" jinx") .concat(" my") .concat(" pig") .concat(" quiz"); assertEquals("Both fickle dwarves jinx my pig quiz", myString);
ในตัวอย่างนี้ chain ของเราเริ่มต้นด้วยString literal จากนั้นวิธีconcatจะช่วยให้เราสามารถโยงการโทรเพื่อผนวกStringsเพิ่มเติมได้
4.2. สตริงรูปแบบ
ถัดไปคือเมธอดString.formatซึ่งช่วยให้เราสามารถฉีด Java Objects ต่างๆลงในเทมเพลตStringได้
String.formatลายเซ็นวิธีใช้เพียงครั้งเดียวString denoting แม่แบบของเรา นี้แม่แบบมีตัวอักษร '%' เพื่อเป็นตัวแทนที่ต่างๆวัตถุควรวางไว้ด้านใน
เมื่อเทมเพลตของเราได้รับการประกาศแล้วจะใช้อาร์เรย์วัตถุ varargs ซึ่งจะถูกฉีดเข้าไปในเทมเพลต
มาดูวิธีการทำงานกับตัวอย่างสั้น ๆ :
String myString = String.format("%s %s %.2f %s %s, %s...", "I", "ate", 2.5056302, "blueberry", "pies", "oops"); assertEquals("I ate 2.51 blueberry pies, oops...", myString);
ดังที่เราเห็นด้านบนวิธีนี้ได้ฉีดStringsของเราลงในรูปแบบที่ถูกต้อง
4.3. String.join (Java 8+)
หากแอปพลิเคชันของเราทำงานบน Java 8 ขึ้นไปเราสามารถใช้ประโยชน์จากเมธอดString.join ด้วยสิ่งนี้เราสามารถรวมอาร์เรย์ของสตริงด้วยตัวคั่นทั่วไปเพื่อให้แน่ใจว่าจะไม่มีช่องว่าง
String[] strings = {"I'm", "running", "out", "of", "pangrams!"}; String myString = String.join(" ", strings); assertEquals("I'm running out of pangrams!", myString);
ข้อดีอย่างมากของวิธีนี้คือไม่ต้องกังวลกับตัวคั่นระหว่างสตริงของเรา
5. StringJoiner (Java 8+)
StringJoinerบทคัดย่อทั้งหมดของString.Joinฟังก์ชันการทำงานลงง่ายต่อการใช้งานในชั้นเรียน คอนสตรัคคั่นจะใช้เวลาที่มีตัวเลือกคำนำหน้าและคำต่อท้าย เราสามารถต่อท้ายสตริงโดยใช้วิธีการเพิ่มที่มีชื่อดี
StringJoiner fruitJoiner = new StringJoiner(", "); fruitJoiner.add("Apples"); fruitJoiner.add("Oranges"); fruitJoiner.add("Bananas"); assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString());
โดยใช้คลาสนี้แทนString.Joinวิธีการที่เราสามารถผนวกStringsเป็นโปรแกรมวิ่ง ; ไม่จำเป็นต้องสร้างอาร์เรย์ก่อน!
ไปที่บทความของเราเกี่ยวกับStringJoinerสำหรับข้อมูลเพิ่มเติมและตัวอย่าง
6. Arrays.toString
ในหัวข้อของอาร์เรย์คลาสArrayยังมีเมธอดtoString ที่สะดวกซึ่งจัดรูปแบบอาร์เรย์ของอ็อบเจ็กต์ อาร์เรย์ เมธอดtoStringยังเรียกเมธอดtoStringของอ็อบเจ็กต์ที่ปิดล้อมใด ๆ - ดังนั้นเราต้องแน่ใจว่าเราได้กำหนดไว้
String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"}; String toString = Arrays.toString(myFavouriteLanguages); assertEquals("[Java, JavaScript, Python]", toString);
Unfortunately, the Arrays.toString method is not customizable and only outputs a String encased in square brackets.
7. Collectors.joining (Java 8+)
Finally, let's take a look at the Collectors.joining method which allows us to funnel the output of a Stream into a single String.
List awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo"); String animalString = awesomeAnimals.stream().collect(Collectors.joining(", ")); assertEquals("Shark, Panda, Armadillo", animalString);
Using streams unlocks all of the functionality associated with the Java 8 Stream API, such as filtering, mapping, iterating and more.
8. Wrap Up
In this article, we've taken a deep dive into the multitude of classes and methods used to concatenate Stringsin the Java language.
และเช่นเคยซอร์สโค้ดสามารถใช้ได้บน GitHub