1. Stringอาร์เรย์

ฉันต้องการให้ภาพรวมคร่าวๆ เกี่ยวกับStringอาร์เรย์

อย่างที่เราได้กล่าวไปก่อนหน้านี้ อาร์เรย์สามารถเป็นประเภทใดก็ได้ ซึ่งหมายความว่าคุณสามารถสร้างอาร์เรย์ของStrings หากเราต้องการเขียนโปรแกรมที่ "อ่าน 10 บรรทัดจากแป้นพิมพ์และแสดงผลตามลำดับย้อนกลับ" โค้ดจะมีลักษณะดังนี้:

Scanner console = new Scanner(System.in);
String[] array = new String[10];
for (int i = 0; i < 10; i++)
{
   array[i] = console.nextLine();
}
for (int i = 9; i >= 0; i--)
{
   System.out.println(array[i]);
}
สร้างScannerวัตถุ
สร้างวัตถุอาร์เรย์ 10 องค์ประกอบ
วนซ้ำจาก 0 ถึง 9

อ่านสตริงจากแป้นพิมพ์และบันทึกลงในเซลล์ถัดไปของอาร์เรย์
วนซ้ำจาก 9 ถึง 0

แสดงเซลล์ถัดไปในอาร์เรย์

รหัสแทบไม่เปลี่ยน! เราต้องแทนที่intด้วยStringเมื่อสร้างอาร์เรย์ เท่านั้น และเมื่ออ่านสตริงจากแป้นพิมพ์ เราก็แทนที่เมธอดnextInt()ด้วยnextLine().


2. Stringอาร์เรย์ในหน่วยความจำ

และอีกหนึ่งข้อเท็จจริงที่เป็นประโยชน์ ลองพิจารณา 3 ภาพ:

ภาพที่ 1วิธีการStringจัดเรียงวัตถุในหน่วยความจำ:

อาร์เรย์สตริงในหน่วยความจำ

ภาพนี้ถ่ายจากบทเรียนที่แล้ว

โปรดทราบว่าข้อความของสตริงไม่ได้ถูกจัดเก็บโดยตรงในตัวแปร: มีการจัดสรรบล็อกหน่วยความจำแยกต่างหากสำหรับข้อความนั้น ตัวแปรStringเก็บที่อยู่ (อ้างอิง) ไปยังวัตถุที่เก็บข้อความ

ภาพที่ 2วิธีการจัดเรียงอาร์เรย์จำนวนเต็มในหน่วยความจำ:

อาร์เรย์สตริงในหน่วยความจำ2

รูปนี้ก็คุ้นๆ

ภาพที่ 3วิธีการจัดเรียงอาร์เรย์สตริงในหน่วยความจำ:

วิธีจัดเรียงอาร์เรย์สตริงในหน่วยความจำ

ทางด้านซ้ายเราจะเห็นตัวแปรอาร์เรย์ที่มีประเภทString[](เก็บที่อยู่ของวัตถุอาร์เรย์)

ตรงกลางเรามีStringวัตถุอาร์เรย์เอง

และทางด้านขวาคือวัตถุสตริงที่เก็บข้อความบางส่วน

เซลล์ของStringอาร์เรย์ไม่ได้เก็บสตริงไว้เอง (ข้อความของออบเจกต์สตริง) แต่จะเก็บที่อยู่ (อ้างอิงถึงพวกเขา) แทน ในลักษณะเดียวกับที่Stringตัวแปรจัดเก็บที่อยู่ของวัตถุสตริง (ที่เก็บข้อความ)

พิจารณาสิ่งนี้เมื่อคุณเปรียบเทียบเซลล์อาร์เรย์:

String[] array = new String[10];

array[1] = "Hello";
array[2] = array[1];
array[3] = new String("Hello");
// Compare
array[1] == array[2];
array[1] == array[3];
array[1].equals(array[3]);
array[1].equalsIgnoreCase(array[3]);
สร้างอาร์เรย์ 10 สตริง

ใส่ค่าลงในอาร์เรย์



true (การอ้างอิงเท่ากัน)
false (การอ้างอิงไม่เท่ากัน)
true (สตริงเท่ากัน)
true(สตริงยังคงเท่ากัน)


3. การเริ่มต้นอาร์เรย์อย่างรวดเร็วใน Java

อาร์เรย์มีประโยชน์มาก ดังนั้นผู้สร้าง Java จึงพยายามทำให้การทำงานกับอาร์เรย์สะดวกที่สุด

สิ่งแรกที่พวกเขาทำคือการทำให้การกำหนดค่าเริ่มต้นของอาร์เรย์ง่ายขึ้น ซึ่งเป็นกระบวนการที่คุณระบุค่าเริ่มต้นของอาร์เรย์

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

int[] months = new int[12];
months[0] = 31; // January
months[1] = 28; // February
months[2] = 31; // March
months[3] = 30; // April
months[4] = 31; // May
months[5] = 30; // June
months[6] = 31; // July
months[7] = 31; // August
months[8] = 30; // September
months[9] = 31; // October
months[10] = 30; // November
months[11] = 31; // December

แต่ต้องขอบคุณผู้สร้าง Java มีวิธีเขียนให้กระชับกว่านี้:

// Lengths of months of the year
int[] months = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

คุณสามารถระบุค่าทั้งหมดของอาร์เรย์โดยคั่นด้วยเครื่องหมายจุลภาค!

สะดวกใช่ไหม? แต่นั่นไม่ใช่ทั้งหมด

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

นั่นหมายความว่าโค้ดนี้สามารถเขียนให้สั้นลงได้อีก:

// Lengths of months of the year
int[] months = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

เรื่องของความงามใช่ไหม? 🙂

สิ่งนี้เรียกว่า "การเริ่มต้นอาร์เรย์อย่างรวดเร็ว" โดยวิธีการนี้ใช้ได้กับประเภทอื่นที่ไม่ใช่int...

// Names of months of the year
String[] months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November ", "December"};