سلام! قبلاً در آموزش شما، ما با اشیاء منفرد (و انواع اولیه) کار کرده ایم. اما اگر ما نیاز به کار با یک گروه کامل از اشیا به جای تنها یک مورد داشته باشیم، چه؟ به عنوان مثال، فرض کنید می خواهیم لیستی از تاریخ تولد همه کارکنان شرکت خود ایجاد کنیم. باید شامل 30 رشته باشد که به صورت زیر فرمت شده اند: "سارا هافمن، 25 ژانویه" ما از یک ساختار داده خاص به نام آرایه بهره مند خواهیم شد . اگر یک آرایه را با یک شی واقعی مقایسه کنیم، بسیار شبیه یک صندوق بانکی با صندوق امانات است:
یک آرایه نیز از "جعبه" تشکیل شده است. شما می توانید چیزی (یک عنصر) را در هر جعبه قرار دهید. برای دسترسی به یک عنصر، باید شماره کادر آن (شاخص) را بدانید. به این ترتیب یک آرایه ایجاد می شود:
یعنی اگر می خواهید مقداری در کادر اول قرار دهید ، این کار را انجام دهید:
درک این نکته مهم است که یک آرایه فقط اشیاء را ذخیره نمی کند، بلکه خود یک شی است. این ما را به این سوال سوق می دهد که آیا می توانیم نه تنها آرایه ای از رشته ها یا اعداد، بلکه آرایه هایی از آرایه ها را نیز ایجاد کنیم . و پاسخ این است که بله، ما می توانیم! یک آرایه می تواند هر شی، از جمله آرایه های دیگر را ذخیره کند. چنین آرایه ای دو بعدی نامیده می شود . اگر بخواهیم آن را به صورت بصری نشان دهیم، بسیار شبیه به یک جدول معمولی خواهد بود. فرض کنید، میخواهیم یک آرایه از 3 آرایه ایجاد کنیم که هر یک میتوانند 10
هر خط نشان دهنده یک
در "Battleship"، ساختار زمین بازی را می توان به راحتی توصیف کرد: یک آرایه دو بعدی از 10 آرایه با هر کدام 10 عنصر. شما دو تا از این آرایه ها را ایجاد می کنید (یکی برای شما و دیگری برای حریفتان)

public class Main {
public static void main(String[] args) {
String [] birthdays = new String[10];
}
}
در اینجا یک آرایه ایجاد می کنیم که 10 عنصر را در خود جای می دهد. بلافاصله می توانید برخی از ویژگی های آرایه را یادداشت کنید:
- این عناصر از یک نوع داده به خوبی تعریف شده را ذخیره می کند . اگر یک آرایه String ایجاد کنیم، نمی توانیم چیز دیگری را در آن ذخیره کنیم. نوع داده هنگام ایجاد آرایه مشخص می شود . اینجاست که با صندوق امانات (که مشتری می تواند آنچه را که می خواهد در آن ذخیره کند) متفاوت است.
- اندازه آن باید هنگام ایجاد آرایه مشخص شود . بعد از ایجاد آرایه نمی توانید آن را نشان دهید یا اندازه آن را تغییر دهید .
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] = "Jana Russell, March 12";
}
}
اکنون تولد جانا در اولین سلول آرایه تولدهای کارمند ما ذخیره می شود: می توانید مقادیر دیگری را به روشی مشابه اضافه کنید:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
birthdays[1] = "Landon Chan, May 18";
birthdays[7] = "Rosie Mills, January 3";
}
}
توجه داشته باشید که ما تولد روزی را به کادر هشتم اضافه کردیم (فراموش نکرده اید که چرا جعبه شماره 7 هشتمین جعبه است، نه؟) . می بینید که ما تمام سلول های دیگر را پر نکرده ایم. لازم نیست مقادیر را به ترتیب در یک آرایه بنویسیم. چنین الزامی وجود ندارد البته، نوشتن عناصر به ترتیب، پیگیری تعداد جعبههای آزاد و اشغال شده را بسیار آسانتر میکند و از داشتن "سوراخ" در آرایه جلوگیری میکند. اگر می خواهید محتویات یکی از جعبه ها را دریافت کنید، (درست مانند یک صندوق امانات) باید شماره آن را بدانید. به این صورت انجام می شود:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
birthdays[1] = "Landon Chan, May 18";
birthdays[7] = "Rosie Mills, January 3";
String rosieBirthday = birthdays[7];
System.out.println(rosieBirthday);
}
}
خروجی کنسول: Rosie Mills، 3 ژانویه یک متغیر ایجاد کردیم String
و به کامپایلر گفتیم: "جعبه ای را با نمایه 7 در آرایه تولد پیدا کنید و مقدار موجود در آنجا را به String
متغیر rosieBirthday اختصاص دهید ". و این دقیقاً همان کاری است که انجام داد. هنگام کار با آرایه ها، به راحتی می توانیم طول آنها را با استفاده از یک ویژگی خاص پیدا کنیم: length .
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
birthdays[1] = "Landon Chan, May 18";
birthdays[7] = "Rosie Mills, January 3";
int birthdaysLength = birthdays.length;
System.out.println(birthdaysLength);
}
}
خروجی کنسول: 10 نکته: length
ویژگی اندازه آرایه را ذخیره می کند، نه تعداد کادرهایی که پر هستند. آرایه ما فقط 3 مقدار را ذخیره می کند، اما اندازه آن را هنگام ایجاد آن 10 نشان دادیم. و این دقیقاً همان مقداری است که length
فیلد برمی گرداند. چرا این به کار می آید؟ خب، فرض کنید میخواهید فهرستی از تمام تولدها را نمایش دهید (برای اینکه مطمئن شوید کسی فراموش نشده است). می توانید این کار را در یک حلقه ساده انجام دهید:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
birthdays[1] = "Landon Chan, May 18";
birthdays[2] = "Jeremiah Leonard, July 12";
birthdays [3] = "Kenny Russo, September 7";
birthdays[4] = "Tommie Barnes, November 9";
birthdays [5] = "Roman Baranov, August 14";
birthdays [6] = "Chanice Andersen, April 1";
birthdays[7] = "Rosie Mills, January 3";
birthdays [8] = "Keenan West, October 19";
birthdays [9] = "Abraham McArthur, May 3";
for (int i = 0; i < birthdays.length; i++) {
System.out.println(birthdays[i]);
}
}
}
در حلقه، متغیر را اعلام می کنیم i
که مقدار اولیه آن صفر است. در هر پاس، عنصر با شاخص i را از آرایه خود دریافت می کنیم و مقدار آن را نمایش می دهیم. حلقه 10 تکرار انجام می دهد و من از 0 به 9 افزایش می یابد - و اتفاقاً اعداد شاخص های عناصر آرایه ما هستند! در نتیجه، ما همه مقادیر از تولد[0] تا تولدها را نشان خواهیم داد[9] در واقع، راه دیگری برای ایجاد یک آرایه وجود دارد. به عنوان مثال، شما می توانید یک آرایه از int
s مانند این ایجاد کنید:
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
}
}
این تکنیک "Initialization" میانبر نامیده می شود. این کاملا راحت است، زیرا ما به طور همزمان یک آرایه ایجاد می کنیم و آن را با مقادیر پر می کنیم. ما مجبور نیستیم به صراحت اندازه آرایه را مشخص کنیم: با مقداردهی اولیه میانبر، فیلد 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 حال، کمی در مورد نحوه ذخیره آرایه ها در حافظه. فرض کنید آرایه ای از سه شی داریم 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("Behemoth");
cats[2] = new Cat("Lionel Messi");
}
}
در اینجا باید چند نکته را درک کنید:
-
در مورد اولیه، یک آرایه مجموعه ای از مقادیر خاص (مثلا
int
s) را ذخیره می کند. در مورد اشیا، یک آرایه مجموعه ای از مراجع را ذخیره می کند .
آرایهcats
از سه عنصر تشکیل شده است که هر کدام از آنها اشاره ای به یکCat
شی است. هر یک از مراجع به آدرس حافظه ای که شی مربوطه در آن ذخیره می شود اشاره می کند. - عناصر آرایه در یک بلوک در حافظه مرتب شده اند. این کار برای دسترسی سریع و کارآمد به آنها انجام می شود.
cats
به بلوک حافظه اشاره می کند که در آن همه اشیاء (عناصر آرایه) در آن ذخیره می شوند. Cats[0]
به یک آدرس خاص در این بلوک اشاره می کند. 
int
ثانیه را ذخیره کنند. به این صورت خواهد بود:

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("Fluffy");
}
[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[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
از برخی مقادیر (به عنوان مثال اعداد یا نمادها) برای پر کردن عناصر مربوط به مکان کشتی خود استفاده کنید، و سپس به نوبت مختصات عناصر خاص را فراخوانی کنید:
- BattleshipBoard1[0][2]!
- از دست دادن! BattleshipBoard2[2][4]!
- اصابت!
- BattleshipBoard2[2][5]!
- اصابت!
- BattleshipBoard2[2][6]!،
- غرق شده!
GO TO FULL VERSION