นี่เป็นวิธีที่ถูกต้องในการแปลงถ่านให้เป็น String ใน Java หรือไม่? [ซ้ำ]


20

ในขณะที่เขียนการทดสอบหน่วยสำหรับฟังก์ชั่นการส่งคืนbooleanที่ใช้เวลาสองStringวินาทีและฉันต้องการทดสอบอักขระทุกตัวของตัวอักษร ( 'a'- 'z') ตามลำดับเป็นหนึ่งในพารามิเตอร์หนึ่งตัวต่อหนึ่งดังนั้นฉันจึงเขียนสิ่งนี้เพื่อทำสิ่งนี้:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

ฉันคิดว่านี่เป็นสิ่งที่อนุญาต แต่มันไม่ใช่ดังนั้นฉันจึงทำแบบนี้แทน:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

นี่เป็นวิธีที่เชื่อถือได้ในการแปลง a charเป็นStringin Java หรือไม่? มันเป็นวิธีที่ต้องการหรือไม่ ฉันไม่รู้มากเกี่ยวกับ Java ดังนั้นอยากจะชี้แจงเกี่ยวกับเรื่องนี้


2
ไม่ตรงกับคำถามของคุณ แต่ฉันจะIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
เอลเลียต Frisch

3
@ElliottFrisch แต่ทำไม? ลำธารที่ไม่จำเป็นที่นี่ แต่แม้ว่าคุณจะยืนยันในการใช้กระแสทุกห่วงว่าทำไมไม่ได้อยู่ที่การใช้งานน้อยIntStream.rangeClosed('a', 'z')?
PhilipRoman

1
ไม่มีวิธีใดที่ 'ถูกต้อง' อาจมีอย่างน้อยห้าวิธีในการทำสิ่งนี้: ซึ่งคุณเลือกขึ้นอยู่กับแฟชั่นมากเท่ากับความจริงทางวิทยาศาสตร์ ส่วนใหญ่เวลามันไม่สำคัญและโปรแกรมทดสอบเป็นหนึ่งในกรณีเหล่านั้น
user207421

@PhilipRoman เพราะมันอยู่ที่นั่น (Edmund Hillary) เพราะฉันทำได้. เพราะเราต้องการ (Billie Piper ฉันคิดว่า) นั่นเป็นวิธีที่ยอดเยี่ยมเช่นกัน
Elliott Frisch

ฉันคิดว่ามันเป็นสิ่งที่อนุญาตคุณคิดว่ามันเป็นสิ่งที่อนุญาตให้Stringสร้างนวกรรมิกที่ไม่มีตัวตนได้หรือไม่? แก้ไขให้ฉันถ้าฉันผิด แต่เท่าที่ฉันรู้มีตัวสร้างในคลาสStringที่ใช้charอาร์กิวเมนต์เดียว โปรดทราบว่าไม่ได้เป็นเช่นเดียวกับchar char[]
Abra

คำตอบ:


33

ทางออกที่สั้นที่สุด:

char c = 'a';
String s = "" + c;

โซลูชันที่สะอาดและมีประสิทธิภาพมากที่สุด1 ):

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

เมื่อเทียบกับวิธีการของคุณข้างต้นจะป้องกันไม่ให้ค่าใช้จ่ายในการดั้งเดิมกล่องเป็นCharacterวัตถุ


1ความไม่มีประสิทธิภาพเล็กน้อยของการต่อสตริงในวิธีแรกอาจได้รับการปรับให้เหมาะสมโดยคอมไพเลอร์หรือรันไทม์ดังนั้นหนึ่ง (ถ้ามีแนวโน้มมาก) จะต้องเรียกใช้ไมโครมาตรฐานเพื่อกำหนดประสิทธิภาพที่แท้จริง การปรับให้เหมาะสมขนาดเล็กเช่นนี้ไม่ค่อยคุ้มค่ากับความพยายามและพึ่งพาการต่อข้อมูลเพื่อบังคับการแปลงสตริงเพียงแค่ดูไม่ดีนัก


6
ครั้งสุดท้ายที่ฉันดูjavacคอมไพเลอร์ของ Sun จะแปลงString s = "" + c;เป็นอัตโนมัติString s = String.valueOf(c);ดังนั้นประสิทธิภาพจะเหมือนกัน
Neil

4
@Neil ต๊าย! ผมเริ่มคิดว่าประเภทของบุคคลที่ผมเขียนเชิงอรรถที่ไม่มีตัวตนบนกองมากเกิน :)
ร็อบบี้ Cornelissen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.