در جاوا، آرایهها اشیاء (Objects) محسوب میشوند. این موضوع باعث تفاوت آنها با آرایهها در زبانهایی مانند C یا ++C در نحوه مدیریت حافظه میشود.
برای آرایههای شامل نوع دادههای اولیه (Primitive types)، عناصر آرایه در حافظه بهصورت پیوسته (Contiguous) ذخیره میشوند.
اما برای آرایههای شامل نوع دادههای غیر اولیه (مانند اشیاء)، مراجع (References) به اشیاء در حافظه بهصورت پیوسته ذخیره میشوند، ولی خود اشیاء ممکن است در مکانهای مختلفی از حافظه قرار داشته باشند.
ویژگیهای کلیدی آرایهها در جاوا:
اختصاص حافظه پیوسته (برای انواع اولیه): عناصر آرایههای اولیه بهصورت پشتسرهم در حافظه ذخیره میشوند.اندیسگذاری از صفر: اندیس اولین عنصر آرایه 0 است.
طول ثابت: پس از ایجاد آرایه، اندازه آن قابل تغییر نیست.
قابلیت ذخیرهسازی انواع اولیه و اشیاء: آرایهها میتوانند دادههایی از نوعهای اولیه (مانند int، char، boolean و ...) یا اشیاء (مانند String، Integer و ...) را در خود نگه دارند.
مثال: مقداردهی اولیه و پیمایش آرایه در جاوا
کد زیر نحوه تعریف، مقداردهی اولیه و پیمایش آرایه با استفاده از حلقه for را نشان میدهد:public static void main(String[] args)
{
// initializing array
int[] arr = { 1, 2, 3, 4, 5 };
// size of array
int n = arr.length;
// traversing array
for (int i = 0; i < n; i++)
System.out.print(arr[i] + " ");
}
}
خروجی:
اصول اولیه کار با آرایهها در جاوا
در ادامه با چند عملیات ابتدایی روی آرایهها آشنا میشویم:1. اعلان (Declaration) آرایه
برای اعلان یک آرایه در جاوا از قالب زیر استفاده میشود:arrayName: نام آرایه
نکته: با این دستور فقط آرایه را تعریف میکنیم و هنوز به آن حافظهای تخصیص داده نشده است (مقداردهی اولیه صورت نگرفته است).
۲. ایجاد یک آرایه
برای ایجاد (ساخت) یک آرایه، باید با استفاده از کلمه کلیدی new حافظهای برای آن اختصاص دهید:int[] numbers = new int[5];
۳. دسترسی به عناصر آرایه
برای دسترسی به عناصر آرایه از اندیس آنها استفاده میکنیم. اندیسها از ۰ شروع میشوند:numbers[0] = 10;
// Accessing the first element
int firstElement = numbers[0];
۴. تغییر مقدار یک عنصر
برای تغییر مقدار یک عنصر در آرایه، کافیست مقدار جدیدی به اندیس موردنظر اختصاص دهید:numbers[0] = 20;
۵. بهدست آوردن طول آرایه
برای بهدست آوردن تعداد عناصر آرایه، از ویژگی length استفاده میکنیم:int length = numbers.length;
مفاهیم عمیقتر در مورد آرایهها در جاوا
در ادامه، نکات پیشرفتهتری دربارهی آرایهها در جاوا بیان میشود:ویژگیهای آرایهها در جاوا:
در جاوا، تمام آرایهها بهصورت پویا تخصیص داده میشوند.آرایهها ممکن است در حافظهی پیوسته (مکانهای حافظهی متوالی) ذخیره شوند.
از آنجا که آرایهها در جاوا شیء هستند، میتوان طول آنها را با استفاده از ویژگی شیء length به دست آورد. این با زبانهای C/C++ متفاوت است که در آنها طول آرایه با استفاده از sizeof محاسبه میشود.
متغیر آرایه در جاوا میتواند مانند سایر متغیرها با علامت [] پس از نوع داده تعریف شود.
متغیرهای موجود در آرایه مرتب هستند و هرکدام دارای یک اندیس هستند که از ۰ شروع میشود.
آرایه در جاوا میتواند بهصورت یک فیلد ایستا (static field)، یک متغیر محلی (local variable)، یا یک پارامتر متد (method parameter) استفاده شود.
آرایه میتواند شامل نوعهای دادهی اولیه (مانند int، char و غیره) یا ارجاعهایی به اشیاء (یا نوعهای غیر اولیه) یک کلاس باشد، بسته به نحوهی تعریف آرایه. در مورد نوعهای دادهی اولیه، مقادیر واقعی ممکن است در مکانهای حافظهی پیوسته ذخیره شوند (البته ماشین مجازی جاوا این رفتار را تضمین نمیکند). در مورد اشیاء کلاسی، اشیاء واقعی در بخش heap حافظه ذخیره میشوند.

نکته: این نحوهی ذخیرهسازی آرایهها، امکان دسترسی تصادفی (Random Access) به عناصر را فراهم میکند، یعنی میتوانیم مستقیماً به هر عنصر با استفاده از اندیس آن دسترسی داشته باشیم.
ایجاد، مقداردهی اولیه و دسترسی به آرایهها در جاوا
برای درک بهتر آرایهها، ابتدا باید نحوهی عملکرد آنها را بفهمیم. برای این منظور، مراحل زیر را دنبال کنید:1. اعلام (Declare)
2. مقداردهی اولیه (Initialize)
3. دسترسی (Access)
۱. اعلام یک آرایه
ساختار کلی برای اعلام یک آرایه به صورت زیر است:
type var-name[];
Method 2:
type[] var-name;
نکته: این فقط نحوهی ایجاد یک متغیر آرایه است، و در این مرحله هنوز هیچ آرایهای وجود ندارد. این فقط به کامپایلر اعلام میکند که این متغیر (مثلاً intArray) قرار است یک آرایه از نوع int نگهداری کند.
اکنون باید به این آرایهی ایجادشده، حافظه اختصاص دهیم.
۲. مقداردهی اولیه به آرایه در جاوا
زمانی که یک آرایه اعلام میشود، تنها یک ارجاع (Reference) به آرایه ایجاد میشود. ساختار کلی استفاده از new برای آرایههای یکبعدی به صورت زیر است:
type نوع دادهای را مشخص میکند که باید تخصیص داده شود.
size تعداد عناصر آرایه را تعیین میکند.
var-name نام متغیر آرایه است که به آرایه پیوند داده میشود.
برای استفاده از new جهت تخصیص حافظه به آرایه، باید نوع و تعداد عناصر مورد نظر را مشخص کنید.
مثال:
int intArray[];
// allocating memory to array
intArray = new int[20];
// combining both statements in one
int[] intArray = new int[20];
برای انواع عددی: صفر
برای نوع boolean: مقدار false
برای نوعهای ارجاعی (مانند اشیاء): مقدار null
دستیابی به یک آرایه در جاوا، شامل دو مرحله است:
۱. ابتدا باید یک متغیر از نوع آرایهی مورد نظر اعلام کنید.
۲. سپس با استفاده از new حافظهای به آن اختصاص داده و آن را به متغیر آرایهای نسبت دهید.
بنابراین، در جاوا، تمام آرایهها بهصورت پویا (dynamically) تخصیص داده میشوند.
آرایهی Literal در جاوا
زمانیکه هم اندازه آرایه و هم مقادیر اولیه آن را میدانیم، میتوانیم از Array Literal استفاده کنیم:int[] intArray = new int[]{ 1,2,3,4,5,6,7,8,9,10 };
۳. دسترسی به عناصر آرایه با استفاده از حلقه for
پس از ایجاد یک آرایه، برای پردازش مقادیر داخل آن، نیاز به دسترسی به عناصر داریم. نکات زیر اهمیت دارد:
دسترسی به هر عنصر از طریق اندیس آن انجام میشود؛
اندیس از ۰ شروع شده و تا طول آرایه - ۱ ادامه دارد؛
میتوان از حلقه for برای پیمایش کل آرایه استفاده کرد.
مثال:
// of integers, puts some values in the array,
// and prints each value to standard output.
class GFG {
public static void main(String[] args)
{
// declares an Array of integers.
int[] arr;
// allocating memory for 5 integers.
arr = new int[5];
// initialize the elements of the array
// first to last(fifth) element
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
// accessing the elements of the specified array
for (int i = 0; i < arr.length; i++)
System.out.println("Element at index "
+ i + " : " + arr[i]);
}
}
خروجی:
Element at index 1 : 20
Element at index 2 : 30
Element at index 3 : 40
Element at index 4 : 50
انواع آرایهها در جاوا
جاوا از انواع مختلف آرایه پشتیبانی میکند:۱. آرایههای یکبعدی (Single-Dimensional Arrays)
رایجترین نوع آرایه، آرایههای یکبعدی هستند که عناصر بهصورت خطی ذخیره میشوند:int[] singleDimArray = {1, 2, 3, 4, 5};

۲. آرایههای چندبعدی (Multi-Dimensional Arrays)
آرایههایی با بیش از یک بُعد، مانند آرایههای دوبعدی (ماتریسها):int[][] multiDimArray = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9} };
آرایهای از اشیاء در جاوا (Arrays of Objects in Java)
آرایهای از اشیاء مانند آرایهای از دادههای نوع اولیه (primitive) تعریف میشود.نحوه نوشتار:
ObjectType[] arrName;
Method 2:
ObjectType arrName[];
در این مثال، یک کلاس با نام Student تعریف میشود و یک آرایه شامل ۵ شی از این کلاس ساخته میشود. این اشیاء با استفاده از سازنده کلاس Student نمونهسازی میشوند و مراجع آنها به عناصر آرایه اختصاص داده میشود.
// an array of objects
class Student {
public int roll_no;
public String name;
Student(int roll_no, String name){
this.roll_no = roll_no;
this.name = name;
}
}
public class Main {
public static void main(String[] args){
// declares an Array of Student
Student[] arr;
// allocating memory for 5 objects of type Student.
arr = new Student[5];
// initialize the elements of the array
arr[0] = new Student(1, "aman");
arr[1] = new Student(2, "vaibhav");
arr[2] = new Student(3, "shikar");
arr[3] = new Student(4, "dharmesh");
arr[4] = new Student(5, "mohit");
// accessing the elements of the specified array
for (int i = 0; i < arr.length; i++)
System.out.println("Element at " + i + " : { "
+ arr[i].roll_no + " "
+ arr[i].name+" }");
}
}
خروجی:
Element at 1 : { 2 vaibhav }
Element at 2 : { 3 shikar }
Element at 3 : { 4 dharmesh }
Element at 4 : { 5 mohit }
مثال:
// an array of objects
class Student{
public String name;
Student(String name){
this.name = name;
}
@Override
public String toString(){
return name;
}
}
public class Main{
public static void main (String[] args){
// declares an Array and initializing the
// elements of the array
Student[] myStudents = new Student[]{
new Student("Dharma"),new Student("sanvi"),
new Student("Rupa"),new Student("Ajay")
};
// accessing the elements of the specified array
for(Student m:myStudents){
System.out.println(m);
}
}
}
خروجی:
sanvi
Rupa
Ajay
اگر بخواهیم به عنصری خارج از اندازه آرایه دسترسی پیدا کنیم چه اتفاقی میافتد؟
ماشین مجازی جاوا (JVM) استثنای ArrayIndexOutOfBoundsException را پرتاب میکند که نشان میدهد سعی شده به اندیسی خارج از محدوده قانونی آرایه دسترسی پیدا شود. این اندیس میتواند منفی یا بزرگتر مساوی طول آرایه باشد.
مثال کد:
public class GFG {
public static void main(String[] args)
{
int[] arr = new int[4];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
System.out.println(
"Trying to access element outside the size of array");
System.out.println(arr[5]);
}
}
خروجی:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4
at GFG.main(GFG.java:13)
آرایههای چندبعدی در جاوا (Multidimensional Arrays in Java)
آرایههای چندبعدی، آرایههایی از آرایهها هستند که هر عنصر آن، مرجعی به یک آرایه دیگر نگه میدارد. برای ایجاد آرایه چندبعدی، برای هر بُعد باید یک جفت براکت [] اضافه شود.نحوه نگارش (Syntax):
دو روش برای تعریف آرایه چندبعدی در جاوا وجود دارد:
datatype [][] arrayrefvariable;
// Method 2
datatype arrayrefvariable[][];

مثالهایی از آرایههای چندبعدی
// Multidimensional Array
import java.io.*;
class GFG {
public static void main(String[] args){
// Two Dimensional Array
// Declared and Initialized
int[][] arr = new int[3][3];
// Number of Rows
System.out.println("Rows : " + arr.length);
// Number of Columns
System.out.println("Columns : " + arr[0].length);
}
}
خروجی:
Columns:3
مثال دوم: پیمایش آرایه دوبعدی با استفاده از حلقه for
// Driver Class
public class multiDimensional {
// main function
public static void main(String args[])
{
// declaring and initializing 2D array
int arr[][] = { { 2, 7, 9 }, { 3, 6, 1 }, { 7, 4, 2 } };
// printing 2D array
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
}
}
}
خروجی:
3 6 1
7 4 2
ارسال آرایه به متدها (Passing Arrays to Methods)
مانند متغیرها، میتوان آرایهها را نیز به متدها ارسال کرد. در مثال زیر، آرایه به متدی با نام sum ارسال میشود تا مجموع عناصر آن محاسبه شود.// passing of array to method
public class Test {
// Driver method
public static void main(String args[])
{
int arr[] = { 3, 1, 2, 5, 4 };
// passing array to method m1
sum(arr);
}
public static void sum(int[] arr)
{
// getting sum of array values
int sum = 0;
for (int i = 0; i < arr.length; i++)
sum += arr[i];
System.out.println("sum of array values : " + sum);
}
}
خروجی:
بازگرداندن آرایه از متد (Returning Arrays from Methods)
همانطور که متد میتواند مقدار بازگرداند، میتواند یک آرایه نیز برگرداند. در مثال زیر، متد m1 یک آرایه را باز میگرداند.
// return of array from method
class Test {
// Driver method
public static void main(String args[])
{
int arr[] = m1();
for (int i = 0; i < arr.length; i++)
System.out.print(arr[i] + " ");
}
public static int[] m1()
{
// returning array
return new int[] { 1, 2, 3 };
}
}
خروجی:
اعضای آرایه در جاوا (Java Array Members)
از آنجا که آرایهها در جاوا شیء (Object) محسوب میشوند، ابرکلاس مستقیم آنها کلاس Object است.
اعضای آرایه شامل موارد زیر است:
فیلد length:
یک فیلد public final است که تعداد عناصر آرایه را مشخص میکند.
مقدار آن میتواند صفر یا مثبت باشد.
تمامی متدهای کلاس Object (به جز clone() اصلی) از آن به ارث میرسند.
متد clone() در آرایهها، نسخهی بازنویسیشده از کلاس Object است و استثنای بررسیشدهای پرتاب نمیکند.
نوع آرایه و نوع عناصر مجاز (Array Types and Allowed Element Types)
نوع آرایه نوع عناصر مجاز
آرایه نوع اولیه هر نوع دادهای که بتوان آن را بهطور ضمنی به نوع اعلامشده ارتقاء داد.
آرایه نوع شیء اشیاء نوع اعلامشده یا زیرکلاسهای آن.
آرایه کلاس انتزاعی اشیاء کلاسهای مشتقشده از آن کلاس.
آرایه رابط (Interface) اشیاء کلاسهایی که آن رابط را پیادهسازی کردهاند.
کپیبرداری از آرایهها در جاوا (Cloning Arrays)
۱. کپیبرداری از آرایه یکبعدی
هنگامیکه از آرایهای مانند Object[] کپی گرفته میشود، کپی سطحی (Shallow Copy) انجام میشود. به این معنا که آرایه جدید به عناصر همان آرایه اصلی اشاره میکند، نه اینکه از آنها کپی کند.در آرایههایی با نوع دادههای اولیه (مثل int[])، کپی عمیق (Deep Copy) انجام میشود، چون مقادیر عددی کپی میشوند.
// cloning of one-dimensional arrays
class Test {
public static void main(String args[])
{
int intArray[] = { 1, 2, 3 };
int cloneArray[] = intArray.clone();
// will print false as shallow copy is created
System.out.println(intArray == cloneArray);
for (int i = 0; i < cloneArray.length; i++) {
System.out.print(cloneArray[i] + " ");
}
}
}
خروجی:
1 2 3
۲. کپیبرداری از آرایه چندبعدی
در آرایههای چندبعدی (مثل int[][]) نیز کپی سطحی صورت میگیرد. یعنی تنها آرایه بیرونی کپی میشود و زیرآرایهها همچنان به همان آرایه اصلی اشاره دارند.پیادهسازی:
// cloning of multi-dimensional arrays
class Test {
public static void main(String args[])
{
int intArray[][] = { { 1, 2, 3 }, { 4, 5 } };
int cloneArray[][] = intArray.clone();
// will print false
System.out.println(intArray == cloneArray);
// will print true as shallow copy is created
// i.e. sub-arrays are shared
System.out.println(intArray[0] == cloneArray[0]);
System.out.println(intArray[1] == cloneArray[1]);
}
}
خروجی:
true
true
عملیات رایج روی آرایهها (Common Operations)
عملیات مثالمرتبسازی Arrays.sort(arr);
جستجو Arrays.binarySearch(arr, key);
کپی کردن int[] copy = Arrays.copyOf(arr, len);
مقداردهی Arrays.fill(arr, 0);
مزایای استفاده از آرایه در جاوا
دسترسی سریع: دسترسی به عنصر از طریق ایندکس در زمان ثابت O(1) انجام میشود.مدیریت حافظه ساده: اندازه ثابت باعث میشود حافظه بهتر مدیریت شود.
سازماندهی دادهها: آرایهها امکان سازماندهی دادههای مشابه را فراهم میکنند.
معایب آرایهها در جاوا
اندازه ثابت: پس از تعریف، اندازه آرایه تغییر نمیکند.نوع یکنواخت (Homogeneity): تنها یک نوع داده در آرایه قابل ذخیره است.
هزینه درج/حذف: افزودن یا حذف عناصر (مخصوصاً وسط آرایه) نیاز به جابهجایی عناصر دارد.
اشتباهات رایج در استفاده از آرایهها
دسترسی به اندیس خارج از محدوده: منجر به ArrayIndexOutOfBoundsException میشود. همیشه مطمئن شوید که اندیس بین 0 تا array.length - 1 است.فرض تغییرپذیری اندازه آرایه: اندازه آرایه پس از تعریف قابل تغییر نیست.
عدم مقداردهی اولیه عناصر:
برای انواع عددی (int, double): مقدار پیشفرض 0
برای boolean: مقدار پیشفرض false
برای اشیاء: مقدار پیشفرض null
بهترین شیوهها (Best Practices)
استفاده از حلقه For-Each: خطر خطای اندیس را کاهش میدهد.
بررسی طول آرایه قبل از دسترسی: از array.length استفاده کنید.
استفاده از Arrays.copyOf() بهجای حلقه دستی.
استفاده از ArrayList زمانی که نیاز به آرایه پویا باشد.
📝 تمرینها
تمرین ۱: ساخت و چاپ آرایه دوبعدی
یک آرایه دوبعدی int[3][3] تعریف کن و با استفاده از حلقه مقداردهی و چاپ کن.
تمرین ۲: محاسبه مجموع عناصر آرایه
با استفاده از متد، مجموع اعداد در یک آرایه دوبعدی int[][] را محاسبه کن.
تمرین ۳: پیدا کردن بیشترین مقدار
برنامهای بنویس که بزرگترین عدد موجود در یک آرایه دوبعدی را پیدا کند.
تمرین ۴: کپی آرایه
یک آرایه int[] بساز، از آن با استفاده از clone() کپی بگیر و بررسی کن که آیا کپی آن برابر با آرایه اصلی است یا نه.
تمرین ۵: استفاده از Arrays.copyOf
یک آرایه بساز و نیمی از آن را با استفاده از Arrays.copyOf در آرایه جدیدی ذخیره کن.
تمرین ۶ (چالش): ماتریس متقارن
برنامهای بنویس که بررسی کند آیا یک ماتریس مربعی دوبعدی متقارن است یا نه (یعنی arr[i][j] == arr[j][i]).
ورود و ثبت نام برای ارسال نظر وارد شوید