ฉันถูกถามแล้วว่าจะสร้างโปรแกรมจำนวนเท่าใดสตริงโดยสมมติว่าการรวบรวมขยะไม่ได้เกิดขึ้น ความคิดของฉันสำหรับ n = 3 คือ (7)
Strings 1 ( ""
) และ 2 ( "a"
) เป็นค่าคงที่ในโปรแกรมสิ่งเหล่านี้ไม่ได้ถูกสร้างขึ้นเป็นส่วนหนึ่งของสิ่งต่าง ๆ แต่เป็น 'interned' เพราะมันเป็นค่าคงที่คอมไพเลอร์รู้ อ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ที่String interningบน Wikipedia
สิ่งนี้จะลบสตริงที่ 5 และ 7 ออกจากการนับเช่นเดียว"a"
กับ String # 2 สิ่งนี้ทำให้สตริง # 3, # 4 และ # 6 คำตอบคือ "3 สายถูกสร้างขึ้นสำหรับ n = 3" โดยใช้รหัสของคุณ
เห็นได้ชัดว่าจำนวนนับของ n 2ผิดเพราะที่ n = 3 นี่จะเป็น 9 และแม้กระทั่งโดยคำตอบกรณีที่เลวร้ายที่สุดนั่นก็คือ 7 เท่านั้นหากสตริงที่ไม่ได้ถูกฝึกงานของคุณถูกต้องคำตอบควรเป็น 2n + 1
ดังนั้นคำถามที่คุณควรทำอย่างไร
เนื่องจากString นั้นไม่เปลี่ยนรูปคุณจึงต้องการสิ่งที่เปลี่ยนแปลงได้ซึ่งเป็นสิ่งที่คุณสามารถเปลี่ยนแปลงได้โดยไม่ต้องสร้างวัตถุใหม่ นั่นคือStringBuilder
สิ่งแรกที่ต้องดูคือตัวสร้าง ในกรณีนี้เรารู้ว่าสตริงจะนานแค่ไหนและมีนวกรรมิกStringBuilder(int capacity)
ซึ่งหมายความว่าเราจัดสรรเท่าที่เราต้องการ
ถัดไป"a"
ไม่จำเป็นต้องเป็นStringแต่สามารถเป็นอักขระ'a'
ได้ สิ่งนี้มีการเพิ่มประสิทธิภาพเล็กน้อยเมื่อทำการเรียกappend(String)
vs append(char)
- ด้วยappend(String)
เมธอดต้องการค้นหาว่า String ยาวแค่ไหนและทำงานบางอย่างกับมัน ในอีกด้านchar
หนึ่งจะมีความยาวหนึ่งอักขระเสมอ
ความแตกต่างรหัสสามารถมองเห็นที่StringBuilder.append (String) VS StringBuilder.append (ถ่าน) ไม่ได้เป็นสิ่งที่จะเป็นมากเกินไปที่เกี่ยวข้องกับการ แต่ถ้าคุณกำลังพยายามที่จะสร้างความประทับใจให้นายจ้างที่ดีที่สุดคือการใช้วิธีปฏิบัติที่ดีที่สุด
ดังนั้นสิ่งนี้จะมีลักษณะอย่างไรเมื่อคุณรวมเข้าด้วยกัน?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
หนึ่ง StringBuilder และหนึ่งสตริงได้ถูกสร้างขึ้น ไม่จำเป็นต้องมีสายอักขระพิเศษ
เขียนโปรแกรมง่ายๆอื่น ๆ ใน Eclipse ติดตั้งpmdและรันบนโค้ดที่คุณเขียน สังเกตสิ่งที่มันบ่นและแก้ไขสิ่งเหล่านั้น มันจะได้พบการดัดแปลงของ String ที่มี + ในลูปและถ้าคุณเปลี่ยนเป็น StringBuilder ก็อาจจะพบความจุเริ่มต้น แต่มันจะจับความแตกต่างระหว่าง.append("a")
และ.append('a')