- آموزش
من فکر می کنم که تعداد کمی از کسانی که برای اولین مصاحبه خود آماده می شوند، هنگام درخواست برای اولین شغل خود به عنوان یک برنامه نویس (پیش) جوان، به این سوال پاسخ منفی می دهند. یا حداقل در پاسخ مثبت شک کنید. البته، چنین ساختار داده ساده با دسترسی مستقیم به فهرست - بدون ترفند! خیر، در برخی از زبانها مانند جاوا اسکریپت یا PHP، آرایهها البته به روشی بسیار جالب پیادهسازی میشوند و اساساً بسیار بیشتر از یک آرایه هستند. اما این چیزی نیست که ما در مورد آن صحبت می کنیم، بلکه در مورد اجرای "سنتی" آرایه ها در قالب یک "منطقه جامد حافظه" است. در این حالت بر اساس شاخص ها و اندازه یک عنصر، آدرس به سادگی محاسبه شده و به مقدار مربوطه دسترسی پیدا می شود. چه چیزی در آن سخت است؟
بیایید آن را بفهمیم. مثلا در جاوا. درخواست از یک متقاضی ناآگاه برای ایجاد آرایه ای از اعداد صحیح nایکس n. شخص با اطمینان چیزی مانند این را می نویسد:
int g = int[n][n] جدید؛
عالی. اکنون از شما می خواهیم که عناصر آرایه را با چیزی مقداردهی اولیه کنید. حداقل در واحدها، حداقل به صورت مجموع شاخص ها. ما گرفتیم:
برای (int i = 0; i< n; i++) {
for(int j = 0; j < n; j++) {
g[i][j] = i + j;
}
}
حتی بیشتر می نویسند
برای (int i = 0; i< g.length; i++) {
for(int j = 0; j < g[i].length; j++) {
g[i][j] = i + j;
}
}
که این هم دلیلی برای گفت و گو است، اما اکنون ما در مورد چیز دیگری صحبت می کنیم. ما سعی می کنیم بفهمیم که یک فرد چه می داند و ببینیم چگونه فکر می کند. بنابراین، توجه او را به این واقعیت جلب می کنیم که مقادیر به صورت متقارن قرار گرفته اند و از او می خواهیم در تکرارهای حلقه صرفه جویی کند. البته، چرا در حالی که فقط می توانید از مثلث پایین عبور کنید، از تمام مقادیر شاخص عبور کنید؟ سوژه معمولاً به راحتی موافقت می کند و عاقلانه مورب اصلی را برجسته می کند، با دقت چیزی مانند:
برای (int i = 0; i< n; i++) {
g[i][i] = 2* i;
for(int j = 0; j < i; j++) {
g[j][i] = g[i][j] = i + j;
}
}
به جای g[i][i] = 2* i; اغلب نوشته می شود g[i][i] = i + i; یا g[i][i] = i<< 1;
и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: برنامه چقدر سریعتر اجرا می شود؟. استدلال معمول به شرح زیر است: تقریباً 2 برابر محاسبات شاخص کمتر. تقریباً 2 برابر کمتر محاسبات مقادیر (جمع بندی)؛ همان تعداد تکالیف این به معنای 30 درصد سریعتر است.اگر فردی پیشینه ریاضی خوبی داشته باشد، حتی می توانید تعداد دقیق عملیات ذخیره شده و ارزیابی منطقی تری از اثربخشی بهینه سازی را مشاهده کنید.
اکنون زمان ضربه اصلی است. ما هر دو نسخه کد را روی مقداری به اندازه کافی بزرگ اجرا می کنیم n(حدود چند هزار) مثلاً به این صورت.
کد کنترل شده با زمان
کلاس A ( public static void main (string args) (int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0; من< n; i++) {
for(int j = 0; j < n; j++) {
g[i][j] = i + j;
}
}
en = System.nanoTime();
System.out.println("\nOne time " + (en - st)/1000000.d + " msc");
// two
st = System.nanoTime();
for(int i = 0; i < n; i++) {
g[i][i] = i + i;
for(int j = 0; j < i; j++) {
g[j][i] = g[i][j] = i + j;
}
}
en = System.nanoTime();
System.out.println("\nTwo time " + (en - st)/1000000.d + " msc");
}
}
ما چه می بینیم؟ نسخه بهینه شده 10-100 برابر کندتر کار می کند! اکنون زمان مشاهده واکنش نامزد نسبت به این سمت است. واکنش به یک موقعیت استرس زا غیرمعمول (به طور دقیق تر، معمول در تمرین توسعه دهنده) چه خواهد بود. اگر چهره متهم هیجان زده است و او شروع به فشار دادن دکمه ها می کند و به طور موقت وجود شما را فراموش می کند، این نشانه خوبی است. تا حدودی. شما نمی خواهید محققی را استخدام کنید که به نتیجه پروژه اهمیتی نمی دهد، درست است؟ سپس از او سوال "چرا؟" را نپرسید. از آنها بخواهید گزینه دوم را دوباره کار کنند تا در واقع سریعتر از اولی کار کند.
اکنون می توانید مدتی با خیال راحت به تجارت خود بپردازید. در نیم ساعت شما مطالب کافی برای ارزیابی ویژگی های اولیه شخصی و حرفه ای متقاضی خواهید داشت.
به هر حال، زمانی که من به طور خلاصه این مشکل را در وب سایت کاری خود توضیح دادم، محبوب ترین نظر این بود "این منحنی جاوا شماست." من کد را در عالی و رایگان مخصوصاً برای آنها ارسال می کنم. و صاحبان خوشحال Free Pascal برای ویندوز می توانند نگاهی بیندازند
زیر اسپویلر
زمان برنامه؛ استفاده از ویندوز؛ var start, finish, res: int64; n, i, j: عدد صحیح; g: آرایه آرایه عدد صحیح. شروع n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(شروع)؛ برای i:=1 تا n-1 برای j:=1 تا n-1 انجام دهید g := i + j; QueryPerformanceCounter(پایان)؛ writeln("زمان بر اساس ردیف:"، (پایان - شروع) / res، "sec"); QueryPerformanceCounter(شروع)؛ برای i:=1 تا n-1 برای j:=1 تا n-1 انجام دهید g := i + j; QueryPerformanceCounter(پایان)؛ writeln("زمان بر اساس cols:"، (پایان - شروع) / res، "sec"); پایان.
در کد بالا در پاسکال، جنبه های "گیج کننده" را حذف کردم و فقط اصل مشکل را رها کردم. در صورتی که می توان این را یک مشکل نامید.
در نهایت چه سوالاتی از متهم می پرسیم؟
1. چرا کندتر کار می کند؟ و با جزئیات بیشتر ...
2. چگونه می توان مقداردهی اولیه را سریعتر کرد؟
اگر نیاز به کاوش بیشتر در پیاده سازی جاوا وجود دارد، از متقاضی می خواهیم که زمان اجرا را برای مقادیر کوچک رعایت کند. n. به عنوان مثال، در ideone.com برای n=117، گزینه "بهینه سازی شده" نصف کند است. اما برای مقدار بعدی n=118 معلوم می شود که در حال حاضر 100 (صد) برابر سریعتر از مقدار غیر بهینه شده است! پیشنهاد آزمایش روی یک ماشین محلی. بگذارید با تنظیمات بازی کند.
در ضمن، آیا همه می فهمند که چه خبر است؟
چند کلمه توجیهی
من می خواهم چند کلمه برای توجیه این روش استخدام مصاحبه بگویم. بله، من دانش نحو زبان و دانش ساختار داده را آزمایش نمی کنم. شاید، در یک بازار کار متمدن، همه اینها کارساز باشد. اما در شرایط کمبود کامل پرسنل واجد شرایط، ما باید کفایت طولانی مدت متقاضی را برای کاری که با آن مواجه خواهد شد، ارزیابی کنیم. آن ها توانایی یادگیری، شکستن، درک کردن، انجام دادن.
این از نظر روحی شبیه به "مصاحبه" برای استخدام لژیونرها در روم باستان است. جنگجوی آینده به شدت ترسیده بود و نگاه می کرد که آیا سرخ شده یا رنگ پریده شده است. اگر رنگ پریده شود، در شرایط استرس زا، خون از سر متقاضی خارج می شود و او مستعد واکنش منفعل است. مثلاً غش کردن. اگر متقاضی سرخ می شد، خون به سرش می ریخت. آن ها او مستعد اقدامات فعال و عجله در دعوا است. این یکی مناسب در نظر گرفته شد.
خوب، یک چیز آخر. چرا من به جای استفاده از آن در مصاحبه ها به همه درباره این کار گفتم؟ فقط این است که متقاضیان بالقوه قبلاً این کار را "یاد گرفته اند" و باید از دیگران استفاده کنند.
در واقع، من دقیقاً در ارتباط با وظیفه واقعی پردازش تصویر به این اثر توجه کردم. وضعیت تا حدودی گیج کننده بود و من بلافاصله متوجه نشدم که چرا فریم بر ثانیه من پس از ریفکتورینگ تا این حد کاهش یافت. به طور کلی، همه احتمالاً چنین لحظات فوق العاده زیادی دارند.
تا کنون نسخه پیشرو این است که حافظه نهان پردازنده مقصر است. آن ها دسترسی متوالی در گزینه اول در یک هش کار می کند، که هنگام حرکت فراتر از یک مرز مشخص به روز می شود. هنگام دسترسی از طریق ستون ها، هش مجبور است به طور مداوم به روز شود و این زمان زیادی می برد. بیایید این نسخه را در خالص ترین شکل آن بررسی کنیم. بیایید یک آرایه بسازیم و سریعتر را با هم مقایسه کنیم - پردازش همه عناصر در یک ردیف یا پردازش عناصر آرایه با یک عدد تصادفی به همان تعداد بار؟ این برنامه ideone.com/tMaR2S است. برای 100000 عنصر آرایه، دسترسی تصادفی معمولاً سریعتر است. این یعنی چی؟
در اینجا کاملاً به درستی به من (Big_Lebowski) اشاره شد که تنظیم مجدد حلقه ها نتایج را به نفع گزینه ترتیبی تغییر می دهد. برای خلوص آزمایش، مجبور شدم چرخه گرم کردن را تنظیم کنم. در همان زمان، من چندین بار تکرار کردم تا میانگین زمان کار را همانطور که لونتوف توصیه کرد به دست بیاورم. اینجوری شد ideone.com/yN1H4g. آن ها دسترسی تصادفی به عناصر یک آرایه بزرگ 10% کندتر از دسترسی متوالی است. شاید کش واقعاً نقشی داشته باشد. با این حال، در وضعیت اولیه، عملکرد به طور قابل توجهی کاهش یافت. بنابراین چیز دیگری وجود دارد.
به تدریج، نسخه مربوط به اقدامات اضافی هنگام انتقال از یک ردیف آرایه به ردیف دیگر در حال تبدیل شدن به رهبر است. و درست است. باقی مانده است که بفهمیم دقیقاً در آنجا چه اتفاقی می افتد.
برچسب ها:
- برنامه نويسي
- آرایه ها
- حافظه
آخرین به روز رسانی: 1397/11/09
یک آرایه مجموعه ای از مقادیر از یک نوع را نشان می دهد. اعلان یک آرایه شبیه به اعلان یک متغیر معمولی است که یک مقدار واحد را ذخیره می کند و دو راه برای اعلام یک آرایه وجود دارد:
data_type array_name; // یا data_type array_name;
به عنوان مثال، بیایید یک آرایه از اعداد را تعریف کنیم:
اعداد int; int nums2;
پس از اعلان آرایه، می توانیم آن را مقداردهی اولیه کنیم:
اعداد int; nums = new int; // آرایه 4 عددی
یک آرایه با استفاده از ساختار زیر ایجاد میشود: new data_type[تعداد عناصر]، که new یک کلمه کلیدی است که حافظه را برای تعداد عناصر مشخص شده در پرانتز اختصاص میدهد. مثلا nums = new int; - این عبارت آرایه ای از چهار عنصر int ایجاد می کند و هر عنصر مقدار پیش فرض 0 خواهد داشت.
همچنین می توانید بلافاصله هنگام اعلام آرایه، آن را مقداردهی اولیه کنید:
Int nums = int جدید; // آرایه 4 عددی int nums2 = new int; // آرایه 5 عددی
با چنین مقداردهی اولیه، همه عناصر آرایه دارای یک مقدار پیش فرض هستند. برای انواع عددی (شامل نوع char) این عدد 0، برای نوع بولی این عدد نادرست و برای سایر اشیا عدد صفر است. به عنوان مثال، برای نوع int مقدار پیش فرض 0 است، بنابراین آرایه اعداد تعریف شده در بالا از چهار صفر تشکیل شده است.
با این حال، شما همچنین می توانید مقادیر خاصی را برای عناصر یک آرایه هنگام ایجاد آن تنظیم کنید:
// این دو متد معادل int nums = new int ( 1, 2, 3, 5 ); int nums2 = ( 1، 2، 3، 5);
شایان ذکر است که در این مورد، براکتهای مربع اندازه آرایه را نشان نمیدهند، زیرا با تعداد عناصر موجود در پرانتزهای فرفری محاسبه میشود.
پس از ایجاد یک آرایه، میتوانیم به هر یک از عناصر آن توسط شاخص دسترسی داشته باشیم که پس از نام متغیر آرایه در کروشههای مربع ارسال میشود:
Int nums = int جدید; // مقادیر عناصر آرایه را تنظیم کنید nums = 1; اعداد = 2; اعداد = 4; اعداد = 100; // مقدار عنصر سوم آرایه را دریافت کنید System.out.println(nums); // 4
نمایه سازی عناصر آرایه از 0 شروع می شود، بنابراین در این حالت برای دسترسی به عنصر چهارم در آرایه باید از عبارت nums استفاده کنیم.
و از آنجایی که آرایه ما فقط برای 4 عنصر تعریف شده است، نمی توانیم به عنوان مثال به عنصر ششم دسترسی داشته باشیم: nums = 5; . اگر سعی کنیم این کار را انجام دهیم، با خطا مواجه می شویم.
طول آرایه
مهمترین خاصیتی که آرایه ها دارند ویژگی length است که طول آرایه یعنی تعداد عناصر آن را برمی گرداند:
اعداد Int = (1، 2، 3، 4، 5)؛ int length = nums.length; // 5
ناشناخته بودن آخرین شاخص غیرمعمول نیست و برای بدست آوردن آخرین عنصر یک آرایه، می توانیم از این ویژگی استفاده کنیم:
Int last = nums;
آرایه های چند بعدی
قبلاً آرایههای یک بعدی را بررسی کردیم که میتوان آنها را به صورت زنجیره یا رشتهای از مقادیر مشابه نشان داد. اما علاوه بر آرایه های یک بعدی، آرایه های چند بعدی نیز وجود دارد. معروف ترین آرایه چند بعدی جدولی است که یک آرایه دو بعدی را نشان می دهد:
Int nums1 = int جدید ( 0، 1، 2، 3، 4، 5)؛ int nums2 = ( ( 0, 1, 2 ), ( 3, 4, 5 ) );
به صورت بصری، هر دو آرایه را می توان به صورت زیر نشان داد:
آرایه یک بعدی nums1
آرایه دو بعدی nums2
از آنجایی که آرایه nums2 دو بعدی است، یک جدول ساده است. همچنین می تواند به این صورت ایجاد شود: int nums2 = new int; . تعداد براکت ها اندازه آرایه را نشان می دهد. و اعداد داخل پرانتز تعداد سطرها و ستون ها را نشان می دهد. و همچنین، با استفاده از شاخص ها، می توانیم از عناصر آرایه در یک برنامه استفاده کنیم:
// عنصر ستون اول ردیف دوم را تنظیم کنید nums2=44; System.out.println(nums2);
یک اعلان آرایه سه بعدی ممکن است به شکل زیر باشد:
Int nums3 = int جدید;
آرایه دندانه دار
آرایه های چند بعدی را می توان به صورت "آرایه های ناهموار" نیز نمایش داد. در مثال بالا، آرایه دو بعدی دارای 3 سطر و سه ستون بود، بنابراین ما یک جدول مسطح داشتیم. اما ما می توانیم به هر عنصر در یک آرایه دو بعدی یک آرایه جداگانه با تعداد عناصر متفاوت اختصاص دهیم:
Int nums = int جدید; nums = new int; nums = new int; nums = new int;
برای هر
یک نسخه ویژه از حلقه for برای تکرار روی عناصر در مجموعهای از عناصر، مانند آرایهها و مجموعهها طراحی شده است. شبیه حلقه foreach است که در سایر زبان های برنامه نویسی یافت می شود. اطلاعیه رسمی آن:
برای (نوع_داده متغیر_نام: محفظه)(// اقدامات)
مثلا:
آرایه Int = int جدید ( 1, 2, 3, 4, 5 ); برای (int i: آرایه) (System.out.println(i)؛ )
در این مورد، کانتینر آرایه ای از داده ها از نوع int است. سپس یک متغیر از نوع int اعلام می شود
همین کار را می توان با نسخه معمولی برای انجام داد:
آرایه Int = int جدید ( 1, 2, 3, 4, 5 ); برای (int i = 0; i< array.length; i++){ System.out.println(array[i]); }
در عین حال، این نسخه از حلقه for انعطاف پذیرتر از for (int i: آرایه) است. به طور خاص، در این نسخه می توانیم عناصر را تغییر دهیم:
آرایه Int = int جدید ( 1, 2, 3, 4, 5 ); برای (int i=0; i ابتدا یک حلقه برای تکرار روی ردیف ها ایجاد می شود و سپس در حلقه اول، یک حلقه داخلی برای تکرار روی ستون های یک ردیف خاص ایجاد می شود. به روشی مشابه، می توانید روی آرایه ها و مجموعه های سه بعدی با تعداد ابعاد زیاد تکرار کنید. آرایه یک ساختار داده ای است که مقادیری از یک نوع را ذخیره می کند. یک عنصر آرایه جداگانه با استفاده از یک شاخص عدد صحیح قابل دسترسی است. به عنوان مثال، اگر a آرایه ای از اعداد صحیح باشد، مقدار عبارت a[i] برابر با i-امین عدد صحیح در آرایه است. یک آرایه به صورت زیر اعلام می شود: ابتدا نوع آرایه، یعنی نوع عناصر موجود در آرایه، به دنبال آن یک جفت براکت خالی و سپس نام متغیر مشخص می شود. به عنوان مثال، در اینجا نحوه اعلام یک آرایه متشکل از اعداد صحیح آمده است: با این حال، این عبارت فقط متغیر a را بدون مقداردهی اولیه آن با یک آرایه واقعی اعلام می کند. برای ایجاد یک آرایه، باید از عملگر جدید استفاده کنید. این عملگر آرایه ای از 100 عدد صحیح ایجاد می کند. عناصر این آرایه از 0 تا 99 شماره گذاری شده اند (نه از 1 تا 100). پس از ایجاد، آرایه را می توان به عنوان مثال با استفاده از یک حلقه پر کرد. int a = جدید int; اگر بخواهید با ایجاد آرایه ای متشکل از 100 عنصر به عنصر a (یا هر عنصر دیگری که نمایه آن خارج از محدوده 0 تا 99 است) دسترسی پیدا کنید، برنامه خاتمه می یابد زیرا یک شاخص آرایه خارج از محدوده، محدوده پرتاب می شود. مثلا، برای (int i = 0; i< a. length; i++ System.out.println (a[i]); هنگامی که یک آرایه ایجاد می شود، تغییر اندازه آن غیرممکن است (البته می توانید عناصر جداگانه آن را تغییر دهید). اگر در طول اجرای برنامه نیاز به تغییر اندازه یک آرایه دارید، بهتر است از ساختار داده دیگری به نام فهرست آرایه استفاده کنید. یک آرایه را می توان به دو صورت اعلام کرد: int a; اکثر برنامه نویسان جاوا سبک اول را ترجیح می دهند زیرا به وضوح نوع آرایه int را از نام متغیر جدا می کند. مقداردهی اولیه آرایه و آرایه های بی نام
جاوا دارای امکاناتی برای ایجاد همزمان آرایه و مقداردهی اولیه آن است. در اینجا نمونه ای از چنین ساختار نحوی آورده شده است: int smallPrimes = ( 2، 3، 5، 7، 11، 13); توجه داشته باشید که در این حالت نیازی به استفاده از اپراتور جدید نیست. علاوه بر این، حتی می توانید یک آرایه بدون نام را مقداردهی اولیه کنید: int جدید ( 16، 19، 23، 29، 31، 37) این عبارت حافظه را برای یک آرایه جدید اختصاص می دهد و آن را با اعداد مشخص شده در پرانتزهای فرفری پر می کند. در این حالت تعداد آنها محاسبه شده و بر این اساس اندازه آرایه مشخص می شود. استفاده از این ساختار نحوی برای شروع مجدد آرایه بدون ایجاد متغیر جدید راحت است. مثلاً عبارت smallPrimes = new int( 17, 19, 23, 29, 31, 37 ); می توانید یک آرایه با اندازه صفر ایجاد کنید. چنین آرایهای میتواند هنگام نوشتن روشی مفید باشد که آرایهای را که خالی است، ارزیابی میکند. یک آرایه با طول صفر به صورت زیر اعلام می شود: نوع عنصر جدید توجه داشته باشید که چنین آرایه ای معادل یک شی تهی نیست. کپی کردن آرایه ها
یک آرایه را می توان در آرایه دیگر کپی کرد، اما هر دو متغیر به یک آرایه اشاره می کنند. int luckyNumbers = smailPrimes; نتیجه در شکل نشان داده شده است. 3.14. اگر نیاز دارید که تمام عناصر یک آرایه را در آرایه دیگر کپی کنید، باید از روش arraycopy از کلاس System استفاده کنید. تماس آن به این صورت است: System.arraycopy(از, fromlndex, to, tolndex, count); آرایه to باید به اندازه ای بزرگ باشد که شامل تمام عناصری باشد که باید کپی شوند. برنج. 3.14. کپی کردن یک آرایه به عنوان مثال، عملگرهای نشان داده شده در زیر، که نتایج آن در شکل نشان داده شده است. 3.15، دو آرایه ایجاد کنید و سپس چهار عنصر آخر آرایه اول را در آرایه دوم کپی کنید. کپی کردن از موقعیت دوم در آرایه منبع شروع می شود و عناصر کپی شده در آرایه هدف قرار می گیرند که از موقعیت سوم شروع می شود. int smailPrimes = (2، 3، 5، 7، 11، 13); اجرای این دستورات نتیجه زیر را ایجاد می کند. 0: 1001 برنج. 3.15. کپی کردن عناصر آرایه یک آرایه در جاوا تفاوت قابل توجهی با آرایه در C++ دارد. با این حال، عملاً مانند یک اشاره گر به یک آرایه پویا است. این بدان معنی است که اپراتور int a = جدید int; //جاوا در جاوا، هیچ اپراتور پیش فرض محدوده ایندکس ها را بررسی می کند. علاوه بر این، جاوا حسابی اشاره گر ندارد—شما نمی توانید یک اشاره گر را برای دسترسی به عنصر بعدی آرایه افزایش دهید. آرایهساختار داده ای است که برای ذخیره داده هایی از همان نوع طراحی شده است. آرایه ها در جاوا متفاوت از C/C++ کار می کنند. ویژگی ها: آرایه های تک بعدی: فرم عمومی اعلامیه var-name را تایپ کنید. یا var-name را تایپ کنید. یک اعلان دو جزء دارد: یک نوع و یک نام. type نوع عنصر آرایه را اعلام می کند. نوع عنصر نوع داده هر عنصر را تعیین می کند. به غیر از نوع int، میتوانیم آرایهای از انواع دادههای دیگر مانند char، float، double یا نوع داده تعریفشده توسط کاربر (اشیاء کلاس) ایجاد کنیم، بنابراین نوع عنصر تعیین میکند که چه نوع دادهای در آرایه ذخیره شود. مثلا: // هر دو اعلان های معتبر int intArray هستند. یا int intArray; بایت بایت آرایه; shortsArray; بولین آرایه بولی; طولانی longArray; float floatArray; double doubleArray; char charArray; // آرایه ای از ارجاعات به اشیاء // کلاس MyClass (کلاس ایجاد شده توسط // کاربر) MyClass myClassArray; شی ao، // آرایه از Object Collection ca; // آرایه از مجموعه // از نوع ناشناخته اگرچه اولین اعلان بالا این واقعیت را ثابت می کند که intArray یک متغیر آرایه است، آرایه در واقع وجود ندارد. به سادگی به کامپایلر می گوید که این متغیر از نوع عدد صحیح است. برای مرتبط کردن یک آرایه int با یک آرایه فیزیکی واقعی از اعداد صحیح، باید آن را با new مشخص کرده و به int اختصاص دهید. هنگام اعلان یک آرایه، تنها ارجاع به آرایه ایجاد می شود. برای ایجاد یا تخصیص حافظه واقعی به یک آرایه، باید آرایه را به صورت زیر ایجاد کنید: شکل کلی new در صورت اعمال به آرایه های یک بعدی به شرح زیر است: در اینجا type نوع داده، اندازه تعداد عناصر آرایه و var-name نام متغیر آرایه است. intArray; //اعلان intArray = int جدید; // تخصیص حافظه Int intArray = int جدید; // اتحاد. اتصال دانستن این نکته مهم است که عناصر آرایه تخصیص یافته توسط تابع جدید به طور خودکار به صفر (برای انواع عددی)، false (برای انواع بولی)، یا صفر (برای انواع مرجع) مقداردهی اولیه می شوند. در شرایطی که اندازه آرایه و متغیرها از قبل شناخته شده است، می توان از Literals استفاده کرد. Int intArray = new int( 1,2,3,4,5,6,7,8,9,10); // اعلان آرایه تحت اللفظی هر عنصر آرایه از طریق شاخص خود قابل دسترسی است. این شاخص از 0 شروع می شود و در (اندازه کل) -1 به پایان می رسد. با استفاده از حلقه for می توان به همه عناصر دسترسی داشت. برای (int i = 0; i< arr.length; i++)
System.out.println("Element at index " + i +
" : "+ arr[i]);
// مثالی برای نشان دادن ایجاد یک آرایه کلاس GFG // تخصیص حافظه برای 5 عدد صحیح. //به زودی... // دسترسی به عناصر آرایه مشخص شده عنصر در شاخص 0: 10 عنصر در شاخص 1: 20 عنصر در شاخص 2: 30 عنصر در شاخص 3: 40 عنصر در شاخص 4: 50 آرایه ای از اشیاء به روشی مشابه عناصر داده به شرح زیر ایجاد می شود: دانشجو arr = دانشجوی جدید; StudentArray شامل هفت عنصر حافظه هر یک از کلاس دانشجو است که آدرس های هفت شی Student را می توان در آنها ذخیره کرد. اشیاء دانشجویی باید با استفاده از سازنده کلاس دانشجو ایجاد شوند و ارجاعات آنها باید به صورت زیر به عناصر آرایه اختصاص داده شود: دانشجو arr = دانشجوی جدید; // برنامه جاوا برای نشان دادن ایجاد یک آرایه از دانش آموز کلاس // عناصر آرایه اشیاء یک کلاس Student هستند. // تخصیص حافظه برای 5 شی از نوع Student. // اولین عناصر آرایه را مقداردهی اولیه کنید // عناصر دوم آرایه را مقداردهی اولیه کنید // به زودی... // دسترسی به عناصر آرایه مشخص شده ما گرفتیم: عنصر در 0: 1 aman عنصر در 1: 2 vaibhav عنصر در 2: 3 shikar عنصر در 3: 4 dharmesh عنصر در 4: 5 mohit اگر بخواهیم به عنصری خارج از آرایه دسترسی پیدا کنیم چه اتفاقی می افتد؟ آرایههای چند بعدی، آرایههایی از آرایهها هستند که در آنها هر عنصر حاوی ارجاع به آرایه دیگری است. با افزودن یک مجموعه براکت مربع () برای هر بعد ایجاد می شود. بیایید به یک مثال نگاه کنیم: Int intArray = int جدید; //آرایه دو بعدی یا ماتریس int intArray = new int; //آرایه سه بعدی کلاس چند بعدی // چاپ آرایه دو بعدی System.out.println(); خروجی: 2 7 9 3 6 1 7 4 2 درست مانند متغیرها، می توانیم آرایه ها را به متدها منتقل کنیم. // برنامه جاوا برای نشان دادن // انتقال آرایه به کلاس متد Test ( // روش درایور public static void main(string args) ( int arr = (3, 1, 2, 5, 4); // ارسال آرایه به متد m1 sum(arr)؛ ) public static void sum (int arr) ( // گرفتن مجموع مقادیر آرایه int sum = 0; for (int i = 0; i< arr.length; i++)
sum+=arr[i];
System.out.println("sum of array values: " + sum);
}
}
در خروجی دریافت می کنیم: مجموع مقادیر آرایه: 15 طبق معمول، متد می تواند یک آرایه را نیز برگرداند. برای مثال، برنامه زیر یک آرایه از متد m1 برمی گرداند. // برنامه جاوا برای نشان دادن // بازگشت آرایه از کلاس روش Test ( // روش درایور 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};
}
}
هر آرایه دارای یک شی کلاس مرتبط است که با همه آرایه های دیگر با همان نوع جزء مشترک است. // برنامه جاوا برای نشان دادن // کلاس اشیاء برای آزمون کلاس آرایه ها ( باطل استاتیک عمومی اصلی (رشته آرگ) ( int intArray = int جدید؛ بایت بایت = بایت جدید؛ shortsArray کوتاه = کوتاه جدید؛ // آرایه رشته ها رشته strArray = رشته جدید؛ 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()); ) ) کلاس +" "); )))) کلون یک آرایه چند بعدی (مانند Object) یک کپی است، به این معنی که تنها یک آرایه جدید با هر عنصر و ارجاع به آرایه اصلی عناصر ایجاد می کند، اما آرایه های تو در تو مشترک هستند. // برنامه جاوا برای نشان دادن // شبیه سازی آرایه های چند بعدی کلاس Test ( public static void main(string args) ( int intArray = ((1,2,3),(4,5))؛ int cloneArray = intArray. clone(); // غلط را چاپ می کند System.out.println(intArray == cloneArray)؛ // درست را با ایجاد کپی کم عمق چاپ می کند // یعنی آرایه های فرعی به اشتراک گذاشته می شوند System.out.println(intArray == cloneArray) System.out.println(intArray == cloneArray)؛ )
حلقه زدن از طریق آرایه های چند بعدی
int nums = int جدید ( (1، 2، 3)، (4، 5، 6)، (7، 8، 9) ); برای (int i = 0; i< nums.length; i++){
for(int j=0; j < nums[i].length; j++){
System.out.printf("%d ", nums[i][j]);
}
System.out.println();
}
مطالعه برای تبدیل شدن به یک "توسعه دهنده بازی" + استخدام آرایه های جاوا
int a;
برای (int i = 0; i< 100; i++)
a[i] = i; // آرایه را با اعداد از 0 تا 99 پر می کند.
برای شمارش تعداد عناصر یک آرایه، از روش nameArray- استفاده کنید.
طول.
یا
int a;
یک عبارت کوتاه شده است
int anonymous = ( 17، 19، 23، 29، 31، 37);
smailPrimes = ناشناس;
LuckyNimbers = 12; // اکنون عنصر smailPrimes نیز 12 است.
int luckyNumbers = (1001، 1002، 1003، 1004، 1005، 1006، 1007)؛
System.aggausor(smailPrimes, 2, luckyNumbers, 3, 4);
برای (int i = 0; i< luckyNumbers.length; i++)
System.println(i +.": " + luckyNumbersfi]);
1: 1002
2: 1003
3: 5
4: 7
5: 11
6: 13
معادل اپراتور است
i n t * = جدید i n t [ 1 0 0 ] ; // C++،
اما نه
int a; // C++مقداردهی اولیه و دسترسی به آرایه
نحوه ایجاد آرایه در جاوا
var-name = نوع جدید;
گرفتن آرایه یک فرآیند دو مرحله ای است. ابتدا باید متغیری از نوع دلخواه را تعریف کنید. در مرحله دوم، باید حافظه ای را که حاوی آرایه است با استفاده از new اختصاص دهید و آن را به یک متغیر اختصاص دهید. بنابراین، در جاوا، همه آرایه ها به صورت پویا تخصیص داده می شوند.حروف آرایه
دسترسی به عناصر آرایه جاوا با استفاده از حلقه For
// اعداد صحیح، مقادیری را در یک آرایه قرار می دهد،
// و هر مقدار را چاپ می کند.
{
{
int arr;
arr = int جدید;
arr = 10;
arr = 20;
arr = 30;
arr = 40;
arr = 50;
برای (int i = 0; i< arr.length; i++)
System.out.println("عنصر در نمایه" + i +
" : "+ arr[i]);
}
}
در نتیجه دریافت می کنیم:آرایه های اشیاء
// اشیاء
{
عمومی int roll_no;
نام رشته عمومی;
دانشجو (int roll_no، نام رشته)
{
this.roll_no = roll_no;
this.name = نام;
}
}
کلاس عمومی GFG
{
اصلی خالی استاتیک عمومی (آرگس های رشته ای)
{
// آرایه ای از اعداد صحیح را اعلام می کند.
دانشجویی arr;
arr = دانشجوی جدید;
arr = دانشجوی جدید(1"aman");
arr = دانشجوی جدید(2"vaibhav");
arr = دانشجوی جدید(3"shikar");
arr = دانشجوی جدید (4"dharmesh");
arr = دانشجوی جدید (5"mohit");
برای (int i = 0; i< arr.length; i++)
System.out.println("عنصر در " + i + " : " +
arr[i].roll_no +" "+ arr[i].name);
}
}
کامپایلر یک ArrayIndexOutOfBoundsException می اندازد که نشان می دهد آرایه در یک شاخص نامعتبر قابل دسترسی است. شاخص یا منفی است یا بزرگتر یا مساوی با اندازه آرایه. چند بعدی
{
اصلی خالی استاتیک عمومی (آرگس های رشته ای)
{
// اعلام و مقداردهی اولیه آرایه دو بعدی
int arr = ((2,7,9),(3,6,1),(7,4,2));
برای (int i=0; i< 3 ; i++)
{
برای (int j=0; j< 3 ; j++)
System.out.print(arr[i][j] + " ");
}
}
} ارسال آرایه ها به یک متد
برگرداندن آرایه ها از متدها
اشیاء کلاس