অ্যারের দৈর্ঘ্যের সম্পত্তি কোথায় সংজ্ঞায়িত করা হয়?


263

আমরা একটি দৈর্ঘ্য নির্ধারণ করতে পারেন ArrayList<E>সর্বজনীন পদ্ধতি ব্যবহার করে size()মত,

ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();

একইভাবে আমরা সম্পত্তি Arrayব্যবহার করে কোনও বস্তুর দৈর্ঘ্য নির্ধারণ করতে পারিlength

String[] str = new String[10];
int size =  str.length;

যেখানে size()পদ্ধতি ArrayListভিতরে সংজ্ঞায়িত করা হয় ArrayListবর্গ, এই হল যেখানে lengthসম্পত্তির Arrayসংজ্ঞায়িত?


প্রশ্ন সংস্থার ক্ষেত্রে, আমি আপনার প্রশ্নটি রাখার পরামর্শ দেব "অ্যারের দৈর্ঘ্যের সম্পত্তিটি কোথায় সংজ্ঞায়িত করা হয়েছে?" আপনার পোস্টটি কোনও শিক্ষানবিসের টিউটোরিয়ালের মতো শোনাতে বাধা দেওয়ার জন্য সমস্ত ব্যাখ্যা দেওয়ার আগে।
NoName

উত্তর:


250

অ্যারেগুলির জাভা বিশেষ বস্তু, তারা নামে একটি সহজ অ্যাট্রিবিউট আছে lengthযার final

অ্যারের কোনও "শ্রেণি সংজ্ঞা" নেই (আপনি এটি কোনও। ক্লাস ফাইলে খুঁজে পাচ্ছেন না), তারা নিজেরাই ভাষার একটি অংশ।

10.7। অ্যারে সদস্যরা

একটি অ্যারের ধরণের সদস্যরা নিম্নলিখিত সমস্ত:

  • public finalক্ষেত্র length, যা অ্যারের উপাদান সংখ্যা উপস্থিত রয়েছে। lengthধনাত্মক বা শূন্য হতে পারে।
  • publicপদ্ধতি clone, কোন ক্লাশে একই নামের পদ্ধতি ওভাররাইড করে Objectএবং ছোঁড়ার কোন ব্যতিক্রম চেক। এর রিটার্ন টাইপ cloneএকটি অ্যারের ধরনের পদ্ধতি T[]রয়েছে T[]

    একটি বহুমাত্রিক অ্যারের ক্লোনটি অগভীর, যা বলে যে এটি কেবলমাত্র একটি নতুন অ্যারে তৈরি করে। সুবারে ভাগ করা আছে।

  • শ্রেণী থেকে উত্তরাধিকারসূত্রে প্রাপ্ত সমস্ত সদস্য Object; যে একমাত্র পদ্ধতি Objectউত্তরাধিকারসূত্রে হয় না হয় তার cloneপদ্ধতি।

সম্পদ:


84
নোটটি যে ArrayList.size()অ্যারেতে প্রকৃতপক্ষে অবজেক্টের সংখ্যা সরবরাহ করে সেখানে myArray.length( []) "ক্ষমতা" সরবরাহ করে। এটি যদি এর জন্য হয় তবে myArray = new int[10];এটি ১০ টি করে দেয় It এটি অ্যারেতে রাখা বস্তুর সংখ্যা নয়।
wmorrison365

1
@ কলিন কীভাবে অ্যারে অবজেক্টগুলি এত বিশেষ? আমি কেন ডিজাইনারদের এটিকে বিশেষ করে তৈরি করতে হবে এবং কেন একটি অ্যারের শ্রেণি ফাইল সরবরাহ করবে না?
বিকাশ ভার্মা

5
@ ভিকাস ভার্মা কেন অ্যারে অবজেক্টের মতো নয়? ইতিহাসের কারণে। যখন জাভাটি তৈরি করা হয়েছিল, তখন ভাষা উদ্ভাবনের বেশিরভাগ প্রচেষ্টা ব্যর্থ হয়েছিল যখন বাক্য গঠন এবং শৈলীতে সি এর মতো নয়। সুতরাং সি ++, অবজেক্টিভ-সি এবং জাভা সেই যুগে অস্পষ্টতা থেকে বাঁচার কয়েকটি ভাষার মধ্যে ছিল। জাভা সচেতনভাবে কোঁকড়া ধনুর্বন্ধনী, আদিম এবং সেদিনের মূলধারার প্রোগ্রামারগুলির সাথে পরিচিত হওয়ার জন্য সরল অ্যারেগুলি অন্তর্ভুক্ত করার জন্য ডিজাইন করা হয়েছিল । জেমস গোসলিং এবং অন্যান্য সান লোকদের সাথে সাক্ষাত্কার দেখুন। কিছু লোক খাঁটি ওওপি-র জন্য সংগ্রহে আটকে থাকে এবং সরল অ্যারেগুলি এড়ায়।
তুলিল বাউরক

1
@ ভিকাস ভার্মা, এক পর্যায়ে জাভা অবশ্যই নিম্ন স্তরের প্রযুক্তিতে তৈরি করা উচিত। জাভা যদি না থাকে তবে আপনি এটি জাভা দিয়ে তৈরি করতে পারবেন না। আপনার নিজের অস্তিত্বের প্রসঙ্গ থাকতে বাকী জাভাটির জন্য কিছু প্রাথমিক সংকলন তৈরি করতে আপনাকে সি ++ (বা অন্য কিছু, তবে এই ক্ষেত্রে সি ++) ব্যবহার করতে হবে। আপনি সি ++ তে কোড করে যেখানে অবশেষে রক বটমাকে আঘাত না করে আপনার কাছে প্রতিটি কিছুর ক্লাস থাকতে পারে না। আপনি ঠিক কীভাবে জাভাতে অ্যারে তৈরি করবেন? যদি আপনি এটি ব্যবহার করতে না পারেন Listকারণ এটি তাদের প্রয়োগে অ্যারে ব্যবহার করে।
আলেকজান্ডার বার্ড

যদি আপনি এটির মতো উত্তর দিতে চান তবে stackoverflow.com/a/50506451/1059372
ইউজিন

114

এটি হবে "বিশেষ" এর মূলত নিজস্ব বাইটকোড নির্দেশ সাথে arraylength। সুতরাং এই পদ্ধতি:

public static void main(String[] args) {
    int x = args.length;
}

এটি বাইকোডে এভাবে সংকলিত হয়েছে:

public static void main(java.lang.String[]);
  Code:
   0:   aload_0
   1:   arraylength
   2:   istore_1
   3:   return

সুতরাং এটি অ্যাক্সেস করা হয়নি যেমন এটি কোনও সাধারণ ক্ষেত্র। প্রকৃতপক্ষে, আপনি যদি এটির মতো করার চেষ্টা করেন তবে এটি সাধারণ ক্ষেত্রের মতো, এটি ব্যর্থ হয়:

// Fails...
Field field = args.getClass().getField("length");
System.out.println(field.get(args));

সুতরাং দুর্ভাগ্যক্রমে, সরকারী চূড়ান্ত ক্ষেত্র থাকা প্রতিটি অ্যারের প্রকারের জেএলএসের বর্ণনা lengthকিছুটা বিভ্রান্তিকর :(


1
আলবার্ট আইনস্টাইনের ঠিক উক্তিটি আমার মনে নেই তবে এটি যা বলেছে তা হ'ল "জনগণ একটি বিষয় খুব ভালভাবে বুঝতে পারে কেবল বিষয়গুলি খুব সহজ উপায়ে ব্যাখ্যা করতে পারে" আমার মনে হয় এটি আপনার পক্ষে খুব উপযুক্ত
its

@ জোন স্কিটে অ্যারে অবজেক্টটি কীভাবে বিশেষ, তার অর্থ ডিজাইনারদের কেন এটি বিশেষ করা দরকার এবং কেন একটি অ্যারের ক্লাস ফাইল সরবরাহ করা হয় না?
বিকাশ ভার্মা

2
@ ভিকাস ভার্মা: একটি অ্যারে অবজেক্টের আকার সম্পর্কে চিন্তা করুন। অন্যান্য সমস্ত ধরণের একটি নির্দিষ্ট আকার থাকে - প্রতিটি উদাহরণ একই আকার, যেখানে অ্যারেগুলি তাদের দৈর্ঘ্যের উপর নির্ভর করে পরিবর্তিত হয়। এটি কেবল একটি উদাহরণ। যদি আপনি ভাবেন যে কোনও বিশেষ ব্যবহার না করেই আপনি একই ফলাফল অর্জন করতে পারেন তবে আপনি কী মনে করেন কোন অ্যারে শ্রেণীর ক্ষেত্রগুলি দেখতে কেমন হবে? int[]জেনেরিকগুলি আদিম ধরণের ক্ষেত্রে প্রয়োগ না করে আপনি কীভাবে প্রতিনিধিত্ব করবেন? (এবং হেক, জেনেরিকগুলি যে কোনওভাবেই দীর্ঘ সময়ের জন্য বিদ্যমান ছিল না)) আপনি সমস্ত সংগ্রহের জন্য লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করে অ্যারে ছাড়াই পলায়ন করতে পারেন, তবে দক্ষতার জন্য এটি ভয়াবহ হবে।
জন স্কেটি

@ জোনস্কিট তবে স্ট্রিংবাফার ক্লাসের ধরণের কী রয়েছে তার নির্দিষ্ট আকার আছে? হ্যাঁ আমি জেনেরিক সম্পর্কে ভাবছিলাম কিন্তু আপনি এটির জন্য ধন্যবাদ জিজ্ঞাসা করার আগে আপনি এটি নির্দেশ করেছিলেন।
বিকাশ ভার্মা

@ ভিকাস ভার্মা: StringBufferক্লাস নিজেই করে, হ্যাঁ - কারণ এটি কোনওটির একটি রেফারেন্স রাখে char[](বা কমপক্ষে; আমি এখনও জানি না যে এটি এখনও বন্ধ রয়েছে)। সুতরাং যখন StringBuilderআরও মেমরির জন্য দায়ী, এর তাত্ক্ষণিক আকার এবং বিন্যাস স্থির করা হয়েছে।
জন স্কেটি

18

এটি জাভা ভাষার নির্দিষ্টকরণে সংজ্ঞায়িত করা হয়েছে :

একটি অ্যারের ধরণের সদস্যরা নিম্নলিখিত সমস্ত:

  • public finalক্ষেত্র length, যা অ্যারের উপাদান সংখ্যা উপস্থিত রয়েছে। lengthধনাত্মক বা শূন্য হতে পারে।

যেহেতু সীমাহীন সংখ্যক অ্যারে টাইপ রয়েছে (প্রতিটি শ্রেণীর জন্য একই ধরণের অ্যারে টাইপ রয়েছে এবং তারপরে বহুমাত্রিক অ্যারে রয়েছে), সেগুলি শ্রেণিবদ্ধ ফাইলটিতে প্রয়োগ করা যায় না; JVM উড়তে এটি করতে হবে।


15

যদিও এটি প্রশ্নের সরাসরি উত্তর না হলেও এটি .lengthবনাম .size()যুক্তির একটি সংযোজন । আমি এই প্রশ্নের সাথে সম্পর্কিত কিছু গবেষণা করছিলাম তাই যখন আমি এটিটি দেখতে পেলাম তখন লক্ষ্য করেছি যে সংজ্ঞা (গুলি) এখানে সরবরাহ করা হয়েছে

সর্বজনীন চূড়ান্ত ক্ষেত্রের দৈর্ঘ্য, এতে অ্যারের উপাদানগুলির সংখ্যা রয়েছে ।

"ঠিক" সঠিক নয়।

ক্ষেত্রের দৈর্ঘ্যে কোনও উপাদান রাখার জন্য উপলব্ধ জায়গাগুলির সংখ্যা রয়েছে , অ্যারেতে উপস্থিত উপাদানগুলির সংখ্যা নয়। সুতরাং এটি সেই অ্যারেগুলিতে বরাদ্দকৃত মোট উপলব্ধ মেমরির প্রতিনিধিত্ব করে, সেই মেমরির কতটা পূরণ হয় না।

অ্যারে মেমরি বরাদ্দ

উদাহরণ:

static class StuffClass {
    int stuff;
    StuffClass(int stuff) {
        this.stuff = stuff;
    }
}

public static void main(String[] args) {

    int[] test = new int[5];
    test[0] = 2;
    test[1] = 33;
    System.out.println("Length of int[]:\t" + test.length);

    String[] test2 = new String[5];
    test2[0] = "2";
    test2[1] = "33";    
    System.out.println("Length of String[]:\t" + test2.length);

    StuffClass[] test3 = new StuffClass[5];
    test3[0] = new StuffClass(2);
    test3[1] = new StuffClass(33);
    System.out.println("Length of StuffClass[]:\t" + test3.length);         
}

আউটপুট:

Length of int[]:        5
Length of String[]:     5
Length of StuffClass[]: 5

তবে, এর .size()সম্পত্তি ArrayListতালিকার উপাদানগুলির সংখ্যা দেয়:

ArrayList<Integer> intsList = new ArrayList<Integer>();
System.out.println("List size:\t" + intsList.size());
intsList.add(2);
System.out.println("List size:\t" + intsList.size());
intsList.add(33);
System.out.println("List size:\t" + intsList.size());

আউটপুট:

List size:  0
List size:  1
List size:  2

1
এটি সঠিক, যেহেতু সমস্ত উপাদান শূন্য থেকে প্রাথমিক হয়। অ্যারেগুলির "খালি" হতে পারে না
গাইডো

ঠিক আছে আমি ঠিক তাই বলেছি। এটি "ঠিক" সঠিক নয়। অ্যারেতে কিছুই যুক্ত না হলেও এর দৈর্ঘ্য 5 এখনও রয়েছে। সুতরাং এটি অ্যারে উপাদানের সংখ্যা "হুবহু" ধারণ করে না। আপনার মন্তব্যটি আমার উত্তরের একটি সংযোজন, এটি ভুল করার কারণ নয়।
nem035

এটি "ভুল" হতে পারে যদি আপনি nullনন-নাল উপাদানগুলির মধ্যে পার্থক্য করার চেষ্টা করেন । তবে পার্থক্য কাজ করে না। সর্বোপরি, size()এর (বলুন) এর Listমধ্যে nullমানগুলিও অন্তর্ভুক্ত থাকতে পারে ।
স্টিফেন সি

হ্যাঁ, মূলত আমার বক্তব্যটি ছিল sizeগতিশীলভাবে আচরণ করে, যখন lengthএকটি স্থিতিশীল সম্পত্তি ... এ অ্যারেতে থাকা অপরিশোধিত স্থানটি " অমূল্য " (প্রকারের উপর নির্ভরশীল) এর সাথে আরম্ভ হয় তা সত্যই এই বিন্দুর বিরোধিতা করে না।
nem035

5

এটি সর্বজনীন চূড়ান্ত ক্ষেত্র, এতে অ্যারের উপাদানগুলির সংখ্যা রয়েছে (দৈর্ঘ্য ইতিবাচক বা শূন্য হতে পারে)

একটি অ্যারের এভাবে নিম্নোক্ত শ্রেণীর মতো একই পাবলিক ক্ষেত্র এবং পদ্ধতি রয়েছে:

class A implements Cloneable, java.io.Serializable {
    public final int length = X;
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e.getMessage());
        }
    }
}

আরও তথ্য

10.7 অ্যারে সদস্য

http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html


0

এটি যেমন রয়েছে তেমন উত্তর দেওয়ার জন্য, অ্যারের এই দৈর্ঘ্যের সম্পত্তিটি কোথায় সংজ্ঞাযুক্ত ? একটি বিশেষ মধ্যে Object header

JOL এর মাধ্যমে দেখতে সহজ

 int [] ints = new int[23];
 System.out.println(ClassLayout.parseInstance(ints).toPrintable());

এই আউটপুট থেকে একটি লাইন হতে চলেছে:

OFFSET  SIZE      TYPE DESCRIPTION
16       4        (object header)   17 00 00 00 (00010111 00000000 00000000 00000000) (23)

সাধারণত অবজেক্টগুলির দুটি শিরোনাম থাকে (চিহ্ন এবং ক্লাস), অ্যারেগুলির মধ্যে আরও একটি থাকে যা সর্বদা 4 bytesদৈর্ঘ্যের মধ্যে থাকে, যেমন sizeএকটি int


-1

কীওয়ার্ডের দৈর্ঘ্য কোনও সংজ্ঞায়িত ফাইলের মতো কাজ করে। একটি অ্যারে ব্যবহার করার সময়, আমরা এটি ব্যবহার করতে পারি অ্যারের মধ্যে কতগুলি উপাদান অ্যাক্সেস করতে। স্ট্রিং সম্পর্কে [], আমরা স্ট্রিং ক্লাসে সংজ্ঞায়িত দৈর্ঘ্য () পদ্ধতিটি প্রার্থনা করতে পারি। অ্যারেলিস্ট সম্পর্কিত, আমরা অ্যারেলিস্টে সংজ্ঞায়িত আকার () পদ্ধতিটি ব্যবহার করতে পারি। দ্রষ্টব্য যে অ্যারেলিস্ট <> (ক্ষমতা) দিয়ে একটি অ্যারে তালিকা তৈরি করার সময়, কোনও উপাদান নেই বলে এই অ্যারে তালিকার প্রাথমিক আকার () শূন্য।

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