আমাদের কাছে একটি গুণ হিসাবে একটি অ্যারের দৈর্ঘ্য কেন আছে array.length, এবং স্ট্রিংয়ের জন্য আমাদের একটি পদ্ধতি রয়েছে , str.length()?
কিছু কারণ আছে?
আমাদের কাছে একটি গুণ হিসাবে একটি অ্যারের দৈর্ঘ্য কেন আছে array.length, এবং স্ট্রিংয়ের জন্য আমাদের একটি পদ্ধতি রয়েছে , str.length()?
কিছু কারণ আছে?
উত্তর:
প্রথমে একই উদ্দেশ্যে তিনটি ভিন্ন উপায় হাইলাইট করি।
length- অ্যারে ( int[], double[], String[]) - অ্যারে দৈর্ঘ্যের জানতে
length()- স্ট্রিং সম্পর্কিত অবজেক্ট ( String, StringBuilderইত্যাদি) - স্ট্রিংয়ের দৈর্ঘ্য জানতে
size()- সংগ্রহের অবজেক্ট ( ArrayList, Setইত্যাদি) - সংগ্রহের আকার জানতে
এখন কথা ভুলে যান length()মাত্র বিবেচনা lengthএবং size()।
lengthকোনও পদ্ধতি নয়, সুতরাং এটি পুরোপুরি বোঝা যায় যে এটি কোনও বস্তুগুলিতে কাজ করবে না। এটি কেবল অ্যারেগুলিতে কাজ করে।
size()এর নামটি এটি আরও ভালভাবে বর্ণনা করে এবং এটি একটি পদ্ধতি হিসাবে, আমি যেমন এখানে বলেছি ঠিক তেমনি সংগ্রহগুলি (সংগ্রহ ফ্রেমওয়ার্ক) দিয়ে কাজ করে এমন বস্তুর ক্ষেত্রে এটি ব্যবহৃত হবে।
এখন আসুন length():
স্ট্রিং কোনও আদিম অ্যারে নয় (সুতরাং আমরা ব্যবহার করতে পারি না .length) এবং সংগ্রহও নয় (তাই আমরা ব্যবহার করতে পারি না .size()) এজন্য আমাদেরও আলাদা প্রয়োজন যা length()(পার্থক্য রাখুন এবং উদ্দেশ্যটি পরিবেশন করুন)।
উত্তর হিসাবে কেন?
আমি এটি দরকারী, মনে রাখা সহজ এবং ব্যবহার এবং বন্ধুত্বপূর্ণ মনে করি।
কিছুটা সরলীকৃত আপনি এ্যারিকে একটি বিশেষ কেস হিসাবে বিবেচনা করতে পারেন এবং সাধারণ শ্রেণি নয় (কিছুটা আদিমদের মতো, তবে নয়)। স্ট্রিং এবং সমস্ত সংগ্রহগুলি ক্লাস, সুতরাং আকার, দৈর্ঘ্য বা অনুরূপ জিনিসগুলি পাওয়ার পদ্ধতিগুলি।
আমার মনে হয় ডিজাইনের সময়টির কারণ ছিল পারফরম্যান্স। যদি তারা আজ এটি তৈরি করে থাকে তবে সম্ভবত তারা পরিবর্তে অ্যারে-ব্যাকড সংগ্রহের ক্লাসের মতো কিছু নিয়ে এসেছিল।
যদি কেউ আগ্রহী হন তবে উত্পন্ন কোডের মধ্যে দুটিটির মধ্যে পার্থক্য বোঝানোর জন্য কোডের একটি ছোট স্নিপেট এখানে প্রথম উত্স:
public class LengthTest {
public static void main(String[] args) {
int[] array = {12,1,4};
String string = "Hoo";
System.out.println(array.length);
System.out.println(string.length());
}
}
বাইট কোডের এত গুরুত্বপূর্ণ অংশ নয় এমন কোনও উপায় কাটা, javap -cক্লাসে চালানো শেষ দুটি লাইনের জন্য ফলাফল:
20: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
23: aload_1
24: arraylength
25: invokevirtual #4; //Method java/io/PrintStream.println:(I)V
28: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
31: aload_2
32: invokevirtual #5; //Method java/lang/String.length:()I
35: invokevirtual #4; //Method java/io/PrintStream.println:(I)V
প্রথম ক্ষেত্রে (20-25) কোডটি ঠিক JVM কে অ্যারের আকারের জন্য জিজ্ঞাসা করে (জেএনআইতে এটি getArrayLength ()) এ কল হত যেখানে স্ট্রিংয়ের ক্ষেত্রে (২৮-৩৫) এটি করা দরকার দৈর্ঘ্য পেতে পদ্ধতি কল।
১৯৯০ এর দশকের মাঝামাঝি সময়ে, ভাল জেআইটি এবং স্টাফ ছাড়াই, এটি কেবল জাভা.ইউটি.ভেক্টর (বা অনুরূপ কিছু) তৈরি করতে পারফরম্যান্সকে পুরোপুরি মেরে ফেলত এবং এমন কোনও ভাষা নির্মাণ নয় যা সত্যই শ্রেণীর মতো আচরণ করে না তবে দ্রুত ছিল। তারা অবশ্যই সম্পত্তি কলটি হিসাবে একটি মেথড কল হিসাবে এটি মাস্ক করে এটি সংকলকটিতে পরিচালনা করতে পারে তবে আমি মনে করি যে এমন কোনও বিষয় যা সত্যিকারের বর্গ নয় এমনটি করার জন্য এটি আরও বিভ্রান্তিকর হত।
Vectorজাভা ভাষার কোনও অ্যারে সমর্থন না থাকলে আপনি কীভাবে বাস্তবায়ন করবেন ?
বিবেচনা:
int[] myArray = new int[10];
String myString = "hello world!";
List<int> myList = new ArrayList<int>();
myArray.length // Gives the length of the array
myString.length() // Gives the length of the string
myList.size() // Gives the length of the list
এটি খুব সম্ভবত যে স্ট্রিং এবং অ্যারেগুলি বিভিন্ন সময়ে ডিজাইন করা হয়েছিল এবং তাই বিভিন্ন কনভেনশন ব্যবহার করে শেষ হয়েছিল। একটি সমর্থনযোগ্যতা হ'ল স্ট্রিংস যেহেতু অভ্যন্তরীণভাবে অ্যারেগুলি ব্যবহার করে, length()একই তথ্যের নকল এড়াতে একটি পদ্ধতি ব্যবহৃত হয়েছিল। আর একটি হ'ল একটি পদ্ধতি ব্যবহার length()করে স্ট্রিংগুলির অপরিবর্তনীয়তার উপর জোর দেওয়া যায়, যদিও অ্যারের আকারও অপরিবর্তনীয়।
পরিণামে এটি কেবলমাত্র একটি অসঙ্গতি যা বিকশিত হয়েছিল যা অবশ্যই ভাষাটিকে স্থলভাগ থেকে নতুনভাবে ডিজাইন করা হলে স্থির হবে। যতদূর আমি জানি অন্য কোনও ভাষা (সি #, পাইথন, স্কেলা ইত্যাদি) একই কাজ করে না, তাই সম্ভবত এটি একটি সামান্য ত্রুটি যা ভাষার অংশ হিসাবে শেষ হয়েছিল।
আপনি যদি কোনওভাবে ভুলটি ব্যবহার করেন তবে আপনি একটি ত্রুটি পাবেন।
জাভাতে, একটি অ্যারে প্রকৃতপক্ষে ডেটা ধারণ করে এমন কাঠামোর থেকে পৃথকভাবে তার দৈর্ঘ্য সঞ্চয় করে। আপনি যখন একটি অ্যারে তৈরি করবেন, আপনি এর দৈর্ঘ্য নির্দিষ্ট করুন এবং এটি অ্যারের একটি নির্ধারিত বৈশিষ্ট্য হয়ে উঠবে। আপনি দৈর্ঘ্যের N এর অ্যারে (মানগুলি পরিবর্তন করুন, নাল জিনিস আউট ইত্যাদি) কী করেন না কেন এটি সর্বদা N দৈর্ঘ্যের অ্যারে থাকবে be
একটি স্ট্রিংয়ের দৈর্ঘ্য ঘটনাগত; এটি স্ট্রিংয়ের কোনও বৈশিষ্ট্য নয়, তবে একটি উপজাত। যদিও জাভা স্ট্রিংগুলি বাস্তবে অপরিবর্তনীয়, যদি তাদের বিষয়বস্তুগুলি পরিবর্তন করা সম্ভব হয় তবে আপনি তাদের দৈর্ঘ্য পরিবর্তন করতে পারেন। শেষ চরিত্রটি ছুঁড়ে ফেলা (যদি এটি সম্ভব হত) দৈর্ঘ্য কমবে।
আমি বুঝতে পারি এটি একটি দুর্দান্ত পার্থক্য, এবং আমি এটির পক্ষে ভোট পেতে পারি, তবে এটি সত্য। আমি যদি দৈর্ঘ্যের 4 টি অ্যারে করি তবে চারটির দৈর্ঘ্যটি অ্যারের একটি নির্ধারিত বৈশিষ্ট্য এবং এটি যা নির্ধারিত তা নির্বিশেষে সত্য। যদি আমি একটি স্ট্রিং তৈরি করি যাতে "কুকুর" রয়েছে, তবে স্ট্রিংটির দৈর্ঘ্য 4 কারণ এটিতে চারটি অক্ষর রয়েছে।
আমি এটিকে একটি বৈশিষ্ট্যের সাথে অন্যটি একটি পদ্ধতিতে করার ন্যায়সঙ্গত হিসাবে দেখছি। সত্যিকার অর্থে, এটি কেবল একটি অনিচ্ছাকৃত অসঙ্গতি হতে পারে তবে এটি আমার কাছে সর্বদা বোধগম্য এবং আমি সবসময়ই এটি সম্পর্কে চিন্তাভাবনা করেছি।
আমাকে শিখানো হয়েছিল যে নিম্নলিখিত ভয়ের কারণে কোনও পদ্ধতির মাধ্যমে দৈর্ঘ্য পুনরুদ্ধার করা হয় না: প্রোগ্রামাররা একটি লুপে প্রবেশের আগে কেবল স্থানীয় ভেরিয়েবলের দৈর্ঘ্য নির্ধারণ করত (শর্তসাপেক্ষে অ্যারের দৈর্ঘ্যটি ব্যবহার করে এমন একটি লুপের জন্য চিন্তা করুন।) প্রোগ্রামার অনুমিতভাবে ফাংশন কলগুলিতে ছাঁটাই করার জন্য এটি করা হবে (এবং এর ফলে কর্মক্ষমতা উন্নত হবে)) সমস্যাটি হ'ল লুপের সময় দৈর্ঘ্যটি পরিবর্তিত হতে পারে এবং ভেরিয়েবলটি এটি পরিবর্তন করে না।
যখনই একটি অ্যারে তৈরি করা হয়, এর আকার নির্দিষ্ট করা হয়। সুতরাং দৈর্ঘ্য একটি নির্মাণ বৈশিষ্ট্য হিসাবে বিবেচনা করা যেতে পারে। স্ট্রিংয়ের জন্য এটি মূলত চার অ্যারে। দৈর্ঘ্যটি চরের অ্যারের সম্পত্তি। ক্ষেত্র হিসাবে দৈর্ঘ্য স্থাপন করার দরকার নেই, কারণ এই ক্ষেত্রের জন্য প্রতিটি কিছুরই প্রয়োজন হয় না। http://www.programcreek.com/2013/11/start-from-leth-leight-in-java/
আমি শুধু মহান কিছু মন্তব্য যুক্ত করতে চান উত্তর দ্বারা ফ্রেডরিক ।
বিভাগের 4.3.1 জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন রাজ্যের
একটি বস্তু একটি শ্রেণীর উদাহরণ বা একটি অ্যারে ।
সুতরাং অ্যারে সত্যিই জাভা মধ্যে একটি বিশেষ ভূমিকা আছে। আমি ভাবছি কেন।
যে কেউ তর্ক করতে পারে যে বর্তমান বাস্তবায়ন অ্যারে / আরও ভাল পারফরম্যান্সের জন্য গুরুত্বপূর্ণ was তবে এটির চেয়ে একটি অভ্যন্তরীণ কাঠামো, যা প্রকাশ করা উচিত নয়।
তারা অবশ্যই সম্পত্তি কলটি হিসাবে একটি মেথড কল হিসাবে এটি মাস্ক করে এটি সংকলকটিতে পরিচালনা করতে পারে তবে আমি মনে করি যে এমন কোনও বিষয় যা সত্যিকারের বর্গ নয় এমনটি করার জন্য এটি আরও বিভ্রান্তিকর হত।
আমি ফ্রেড্রিকের সাথে একমত, একটি স্মার্ট সংকলক অপটিম্যাজেশন আরও ভাল পছন্দ হতে পারে। এটি সমস্যারও সমাধান করবে, এমনকি যদি আপনি অ্যারেগুলির জন্য কোনও সম্পত্তি ব্যবহার করেন, আপনি স্ট্রিং এবং অন্যান্য (অপরিবর্তনীয়) সংগ্রহের ধরণের জন্য সমস্যাটি সমাধান করেন নি, কারণ, উদাহরণস্বরূপ, অ্যারের stringউপর ভিত্তি করে charআপনি শ্রেণীর সংজ্ঞাটি দেখতে পাচ্ছেন এর String:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[]; // ...
এবং আমি এটির সাথে একমত নই যে এটি আরও বিভ্রান্তিকর হবে, কারণ অ্যারে থেকে সমস্ত পদ্ধতিjava.lang.Object উত্তরাধিকার সূত্রে প্রাপ্ত ।
ইঞ্জিনিয়ার হিসাবে আমার উত্তরটি সত্যই পছন্দ হয় না "কারণ এটি সর্বদা এইভাবেই ছিল।" এবং আশা করি এর থেকে আরও ভাল উত্তর হবে। তবে এক্ষেত্রে তা মনে হয়।
tl; ডা
আমার মতে এটি জাভার ডিজাইনের ত্রুটি এবং এটি এভাবে প্রয়োগ করা উচিত হয়নি।