জাভাতে বস্তুর একটি অ্যারে তৈরি করা হচ্ছে


196

আমি জাভাতে নতুন এবং সময়ের জন্য জাভাতে একটি অ্যারে তৈরি করেছি created

উদাহরণস্বরূপ আমার একটি এ ক্লাস রয়েছে -

A[] arr = new A[4];

তবে এটি A4 টি অবজেক্টের জন্য নয় কেবল পয়েন্টার (রেফারেন্স) তৈরি করছে । এটা কি সঠিক? আমি দেখতে পাচ্ছি যে আমি যখন তৈরি বস্তুগুলিতে ফাংশন / ভেরিয়েবলগুলি অ্যাক্সেস করার চেষ্টা করি তখন আমি একটি নাল পয়েন্টার ব্যতিক্রম পাই। আমাকে যে জিনিসগুলি করতে হয়েছিল তা হেরফের করতে / অ্যাক্সেস করতে সক্ষম হতে:

A[] arr = new A[4];
for (int i = 0; i < 4; i++) {
    arr[i] = new A();
}

এটি সঠিক নাকি আমি কিছু ভুল করছি? এটি যদি সঠিক হয় তবে এটি সত্যই বিজোড়।

সম্পাদনা: আমি এটিকে অদ্ভুত বলে মনে করি কারণ সি ++ এ আপনি কেবল নতুন বলেছেন A[4]এবং এটি চারটি বস্তু তৈরি করে।


17
আমি কেবল এটি বলতে চেয়েছিলাম এটি একটি ব্যতিক্রমী সহায়ক প্রশ্ন; এটি জিজ্ঞাসা করার জন্য ধন্যবাদ।
প্যান্ডোরিম

উত্তর:


262

এটা সঠিক।

A[] a = new A[4];

... এটি Aকরার অনুরূপ 4 টি রেফারেন্স তৈরি করে :

A a1;
A a2;
A a3;
A a4;

এখন আপনি এই জাতীয় a1.someMethod()বরাদ্দ না করে করতে পারবেন না a1:

a1 = new A();

একইভাবে, অ্যারের সাথে আপনার এটি করা প্রয়োজন:

a[0] = new A();

... এটি ব্যবহার করার আগে।


10
এই উত্তরটি আমাকে পুরো বিভ্রান্তি থেকে বাঁচিয়েছে, এর অস্তিত্বের জন্য আপনাকে ধন্যবাদ।
প্যান্ডোরিম

1
আমারও এই বিভ্রান্তি ছিল, যেহেতু আমি সি ++ ব্যাকগ্রাউন্ড থেকে এসেছি আমি সবসময় ধরে নিয়েছিলাম যে সি ++ এর মতো জাভা এর newকীওয়ার্ডটিও কনস্ট্রাক্টরকে কল করে এবং আই মেমরি বরাদ্দ করে। আমার ধারণা জাভাতে newকেবলমাত্র সি ++ এর তুলনায় প্রকৃত অবজেক্ট নয় বরং রেফারেন্স তৈরি হয়। উত্তরের জন্য ধন্যবাদ.
কৃষ্ণা ওজা

1
@ কৃষ্ণ_ ওজা, এখানে সি ++ থেকে কোনও পার্থক্য নেই। প্রথমটি newএকটি অ্যারে অবজেক্ট তৈরি করে। এগুলি গতিশীলভাবে বরাদ্দকৃত বস্তু ("হিপ")। সুতরাং সাদৃশ্য সি ++ কোড হবে A **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }
ভেসেভলড গোলভানভ

1
আমি সেই নতুন রেফারেন্স তৈরি করি তবে সি ++ এর মতো অ্যারের প্রতিটি উপাদানগুলির জন্য কনস্ট্রাক্টরও কেন আরম্ভ করব না। এটি নির্বোধ হতে পারে, তবে আমি জিজ্ঞাসা করতে চাই, আমাদের যে কোনও সমস্যা হবে, যদি আমরা তা করি ?? @MeBigFatGuy
Jasser

2
@ জাসার - উপাদানগুলির জন্য আপনি কোন কনস্ট্রাক্টরকে কল করবেন? যদি একমাত্র উপাদান নির্মাতা একগুচ্ছ যুক্তি গ্রহণ করে? আপনি কীভাবে এই জিনিসগুলি তৈরি করবেন?
মেবিগফ্যাটগুয়ে

77

এটা সঠিক। আপনি এটি করতে পারেন:

A[] a = new A[] { new A("args"), new A("other args"), .. };

এই বাক্য গঠনটি যে কোনও জায়গায় অ্যারে তৈরি এবং আরম্ভ করতে ব্যবহার করা যেতে পারে, যেমন একটি পদ্ধতি আর্গুমেন্টে:

someMethod( new A[] { new A("args"), new A("other args"), . . } )

34

হ্যাঁ, এটি কেবলমাত্র রেফারেন্স তৈরি করে, যা তাদের ডিফল্ট মান নালায় সেট করে। এজন্য আপনি একটি নালপয়েন্টার এক্সসেপশন পান আপনার আলাদাভাবে অবজেক্ট তৈরি করতে হবে এবং রেফারেন্স নির্ধারণ করতে হবে। জাভাতে অ্যারে তৈরির জন্য 3 টি পদক্ষেপ রয়েছে -

ঘোষণা - এই পদক্ষেপে, আমরা ডেটা টাইপ এবং অ্যারে যে মাত্রা তৈরি করতে যাচ্ছি তা উল্লেখ করি। তবে মনে রাখবেন, আমরা আকারগুলির আকারগুলি এখনও উল্লেখ করি না। এগুলি খালি পড়ে আছে।

ইনস্ট্যান্টেশন - এই পদক্ষেপে আমরা নতুন কীওয়ার্ডটি ব্যবহার করে অ্যারে তৈরি করি বা অ্যারের জন্য মেমরি বরাদ্দ করি। এই পদক্ষেপে আমরা অ্যারের মাত্রার আকারগুলি উল্লেখ করি।

ইনিশিয়ালাইজেশন - অ্যারে সর্বদা ডেটা টাইপের ডিফল্ট মান থেকে শুরু করা হয়। তবে আমরা আমাদের নিজস্ব সূচনা করতে পারি।

জাভাতে অ্যারেগুলি ঘোষণা করা

এভাবেই আমরা জাভাতে এক-মাত্রিক অ্যারে ঘোষণা করি -

int[] array;
int array[];

ওরাকল আপনাকে পরামর্শ দেয় যে অ্যারে ঘোষণার জন্য আপনি পূর্বের বাক্য গঠনটি ব্যবহার করুন। আইনী ঘোষণার আরও কয়েকটি উদাহরণ এখানে -

// One Dimensional Arrays
int[] intArray;             // Good
double[] doubleArray;

// One Dimensional Arrays
byte byteArray[];           // Ugly!
long longArray[];

// Two Dimensional Arrays
int[][] int2DArray;         // Good
double[][] double2DArray;

// Two Dimensional Arrays
byte[] byte2DArray[];       // Ugly
long[] long2DArray[];

এবং এটি অবৈধ ঘোষণার কয়েকটি উদাহরণ -

int[5] intArray;       // Don't mention size!
double{} doubleArray;  // Square Brackets please!

ইনস্ট্যান্স

এভাবেই আমরা একটি "অ্যারেস্টিটিউট" করি, বা অ্যারের জন্য মেমরি বরাদ্দ করি -

int[] array = new int[5];

যখন জেভিএম newকীওয়ার্ডটির মুখোমুখি হয় , তখন এটি বুঝতে পারে যে এটি অবশ্যই কোনও কিছুর জন্য মেমরি বরাদ্দ করতে হবে। এবং নির্দিষ্ট করে int[5], আমরা এর অর্থ হ'ল আমরা intআকার 5 এর একটি অ্যারে চাই , সুতরাং, JVM মেমরিটি তৈরি করে এবং নতুন বরাদ্দকৃত মেমরির রেফারেন্সকে অ্যারেতে নির্ধারণ করে যা কোন "রেফারেন্স" টাইপ করেint[]

আরম্ভ

একটি লুপ ব্যবহার করে - অ্যারের উপাদানগুলির সূচনা করতে লুপের জন্য ব্যবহার করা অ্যারেটি চালানোর সর্বাধিক সাধারণ উপায়। আপনি যদি ডিফল্ট মান নিজেই অর্পণ করতে যাচ্ছেন তবে লুপের জন্য চালানোর দরকার নেই, কারণ জেভিএম এটি আপনার জন্য করে।

অল ইন ওয়ান ..! - আমরা একসাথে আমাদের অ্যারে ঘোষণা, ইনস্ট্যান্টিয়েট এবং সূচনা করতে পারি। এখানে বাক্য গঠন -

int[] arr = {1, 2, 3, 4, 5};

এখানে, আমরা আকারটি উল্লেখ করি না, কারণ জেভিএম দেখতে পাচ্ছে যে আমরা 5 টি মান দিচ্ছি।

সুতরাং, যতক্ষণ না আমরা তাত্ক্ষণিকভাবে উল্লেখগুলি বাতিল হয়ে যায় ull আমি আশা করি আমার উত্তর আপনাকে সাহায্য করেছে ..! :)

উত্স - জাভাতে অ্যারে


5

এখানে 10 জন কর্মচারী অবজেক্টের অ্যারে তৈরির স্পষ্ট উদাহরণ রয়েছে, এমন একটি নির্মাণকারীর সাথে পরামিতি লাগে:

public class MainClass
{  
    public static void main(String args[])
    {
        System.out.println("Hello, World!");
        //step1 : first create array of 10 elements that holds object addresses.
        Emp[] employees = new Emp[10];
        //step2 : now create objects in a loop.
        for(int i=0; i<employees.length; i++){
            employees[i] = new Emp(i+1);//this will call constructor.
        }
    }
}

class Emp{
    int eno;
    public Emp(int no){
        eno = no;
        System.out.println("emp constructor called..eno is.."+eno);
    }
}

3

আপনি সঠিক. এটি বাদ দিয়ে যদি আমরা কিছু "ফ্যাক্টরি" সরবরাহ করে এমন উপাদানগুলির দ্বারা পূর্ণ আকারের অ্যারে তৈরি করতে চাই, জাভা 8 (যে স্ট্রিম এপিআই প্রবর্তন করে ) আমরা এই ওয়ান-লাইনারটি ব্যবহার করতে পারি:

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
  • Stream.generate(() -> new A())ল্যাম্বদা দ্বারা বর্ণিত পদ্ধতিতে পৃথক পৃথক উপাদানগুলির জন্য কারখানার মতো () -> new A()যা বাস্তবায়ন Supplier<A>- এটি প্রতিটি নতুন এ-দৃষ্টান্ত কীভাবে তৈরি করা উচিত তা বর্ণনা করে।
  • limit(4)স্ট্রিম উত্পন্ন করবে এমন উপাদানগুলির পরিমাণ নির্ধারণ করে
  • toArray(A[]::new)(আবার এটিও আবার লেখা যেতে পারে toArray(size -> new A[size])) - এটি আমাদের / ঠিক করতে হবে যে অ্যারের প্রকারটি ফেরত দেওয়া উচিত describe

কিছু আদিম ধরনের আপনি ব্যবহার করতে পারেন জন্য DoubleStream, IntStream, LongStreamযা অতিরিক্ত মত জেনারেটর প্রদান range rangeClosedএবং অন্য কয়েকজন।


0

হ্যাঁ জাভাতে এটি সঠিক, অবজেক্টগুলির অ্যারে তৈরি করার জন্য কয়েকটি পদক্ষেপ রয়েছে:

  1. ঘোষণা এবং তারপরে ইনস্ট্যান্টিয়েটিং ('4' অবজেক্টগুলি সঞ্চয় করার জন্য মেমরি তৈরি করুন):

    A[ ] arr = new A[4];
  2. অবজেক্টস আরম্ভ করা (এক্ষেত্রে আপনি ক্লাস এ এর ​​4 টি অবজেক্ট শুরু করতে পারেন)

    arr[0] = new A();
    arr[1] = new A();
    arr[2] = new A();
    arr[3] = new A();

    অথবা

    for( int i=0; i<4; i++ )
      arr[i] = new A();

আপনি এখন সুনির্দিষ্ট যে জিনিসগুলি তৈরি করেছেন সেগুলি থেকে আপনি বিদ্যমান পদ্ধতিগুলি কল করা শুরু করতে পারেন etc.

উদাহরণ স্বরূপ:

  int x = arr[1].getNumber();

অথবা

  arr[1].setNumber(x);

0

জেনেরিক ক্লাসের জন্য একটি র‌্যাপার ক্লাস তৈরি করা দরকার। উদাহরণ স্বরূপ:

Set<String>[] sets = new HashSet<>[10]

ফলাফলগুলিতে: "জেনেরিক অ্যারে তৈরি করা যায় না"

পরিবর্তে ব্যবহার করুন:

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];  

এই লাইনের অর্থ কী, আপনি সেটের একটি অ্যারে তৈরি করার চেষ্টা করছেন, যেখানে সেট টাইপ স্ট্রিং?
sofs1

0

জাভাতে একটি নতুন অ্যারে ঘোষণা করার জেনারাল ফর্মটি নীচে রয়েছে:

type arrayName[] = new type[numberOfElements];

যেখানে প্রকারটি একটি আদিম প্রকার বা অবজেক্ট। numberOfElementsঅ্যারেতে আপনি যে পরিমাণ উপাদান সংরক্ষণ করবেন এবং এটি মান পরিবর্তন করতে পারে না কারণ জাভা গতিশীল অ্যারে সমর্থন করে না (যদি আপনার জাভা সংগ্রহগুলির কিছু ব্যবহার করতে পারেন তবে অবজেক্টগুলি ধারণ করার জন্য যদি আপনার নমনীয় এবং গতিশীল কাঠামোর প্রয়োজন হয়)।

5 জন লোকের একটি ছোট সংস্থায় সমস্ত কর্মচারীদের বেতন সঞ্চয় করতে একটি অ্যারে শুরু করতে দেয়:

int salaries[] = new int[5];

অ্যারের ধরণ (এই ক্ষেত্রে int) অ্যারের সমস্ত মানের ক্ষেত্রে প্রযোজ্য। আপনি এক অ্যারে মধ্যে মিশ্রিত করতে পারবেন না।

এখন যেহেতু আমাদের বেতন অ্যারে শুরু হয়েছে আমরা এর মধ্যে কিছু মান রাখতে চাই। আমরা আরম্ভের সময় এটির মতোই এটি করতে পারি:

int salaries[] = {50000, 75340, 110500, 98270, 39400};

অথবা এটি পরবর্তী সময়ে এটি করার জন্য:

salaries[0] = 50000;
salaries[1] = 75340;
salaries[2] = 110500;
salaries[3] = 98270;
salaries[4] = 39400;

অ্যারে তৈরির আরও ভিজ্যুয়াল উদাহরণ: এখানে চিত্র বর্ণনা লিখুন

অ্যারে সম্পর্কে আরও জানতে, গাইডটি দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.