การทำงานภายในของสตริงและวิธีการย่อย - 1

“สวัสดี อามีโก้!”

"สวัสดี เอลลี่"

"ฉันจะบอกคุณเกี่ยวกับสตริงย่อย สตริงย่อยเป็นส่วนหนึ่งของสตริง และการดำเนินการทั่วไปที่ทำกับสตริง (หลังจากรวมสตริงหลายตัวเข้าด้วยกัน) คือการได้รับสตริงย่อย"

7) ฉันจะเป็นส่วนหนึ่งของสตริงได้อย่างไร

"เมธอดสตริงย่อยส่งคืนส่วนหนึ่งของสตริง เมธอดนี้มี 2 เวอร์ชัน"

"เวอร์ชันแรกจะส่งคืนสตริงย่อยที่ระบุโดยดัชนีเริ่มต้นและสิ้นสุดแต่อักขระที่ดัชนีสิ้นสุดจะไม่รวมอยู่ด้วย!หากคุณผ่านหมายเลข 1 และ 3 สตริงย่อยจะมีเฉพาะอักขระที่สองและสามเท่านั้น (โปรดจำไว้ว่าดัชนีเริ่มต้น ด้วย 0)"

"เวอร์ชันที่สองจะส่งคืนสตริงย่อยที่เริ่มต้นจากดัชนีที่ส่งผ่านไปจนถึงจุดสิ้นสุดของสตริง"

วิธีการ ตัวอย่าง)
String substring(int beginIndex, int endIndex)
String s = "Good news, everyone!";
s = s.substring(1,6);
ผลลัพธ์:

s == "ood n";
String substring(int beginIndex)
String s = "Good news, everyone!";
s = s.substring(1);

"ง่ายพอ ขอบคุณ Ellie"

"ฉันจะอธิบายการทำงานภายในของวัตถุสตริงให้คุณด้วย"

"อย่างที่คุณคงทราบกันดีอยู่แล้วว่า String เป็นคลาสที่ไม่เปลี่ยนรูปแบบ และข้อดีนั้นให้อะไรกับเราบ้าง เมื่อมันเกิดขึ้น ข้อดีหลักประการหนึ่งคือความสามารถในการรับสตริงย่อย แต่สิ่งแรกต้องมาก่อน"

"ภายใน อ็อบเจกต์สตริงประกอบด้วยอาร์เรย์ของอักขระ ซึ่งเดาได้ไม่ยากนัก แต่มันยังเก็บตัวแปรอีกสองตัว: ดัชนีของอักขระตัวแรกในอาร์เรย์และจำนวนอักขระ ตอนนี้ฉันจะบอกคุณว่าสิ่งเหล่านี้ ใช้สำหรับ"

"เมื่อเราสร้างสตริงย่อยโดยใช้ เมธอด สตริงย่อย วัตถุ สตริงใหม่จะถูกสร้างขึ้น"

"แต่แทนที่จะจัดเก็บการอ้างอิงไปยังอาร์เรย์อักขระใหม่ ออบเจ็กต์จะเก็บการอ้างอิงไปยังอาร์เรย์เก่ารวมทั้งตัวแปรสองตัวที่ใช้เพื่อกำหนดส่วนของอาร์เรย์อักขระดั้งเดิมที่เชื่อมโยงกับอาร์เรย์"

"ฉันไม่เข้าใจอะไรเลย"

"เมื่อสตริงย่อยถูกสร้างขึ้น อาร์เรย์อักขระจะไม่ถูกคัดลอกไปยังอ็อบเจกต์สตริงใหม่ แต่อ็อบเจกต์ทั้งสองจะเก็บการอ้างอิงไปยังอาร์เรย์อักขระดั้งเดิม แต่! ออบเจกต์ที่สองยังเก็บตัวแปรสองตัว: ดัชนีเริ่มต้นในอาร์เรย์และ จำนวนอักขระที่เป็นของสตริงย่อย"

"ลองดู:"

รับสตริงย่อย สิ่งที่เก็บไว้ภายในสตริงย่อย
String s = "mama";
มีอะไรเก็บไว้ใน s:

char[] value = {'m','a','m','a'};
offset = 0;
count = 4;
String s2 = s.substring(1);
สิ่งที่เก็บไว้ใน s2:

char[] value = {'m','a','m','a'};
offset = 1;
count = 3;
String s3 = s.substring(1, 3);
สิ่งที่เก็บไว้ใน s3:

char[] value = {'m','a','m','a'};
offset = 1;
count = 2;

"สตริงทั้งสามจัดเก็บการอ้างอิงไปยังอาร์เรย์อักขระเดียวกัน แต่ยังจัดเก็บดัชนีของอักขระตัวแรกและตัวสุดท้ายที่เกี่ยวข้อง หรือให้แม่นยำยิ่งขึ้น ดัชนีของอักขระตัวแรกและจำนวนอักขระ"

"นั่นสมเหตุสมผลแล้ว"

"ดังนั้น ถ้าคุณใช้สตริงที่มีความยาว 10,000 อักขระ และสร้างสตริงย่อย 10,000 สตริงที่มีความยาวเท่าใดก็ได้ สตริงย่อยเหล่านี้จะใช้หน่วยความจำน้อยมาก เนื่องจากอาร์เรย์อักขระจะไม่ซ้ำกัน สตริงเหล่านี้ซึ่งคุณคาดว่าจะใช้มาก ของพื้นที่ จะใช้เพียงไม่กี่ไบต์เท่านั้น"

"เย็น!"

"แต่คุณทำอย่างนั้นได้ไหม ถ้าคุณสามารถแก้ไขสตริงได้"

"ไม่ ใครบางคนสามารถเปลี่ยนสตริงแรกได้ จากนั้นสตริงย่อยทั้งหมดก็จะเปลี่ยนไปด้วย ตอนนี้มันสมเหตุสมผลแล้วว่าทำไมพวกเขาถึงทำเช่นนั้น นั่นเป็นวิธีแก้ปัญหาที่ยอดเยี่ยมจริงๆ"

"ฉันดีใจที่คุณชอบมัน."