สวัสดี! ก่อนหน้านี้ ในระหว่างการฝึก เราทำงานกับวัตถุชิ้นเดียว (หรือประเภทดั้งเดิม) แต่จะเกิดอะไรขึ้นถ้าเราจำเป็นต้องทำงานไม่ใช่กับวัตถุชิ้นเดียว แต่กับทั้งกลุ่มล่ะ? ตัวอย่างเช่น เราต้องการสร้างรายการวันเกิดของพนักงานทุกคนในบริษัทของเรา ควรมี 30 บรรทัดในรูปแบบ: “Andrey Petrov, 25 มกราคม” โครงสร้างข้อมูลพิเศษ อาร์เรย์ จะช่วยเราได้ หากคุณเปรียบเทียบอาร์เรย์กับวัตถุในชีวิตจริง โครงสร้างจะคล้ายกับห้องนิรภัยของธนาคารที่มีเซลล์มาก:
อาร์เรย์ยังประกอบด้วยเซลล์ด้วย คุณสามารถใส่บางอย่างลงในแต่ละเซลล์ได้ ในกรณีนี้ ในการเข้าถึงเนื้อหา คุณต้องทราบหมายเลขเซลล์ อาร์เรย์ถูกสร้างขึ้นดังนี้:
นั่นคือถ้าคุณต้องการใส่ค่าลงในเซลล์แรกของอาร์เรย์จะทำดังนี้:
สิ่งสำคัญคือต้องเข้าใจว่าอาร์เรย์ไม่เพียงแต่สามารถจัดเก็บวัตถุได้เท่านั้น แต่ยังเป็นวัตถุอีกด้วย
แต่ละบรรทัดแสดงถึงอาร์เรย์ของ
โครงสร้างของสนามเด็กเล่นใน Battleship นั้นสามารถอธิบายได้ง่าย: อาร์เรย์สองมิติ 10 อาร์เรย์ 10 เซลล์แต่ละเซลล์ . คุณสร้างอาร์เรย์ดังกล่าวสองชุด - สำหรับตัวคุณเองและคู่ต่อสู้:
public class Main {
public static void main(String[] args) {
String [] birthdays = new String[10]; // array of Java strings
}
}
ที่นี่เราได้สร้างอาร์เรย์จำนวน 10 เซลล์ คุณสามารถใส่ใจกับคุณสมบัติบางอย่างของอาเรย์ได้ทันที:
- มันเก็บข้อมูลประเภทที่กำหนดไว้อย่างเคร่งครัด หากเราสร้างอาร์เรย์สตริงขึ้นมาตั้งแต่แรก
String
เราจะไม่สามารถเก็บสิ่งอื่นใดไว้ในนั้นได้ ชนิดข้อมูลถูกระบุเมื่อสร้างอาร์เรย์ นี่คือสิ่งที่แตกต่างจากตู้เซฟซึ่งลูกค้าสามารถเก็บทุกสิ่งที่เขาต้องการได้ - อาร์เรย์สามารถจัดเก็บข้อมูลประเภทดั้งเดิม (เช่น
int
) สตริง (String
) หรืออ็อบเจ็กต์ของคลาสเดียวกัน แม่นยำยิ่งขึ้นไม่ใช่แม้แต่วัตถุเอง แต่เชื่อมโยงไปยังวัตถุเหล่านี้ - ต้องระบุขนาดของอาร์เรย์ในระหว่างการสร้าง คุณจะไม่สามารถระบุในภายหลังหรือปรับขนาดได้หลังจากสร้างแล้ว
[]
ทั้งสองด้านของนิพจน์ สามารถระบุได้ก่อนชื่อของตัวแปรอ้างอิงหรือหลัง - มันจะทำงานด้วยวิธีใดวิธีหนึ่ง:
//Java arrays of strings, two syntaxes
String [] birthdays = new String[10];
String birthdays [] = new String[10];
หากคุณต้องการเขียนบางสิ่งลงในอาร์เรย์ คุณต้องระบุจำนวนเซลล์ที่จะเขียนค่านั้น จำนวนเซลล์อาร์เรย์เริ่มต้นที่ 0 การเริ่มจากศูนย์เป็นแนวทางปฏิบัติทั่วไปในการเขียนโปรแกรม ยิ่งคุณคุ้นเคยเร็วเท่าไหร่ก็ยิ่งดีเท่านั้น :) 
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
}
}
ตอนนี้เซลล์แรกของอาร์เรย์ของเราซึ่งประกอบด้วยวันเกิดของเพื่อนร่วมงาน มีสตริงที่มีวันเกิดของ Lena โดยการเปรียบเทียบ คุณสามารถเพิ่มค่าอื่นๆ ได้:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
}
}
โปรดทราบ: เราได้เพิ่มวันเกิดของ Olesya ลงในเซลล์ที่แปด (คุณลืมหรือเปล่าว่าทำไมเซลล์หมายเลข 7 จึงเป็นเซลล์ที่แปด) แม้ว่าเซลล์อื่นๆ ทั้งหมดจะไม่ได้ถูกกรอกลงไปก็ตาม ไม่จำเป็นต้องเขียนค่าลงในอาร์เรย์ตามลำดับ - ไม่มีข้อจำกัดดังกล่าว ในทางกลับกัน หากคุณเขียนตามลำดับ จะง่ายกว่ามากในการติดตามจำนวนเซลล์ว่างและเซลล์ที่ถูกครอบครอง และจะไม่มี "รู" เหลืออยู่ในอาร์เรย์ หากคุณต้องการรับเนื้อหาของเซลล์อาร์เรย์ เช่น ในกรณีของเซลล์ธนาคาร คุณจำเป็นต้องทราบหมายเลขของเซลล์นั้น ทำเช่นนี้:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
String olesyaBirthday = birthdays[7];
System.out.println(olesyaBirthday);
}
}
เอาต์พุตคอนโซล:
Олеся Остапенко, 3 января
เราสร้างตัวแปรString
และบอกคอมไพเลอร์ว่า: “ค้นหาเซลล์ที่มีดัชนี 7 ในอาร์เรย์birthdays
และกำหนดค่าที่เก็บไว้ให้กับตัวแปรString
olesyaBirthday
” นั่นคือสิ่งที่เขาทำ
ความยาวอาร์เรย์ Java
เมื่อทำงานกับอาร์เรย์ คุณสามารถค้นหาความยาวของอาร์เรย์ได้อย่างง่ายดายโดยใช้คุณสมบัติพิเศษlength
-
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[7] = "Olesya Ostapenko, January 3";
int birthdaysLength = birthdays.length;
System.out.println(birthdaysLength);
}
}
เอาต์พุตคอนโซล:
10
บันทึก:คุณสมบัติlength
จะจัดเก็บขนาดของอาร์เรย์ ไม่ใช่จำนวนเซลล์ที่เติม อาร์เรย์ของเราเก็บค่าไว้เพียง 3 ค่า แต่เมื่อเราสร้างมันขึ้นมา เราได้ระบุ size = 10 ไว้ นี่คือค่าที่ฟิลด์ส่งlength
คืน เหตุใดสิ่งนี้จึงอาจมีประโยชน์ ตัวอย่างเช่น หากคุณต้องการพิมพ์รายการวันเกิดทั้งหมดไปยังคอนโซล (เพื่อตรวจสอบว่าไม่มีใครถูกลืม) คุณสามารถทำได้ในวงเดียวง่ายๆ:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Lena Eliseeva, March 12";
birthdays[1] = "Kolya Romanov, May 18";
birthdays[2] = "Vika Ignatova, July 12";
birthdays[3] = "Denis Kozlov, September 7";
birthdays[4] = "Maxim Maslennikov, November 9";
birthdays[5] = "Roman Baranov, August 14";
birthdays[6] = "Valery Pyatkina, April 1";
birthdays[7] = "Olesya Ostapenko, January 3";
birthdays[8] = "Kostya Gurko, October 19";
birthdays[9] = "Seryozha Naumov, May 3";
for (int i = 0; i < birthdays.length; i++) {
System.out.println(birthdays[i]);
}
}
}
ในลูปเราสร้างตัวแปรi
ที่เริ่มแรกเท่ากับศูนย์ ในแต่ละรอบ เราจะนำเซลล์ที่มีดัชนี i จากอาร์เรย์ของเราและพิมพ์ค่าของมันไปยังคอนโซล การวนซ้ำจะวนซ้ำ 10 ครั้งและค่า i จะเพิ่มขึ้นจาก 0 เป็น 9 - เพียงตามดัชนีของเซลล์ในอาร์เรย์ของเรา! วิธีนี้เราจะพิมพ์ค่าทั้งหมดจากbirthdays[0]
ไป ยัง คอนโซล birthdays[9]
. จริงๆ แล้วมีวิธีสร้างอาร์เรย์ที่แตกต่างกันออกไป ตัวอย่างเช่น คุณสามารถสร้างอาร์เรย์ของตัวเลขint
ได้ดังนี้:
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
}
}
วิธีการนี้เรียกว่า "การเริ่มต้นอย่างรวดเร็ว" มันค่อนข้างสะดวกที่เราสร้างอาร์เรย์ทันทีและเติมค่าลงไป ไม่จำเป็นต้องระบุขนาดของอาร์เรย์อย่างชัดเจน - ฟิลด์length
จะถูกกรอกโดยอัตโนมัติระหว่างการเริ่มต้นอย่างรวดเร็ว
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
System.out.println(numbers.length);
}
}
เอาต์พุตคอนโซล:
9
อาร์เรย์วัตถุ Java
คุณคงเคยได้ยินมาว่าอาร์เรย์ของอ็อบเจ็กต์และอาร์เรย์ของวัตถุดั้งเดิมถูกจัดเก็บไว้ในหน่วยความจำแตกต่างกัน ยกตัวอย่างอาร์เรย์ของวัตถุสามรายการCat
:
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat[] cats = new Cat[3];
cats[0] = new Cat("Thomas");
cats[1] = new Cat("Hippopotamus");
cats[2] = new Cat("Philip Markovich");
}
}
มีบางสิ่งที่ต้องทำความเข้าใจที่นี่:
- ในกรณีของพื้นฐาน อาร์เรย์ Java จะเก็บค่าเฉพาะจำนวนมาก (เช่น ตัวเลข
int
) ในกรณีของอ็อบเจ็กต์ อาร์เรย์จะเก็บข้อมูลอ้างอิงจำนวนมาก อาร์เรย์cats
ประกอบด้วยสามเซลล์ ซึ่งแต่ละเซลล์มีการอ้างอิงไปยังCat
วัตถุ แต่ละลิงก์จะชี้ไปยังที่อยู่ในหน่วยความจำที่จัดเก็บออบเจ็กต์นั้นไว้ - องค์ประกอบอาร์เรย์จะถูกเก็บไว้ในหน่วยความจำในบล็อกเดียว สิ่งนี้ทำเพื่อการเข้าถึงที่มีประสิทธิภาพและรวดเร็วยิ่งขึ้น ดังนั้นลิงก์
cats
จะชี้ไปที่บล็อกในหน่วยความจำซึ่งวัตถุทั้งหมดซึ่งเป็นองค์ประกอบของอาเรย์จะถูกเก็บไว้ เอcats[0]
- ไปยังที่อยู่เฉพาะภายในบล็อกนี้

อาร์เรย์ของอาร์เรย์หรืออาร์เรย์สองมิติ
จากนี้ เรากำลังเผชิญกับคำถาม - เราสามารถสร้างตัวอย่างไม่ใช่อาร์เรย์ของสตริงหรือตัวเลข แต่เป็นอาร์เรย์ของอาร์เรย์ได้หรือไม่ และคำตอบก็คือ - ใช่ เราทำได้! อาร์เรย์สามารถจัดเก็บวัตถุใดๆ ภายในนั้น รวมถึงอาร์เรย์อื่นๆ ด้วย อาร์เรย์ดังกล่าวจะเรียกว่าสองมิติ หากวาดภาพจะดูคล้ายกับโต๊ะทั่วไปมาก ตัวอย่างเช่น เราต้องการสร้างอาร์เรย์ที่จะเก็บตัวเลข 3 อาร์เรย์int
โดยแต่ละอาร์เรย์มี 10 เซลล์ ซึ่งจะมีลักษณะดังนี้: 
int
ตัวเลข อาร์เรย์แรกประกอบด้วยตัวเลขตั้งแต่ 1 ถึง 10 อาร์เรย์ที่สอง - ตั้งแต่ -1 ถึง -10 อาร์เรย์ที่สาม - ชุดตัวเลขสุ่ม แต่ละอาร์เรย์เหล่านี้จะถูกจัดเก็บไว้ในเซลล์ของอาร์เรย์สองมิติของเรา การเริ่มต้นอาร์เรย์สองมิติในโค้ดมีลักษณะดังนี้:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
}
อาร์เรย์แมวสองมิติของเราจัดเก็บ 3 อาร์เรย์ เซลล์ละ 5 เซลล์ หากเราต้องการวางอ็อบเจ็กต์ของเราไว้ในเซลล์ที่สามของอาร์เรย์ที่สอง เราจะทำดังนี้:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
cats[1][2] = new Cat("Fluff");
}
[1]
ชี้ไปที่อาร์เรย์ที่สอง และ[2]
ชี้ไปที่เซลล์ที่สามของอาร์เรย์นี้ เนื่องจากอาร์เรย์สองมิติประกอบด้วยหลายอาร์เรย์ เพื่อที่จะสำรวจและพิมพ์ค่าทั้งหมดไปยังคอนโซล (หรือเติมเซลล์ทั้งหมด) เราจึงจำเป็นต้องมีการวนซ้ำแบบซ้อนซ้อน:
for (int i = 0; i < cats.length; i++) {
for (int j = 0; j < cats[i].length; j++) {
System.out.println(cats[i][j]);
}
}
ในวงรอบนอก (ตัวแปรi
) เราจะผลัดกันสำรวจอาร์เรย์ทั้งหมดที่ประกอบเป็นอาร์เรย์สองมิติของเรา ในวงใน (ตัวแปรj
) เราวนซ้ำเซลล์ทั้งหมดของแต่ละอาร์เรย์ ด้วยเหตุนี้ วัตถุcats[0][0]
(อาร์เรย์แรก เซลล์แรก) จะถูกแสดงเป็นอันดับแรกบนคอนโซล และวัตถุที่สองจะเป็นcats[0][1]
(อาร์เรย์แรก เซลล์ที่สอง) เมื่ออาร์เรย์แรกหมด , , cats[1][0]
และcats[1][1]
อื่นcats[1][2]
ๆ จะถูกส่งออก อย่างไรก็ตาม การเริ่มต้นอย่างรวดเร็วยังมีให้สำหรับอาร์เรย์สองมิติด้วย:
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
โดยปกติเราจะเขียนอาร์เรย์สองมิติnumbers
เป็นint[3][3]
แต่วิธีนี้ช่วยให้เราสามารถระบุค่าได้ทันที เหตุใดจึงต้องมีอาร์เรย์สองมิติ ตัวอย่างเช่นด้วยความช่วยเหลือคุณสามารถสร้างเกม Battleship ที่มีชื่อเสียงขึ้นมาใหม่ได้อย่างง่ายดาย: 
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
คุณกรอกค่าบางอย่าง (เช่น ตัวเลขหรือเครื่องหมาย*
) เซลล์ที่เรือของคุณตั้งอยู่ จากนั้นคุณและคู่ต่อสู้จะผลัดกันเรียกหมายเลขเซลล์:
- ซีแบทเทิล[6][5]!
- อดีต! ซีแบทเทิล2[6][6]!
- ได้รับบาดเจ็บ!
- ซีแบทเทิล2[6][7]!
- ได้รับบาดเจ็บ!
- ทะเลแบทเทิล2[6][8]!,
- ฆ่าแล้ว!
แหล่งข้อมูลเพิ่มเติมเกี่ยวกับอาร์เรย์
ต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับอาร์เรย์หรือไม่ โปรดดูบทความด้านล่างนี้ มีข้อมูลที่น่าสนใจและมีประโยชน์มากมายในหัวข้อนี้- อาร์เรย์ใน Java - บทความโดยละเอียดเกี่ยวกับอาร์เรย์ การสร้าง การเริ่มต้น และการใช้งาน พร้อมตัวอย่าง
- คลาส Arrays และการใช้งาน - บทความนี้จะอธิบายวิธีการบางอย่างของคลาส
Array
- Arrays เป็นการบรรยาย JavaRush ครั้งแรกที่เน้นเรื่องอาร์เรย์โดยเฉพาะ
- อาร์เรย์หลายมิติ - บทความโดยละเอียดเกี่ยวกับอาร์เรย์หลายมิติพร้อมตัวอย่าง
- ส่งคืนอาร์เรย์ที่มีความยาวเป็นศูนย์ ไม่ใช่ null - ผู้เขียนการเขียนโปรแกรมที่มีประสิทธิภาพ Joshua Bloch พูดถึงวิธีส่งคืนอาร์เรย์ว่างได้ดีขึ้น
GO TO FULL VERSION