تعریف آرایه در جاوا
آرایه در جاوا گروهی از متغیرهای هم نوع هستند که با یک نام مشترک به آنها اشاره می شود. آرایه ها در جاوا متفاوت از C/C++ کار می کنند. در ادامه چند نکته مهم در مورد آرایه های جاوا آورده شده است.
- در جاوا، همه آرایه ها به صورت پویا تخصیص داده می شوند.
- آرایه ها در حافظه پیوسته [مکان حافظه متوالی] ذخیره می شوند.
- از آنجایی که آرایه ها در جاوا اشیا هستند، می توانیم طول آنها را با استفاده از ویژگی شی length پیدا کنیم. این با C/C++ متفاوت است، جایی که طول را با استفاده از sizeof مییابیم.
- یک متغیر آرایه جاوا نیز می تواند مانند سایر متغیرها با [] بعد از نوع داده اعلام شود.
- متغیرهای آرایه مرتب شده اند و هر کدام دارای شاخصی (Index) هستند که با 0 شروع می شود.
- آرایه جاوا همچنین می تواند به عنوان یک فیلد ثابت، یک متغیر محلی یا یک پارامتر متد استفاده شود.
- اندازه یک آرایه باید با مقدار int یا short مشخص شود.
- سوپرکلاس مستقیم یک نوع آرایه Object است.
- هر نوع آرایه رابط های Cloneable و java.io.Serializable را پیاده سازی می کند.
- این ذخیره سازی آرایه ها به ما کمک می کند تا به طور تصادفی به عناصر یک آرایه دسترسی داشته باشیم [Support Random Access].
- اندازه آرایه را نمی توان تغییر داد (پس از شروع اولیه). با این حال، یک ارجاع آرایه می تواند برای اشاره به آرایه دیگری ایجاد شود.
یک آرایه بسته به تعریف آرایه می تواند حاوی نوع اولیه (int، char و غیره) و شی (یا non-primitive) یک کلاس باشد. در مورد انواع داده های اولیه، مقادیر واقعی در مکان های حافظه پیوسته ذخیره می شوند. در مورد اشیاء کلاس، اشیاء واقعی در بخش پشته(Stack) ذخیره می شوند.
ایجاد، مقداردهی اولیه و دسترسی به یک آرایه در جاوا
آرایه های تک بعدی در جاوا
شکل کلی یک اعلان آرایه یک بعدی به صورت زیر است.
type var-name[];
OR
type[] var-name;
اعلان آرایه دو جزء دارد: type و name. type نوع عنصر آرایه را اعلام می کند. نوع عنصر نوع داده هر عنصری که آرایه را تشکیل می دهد را تعیین می کند. مانند آرایهای از اعداد صحیح، میتوانیم آرایهای از انواع دادههای ابتدایی دیگر مانند char، float، double و غیره یا انواع دادههای تعریفشده توسط کاربر (اشیاء یک کلاس) ایجاد کنیم. بنابراین، نوع عنصر برای آرایه تعیین می کند که آرایه چه نوع داده ای را نگه می دارد.
مثال:
// both are valid declarations
int intArray[];
or int[] intArray;
byte byteArray[];
short shortsArray[];
boolean booleanArray[];
long longArray[];
float floatArray[];
double doubleArray[];
char charArray[];
// an array of references to objects of
// the class MyClass (a class created by
// user)
MyClass myClassArray[];
Object[] ao, // array of Object
Collection[] ca; // array of Collection
// of unknown type
اگرچه اولین اعلان ثابت می کند که intArray یک متغیر آرایه است، هیچ آرایه واقعی وجود ندارد. فقط به کامپایلر می گوید که این متغیر (intArray) آرایه ای از نوع عدد صحیح را نگه می دارد. برای پیوند int آرایه با یک آرایه فیزیکی واقعی از اعداد صحیح، باید یکی از آنها را با استفاده از new به آرایه int اختصاص دهید.
نمونه سازی یک آرایه در جاوا : هنگامی که یک آرایه اعلام می شود، تنها مرجع یک آرایه ایجاد می شود. برای ایجاد یا دادن حافظه به آرایه، یک آرایه به این صورت ایجاد می کنید: شکل کلی new همانطور که برای آرایه های یک بعدی اعمال می شود به صورت زیر ظاهر می شود:
var-name = new type [size];
در اینجا type نوع داده های تخصیص داده شده را مشخص می کند، اندازه تعداد عناصر آرایه را تعیین می کند و var-name نام متغیر آرایه ای است که به آرایه پیوند داده شده است. برای استفاده از new برای تخصیص یک آرایه، باید نوع و تعداد عناصر را برای تخصیص مشخص کنید.
مثال:
int intArray[]; //declaring array
intArray = new int[20]; // allocating memory to array
یا به صورت زیر:
int[] intArray = new int[20]; // combining both statements in one
نکته: عناصر موجود در آرایه اختصاص داده شده توسط new به طور خودکار به صفر (برای انواع عددی)، false (برای بولی)، یا تهی (برای انواع رشته ای) مقدار دهی اولیه می شوند.
نکته: به دست آوردن آرایه یک فرآیند دو مرحله ای است. ابتدا باید متغیری از نوع آرایه مورد نظر را اعلام کنید. دوم، باید حافظه را برای نگهداری آرایه با استفاده از new اختصاص دهید و آن را به متغیر آرایه اختصاص دهید. بنابراین، در جاوا، همه آرایه ها به صورت پویا تخصیص داده می شوند.
Array Literal : در شرایطی که اندازه آرایه و متغیرهای آرایه از قبل مشخص است، می توان از Array Literal استفاده کرد.
int[] intArray = new int[]{ 1,2,3,4,5,6,7,8,9,10 };
// Declaring array literal
- طول این آرایه تعیین کننده طول آرایه ایجاد شده است.
- نیازی به نوشتن new int[] در آخرین نسخه های جاوا نیست.
دسترسی به عناصر آرایه جاوا با استفاده از حلقهfor : هر عنصر در آرایه از طریق شاخص(Index) خود قابل دسترسی است. این شاخص با 0 شروع می شود و به (اندازه کل آرایه) - 1 ختم می شود. با استفاده از حلقه for جاوا می توان به تمام عناصر آرایه دسترسی داشت.
// accessing the elements of the specified array
for (int i = 0; i < arr.length; i++)
System.out.println("Element at index " + i +
" : "+ arr[i]);
پیاده سازی:
// Java program to illustrate creating an array
// 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 first elements of the array
arr[0] = 10;
// initialize the second elements of the array
arr[1] = 20;
// so on...
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 0 : 10
Element at index 1 : 20
Element at index 2 : 30
Element at index 3 : 40
Element at index 4 : 50
همچنین می توانید با استفاده از هر حلقه for each به آرایه های جاوا دسترسی داشته باشید.
آرایه های objects : آرایه ای از اشیاء مانند آرایه ای از اقلام داده از نوع اولیه به روش زیر ایجاد می شود.
Student[] arr = new Student[5]; //student is a user-defined class
سینتکس:
data type[] arrName;
datatype arrName[];
datatype [] arrName;
مثال:
import java.io.*;
class GFG {
public static void main (String[] args) {
int [] arr=new int [4];
// 4 is the size of arr
}
}
مثال:
// Java program to illustrate creating
// 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;
}
}
// Elements of the array are objects of a class Student.
public class GFG {
public static void main(String[] args)
{
// declares an Array of integers.
Student[] arr;
// allocating memory for 5 objects of type Student.
arr = new Student[5];
// initialize the first elements of the array
arr[0] = new Student(1, "aman");
// initialize the second elements of the array
arr[1] = new Student(2, "vaibhav");
// so on...
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 0 : 1 aman
Element at 1 : 2 vaibhav
Element at 2 : 3 shikar
Element at 3 : 4 dharmesh
Element at 4 : 5 mohit
آرایه Student شامل پنج فضای حافظه هر کدام به اندازه کلاس Student است که آدرس پنج شی Student را می توان در آن ذخیره کرد. اشیاء Student باید با استفاده از سازنده کلاس Student نمونه سازی شوند و ارجاعات آنها باید به صورت بالا به عناصر آرایه اختصاص داده شود.
مثال: آرایه ای از objectها نیز مانند زیر است
// Java program to illustrate creating
// an array of objects
class Student
{
public String name;
Student(String name)
{
this.name = name;
}
@Override
public String toString(){
return name;
}
}
// Elements of the array are objects of a class Student.
public class GFG
{
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);
}
}
}
خروجی:
Dharma
sanvi
Rupa
Ajay
اگر بخواهیم به عناصر خارج از اندازه آرایه دسترسی پیدا کنیم چه اتفاقی می افتد؟
JVM، ArrayIndexOutOfBoundsException را پرتاب می کند تا نشان دهد که آرایه با یک نمایه غیرقانونی دسترسی پیدا کرده است. این شاخص یا منفی است یا بزرگتر یا مساوی اندازه یک آرایه است.
کد زیر نشان می دهد که اگر بخواهیم به عناصر خارج از اندازه آرایه دسترسی پیدا کنیم چه اتفاقی می افتد.
// Code for showing error "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]);
}
}
خروجی:
Trying to access element outside the size of array
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4
at GFG.main(GFG.java:13)
مثال:
public class GFG {
public static void main(String[] args)
{
int[] arr = new int[2];
arr[0] = 10;
arr[1] = 20;
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
}
خروجی:
10
20
آرایه های چند بعدی در جاوا
آرایه های چند بعدی آرایه هایی از آرایه ها هستند که هر عنصر آرایه مرجع آرایه های دیگر را نگه می دارد. به این آرایههای ناهموار نیز میگویند. یک آرایه چند بعدی با اضافه کردن یک مجموعه از براکت های مربع ([]) در هر بعد ایجاد می شود.
سینتکس:
datatype [][] arrayrefvariable;
datatype arrayrefvariable[][];
import java.io.*;
class GFG {
public static void main (String[] args) {
// Syntax
int [][] arr= new int[3][3];
// 3 row and 3 column
}
}
int[][] intArray = new int[10][20]; //a 2D array or matrix
int[][][] intArray = new int[10][20][10]; //a 3D array
مثال:
public class multiDimensional {
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();
}
}
}
خروجی:
2 7 9
3 6 1
7 4 2
پاس دادن آرایه ها به متدها : مانند متغیرها، می توانیم آرایه ها را نیز به متدها منتقل کنیم. برای مثال، برنامه زیر برای محاسبه مجموع مقادیر آرایه، آرایه را به متد sum ارسال می کند.
// Java program to demonstrate
// 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);
}
}
خروجی:
sum of array values : 15
برگرداندن آرایه ها از متد ها : طبق معمول، یک متد همچنین می تواند یک آرایه را برگرداند. به عنوان مثال، برنامه زیر یک آرایه از روش m1 برمی گرداند.
// Java program to demonstrate
// 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 };
}
}
خروجی:
1 2 3
Class Objects برای آرایه ها : هر آرایه دارای یک شی Class مرتبط است که با همه آرایه های دیگر با همان نوع جزء مشترک است.
مثال:
// Java program to demonstrate
// Class Objects for Arrays
class Test {
public static void main(String args[])
{
int intArray[] = new int[3];
byte byteArray[] = new byte[3];
short shortsArray[] = new short[3];
// array of Strings
String[] strArray = new String[3];
System.out.println(intArray.getClass());
System.out.println(
intArray.getClass().getSuperclass());
System.out.println(byteArray.getClass());
System.out.println(shortsArray.getClass());
System.out.println(strArray.getClass());
}
}
خروجی:
class [I
class java.lang.Object
class [B
class [S
class [Ljava.lang.String;
توضیحات:
- رشته «[I» امضای نوع زمان اجرا برای شی کلاس «آرایه با نوع مؤلفه int» است.
- تنها سوپرکلاس مستقیم از نوع آرایه java.lang.Object است.
- رشته "[B" امضای نوع زمان اجرا برای شی کلاس "آرایه با نوع مولفه byte" است.
- رشته "[S" امضای نوع زمان اجرا برای شی کلاس "آرایه با نوع مولفه short" است.
- رشته "[L" امضای نوع زمان اجرا برای شی کلاس "آرایه با نوع مولفه یک class" است. سپس به دنبال آن نام کلاس میآید.
اعضای آرایه : حال همانطور که می دانید آرایه ها اشیاء یک کلاس هستند و سوپرکلاس مستقیم آرایه ها یک کلاس Object هستند. اعضای یک نوع آرایه همه موارد زیر هستند:
- طول فیلد نهایی عمومی شامل تعداد اجزای آرایه است. طول ممکن است مثبت یا صفر باشد.
- همه اعضا از کلاس Object به ارث برده می شوند. تنها روش Object که به ارث نمی رسد، روش کلون آن است.
- متد عمومی () clone متد clone را در کلاس Object لغو می کند و هیچ استثنای بررسی شده ای ایجاد نمی کند.
انواع آرایه ها و انواع عناصر مجاز آنها در جاوا
انواع آرایه | انواع عنصر مجاز |
---|---|
Primitive Type Arrays | هر نوع که می تواند به طور ضمنی به نوع اعلام شده ارتقا یابد. |
Object Type Arrays | یا اشیاء نوع اعلام شده یا اشیاء کلاس فرزند. |
Abstract Class Type Arrays | اشیاء کلاس فرزند آن مجاز است. |
Interface Type Arrays | اشیاء کلاس پیاده سازی آن مجاز هستند. |
شبیه سازی آرایه ها : هنگامی که یک آرایه تک بعدی، مانند Object[] را شبیه سازی می کنید، یک " deep copy" با آرایه جدید که حاوی کپی هایی از عناصر آرایه اصلی به جای ارجاع است، انجام می شود.
مثال:
// Java program to demonstrate
// 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 deep copy is created
// for one-dimensional array
System.out.println(intArray == cloneArray);
for (int i = 0; i < cloneArray.length; i++) {
System.out.print(cloneArray[i] + " ");
}
}
}
خروجی:
false
1 2 3
یک کلون از یک آرایه چند بعدی (مانند Object[][]) یک "shallow copy" است، با این حال، به این معنی است که تنها یک آرایه جدید را با هر آرایه عنصری ارجاع به یک آرایه عنصر اصلی ایجاد می کند، اما زیرآرایه ها به اشتراک گذاشته می شوند.
مثال:
// Java program to demonstrate
// 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]);
}
}
خروجی:
false
true
true