আমার এর মতো অ্যারে ডিক্লেয়ারেশন রয়েছে:
int a[];
এখানে aআদিম intধরণের অ্যারে রয়েছে । এই অ্যারে কোথায় সঞ্চিত? এটি গাদা বা স্ট্যাকের উপর সংরক্ষণ করা হয়? এটি একটি intআদিম প্রকার , সমস্ত আদিম ধরণগুলি গাদাতে সংরক্ষণ করা হয় না।
আমার এর মতো অ্যারে ডিক্লেয়ারেশন রয়েছে:
int a[];
এখানে aআদিম intধরণের অ্যারে রয়েছে । এই অ্যারে কোথায় সঞ্চিত? এটি গাদা বা স্ট্যাকের উপর সংরক্ষণ করা হয়? এটি একটি intআদিম প্রকার , সমস্ত আদিম ধরণগুলি গাদাতে সংরক্ষণ করা হয় না।
উত্তর:
গুরুকুলকি যেমন বলেছিল, এটি স্তূপে সঞ্চিত। যাইহোক, আপনার পোস্টটি সম্ভবত কোনও উদ্দেশ্যপ্রণোদিত ব্যক্তি এমন পৌরাণিক কল্পিত প্রচারের কারণে একটি ভুল বোঝাবুঝির পরামর্শ দিয়েছে যা "আদিমরা সর্বদা স্ট্যাকের উপরে থাকে"। এটি অসত্য। স্থানীয় ভেরিয়েবলগুলির স্ট্যাকের মান রয়েছে তবে সমস্ত আদিম ভেরিয়েবল স্থানীয় নয় ...
উদাহরণস্বরূপ, এটি বিবেচনা করুন:
public class Foo
{
int value;
}
...
public void someOtherMethod()
{
Foo f = new Foo();
...
}
এখন কোথায় থাকে f.value? পৌরাণিক কাহিনীটি এটি স্ট্যাকের উপরে রাখার পরামর্শ দেবে - তবে আসলে এটি নতুন Fooবস্তুর অংশ , এবং স্তূপ 1 এ বাস করে । (মনে রাখবেন যে নিজের মানটি fএকটি রেফারেন্স এবং স্ট্যাকের উপরে থাকে))
সেখান থেকে এটি অ্যারে করার সহজ পদক্ষেপ। আপনি অ্যারেটিকে কেবল প্রচুর ভেরিয়েবল হিসাবে ভাবতে পারেন - তাই new int[3]এই ফর্মটির শ্রেণি থাকার মতো কিছুটা:
public class ArrayInt3
{
public readonly int length = 3;
public int value0;
public int value1;
public int value2;
}
1 আসলে, এটি এর চেয়ে জটিল। স্ট্যাক / গাদা পার্থক্য বেশিরভাগই একটি বাস্তবায়নের বিশদ - আমি বিশ্বাস করি কিছু জেভিএম, সম্ভবত পরীক্ষামূলকভাবে বলা যেতে পারে যে কোনও বস্তু কখন কোনও পদ্ধতি থেকে "পলায়ন" না করে এবং স্ট্যাকের পুরো বস্তুটি বরাদ্দ করতে পারে। তবে আপনি যত্ন নিতে বেছে নিলে ধারণাটি হ'ল ।
Stringএকটি দ্বারা সমর্থন করা হয় char[]। আমি বিশ্বাস করি যে আক্ষরিক স্ট্রিংগুলি সর্বজনীন ধ্রুবক পুলে সংরক্ষণ করা হয়; জিসি অপ্টিমাইজেশনের জন্য, এটি বোঝায় যে ব্যাকিং অ্যারেগুলিও একইভাবে সংরক্ষণ করা উচিত (অন্যথায় ধ্রুব পুলটি কোনও জিসি চক্রের সময় স্ক্যান করতে হবে যেখানে ব্যাকিং অ্যারে অন্যথায় সংগ্রহের জন্য যোগ্য হবে)।
এটি স্তূপে সংরক্ষণ করা হবে
কারণ অ্যারে জাভাতে একটি বস্তু।
সম্পাদনা : আপনি যদি
int [] testScores;
testScores = new int[4];
এই কোডটি সংকলককে বলে মনে করুন, "এমন একটি অ্যারে অবজেক্ট তৈরি করুন যা চারটি ইন্টি ধরে রাখবে এবং নামটি রেফারেন্স ভেরিয়েবলের জন্য এটি অর্পণ করবে testScores। এছাড়াও, এগিয়ে যান এবং প্রতিটি intউপাদান শূন্যে সেট করুন Thanks ধন্যবাদ"
-gসংকলকটিতে বিকল্পটি সরবরাহ করেন supply অন্যথায় এটি অপ্টিমাইজড হবে।
এটি আদিম ধরণের একটি অ্যারে যা নিজে থেকেই আদিম নয়। থাম্বের একটি ভাল নিয়ম হল যখন নতুন কীওয়ার্ড জড়িত তখন ফলাফলটি হ'ল।
আমি এই বিষয়ে আমি চালানো কয়েকটি পরীক্ষা ভাগ করে নিতে চেয়েছিলাম।
10 মিলিয়ন আকারের অ্যারে
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
আউটপুট:
------------------------
max mem = 130.0 MB
total mem = 85.0 MB
free mem = 83.6 MB
used mem = 1.4 MB
------------------------
------------------------
max mem = 130.0 MB
total mem = 130.0 MB
free mem = 48.9 MB
used mem = 81.1 MB
------------------------
আপনি দেখতে পাচ্ছেন যে ব্যবহৃত হিপ আকারটি MB 80 এমবি বৃদ্ধি পেয়েছে যা 10 মি * আকারের (ডাবল) হয়।
তবে আমাদের যদি ডাবলের পরিবর্তে ডাবল ব্যবহার করা হয়
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
আউটপুট 40MB প্রদর্শন করবে। আমাদের কেবল ডাবল রেফারেন্স রয়েছে, সেগুলি আরম্ভ করা হয়নি।
এটি ডাবল দিয়ে পূরণ করুন
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
Double qq = 3.1d;
for (int i = 0; i < a.length; i++) {
a[i] = qq;
}
memInfo();
}
এখনও 40 এমবি। কারণ তারা সবাই একই ডাবল অবজেক্টের দিকে নির্দেশ করে।
পরিবর্তে ডাবল দিয়ে শুরু করা হচ্ছে
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
Double qq = 3.1d;
for (int i = 0; i < a.length; i++) {
a[i] = qq.doubleValue();
}
memInfo();
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
লাইন
a[i] = qq.doubleValue();
সমতুল্য
a[i] = Double.valueOf(qq.doubleValue());
যা সমান
a[i] = new Double(qq.doubleValue());
যেহেতু আমরা প্রতিবার নতুন ডাবল অবজেক্ট তৈরি করি, তাই আমরা গাদাটি ফুটিয়ে তুলি। এটি দেখায় যে ডাবল ক্লাসের মানগুলি হিপতে সঞ্চয় করা হয়।
জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে অ্যারেগুলি হ'ল অবজেক্টস, ডাইনামিকভাবে তৈরি করা হয় এবং অবজেক্ট টাইপের ভেরিয়েবলগুলিতে নিয়োগ দেওয়া হতে পারে।
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html