जावा में एरेज़ लंबाई में तय की जाती हैं। जावा आकार 0 के सरणियों की अनुमति क्यों देता है?
String[] strings = new String[0];
जवाबों:
यह दर्शाता है कि यह खाली है। यानी आप इसके ऊपर लूप कर सकते हैं जैसे कि इसमें आइटम थे और कोई परिणाम नहीं हुआ:
for(int k = 0; k < strings.length; k++){
// something
}
जिससे जाँच करने की आवश्यकता नहीं है। यदि विचाराधीन सरणी थी null, तो एक अपवाद होगा, लेकिन इस मामले में यह कुछ भी नहीं करता है, जो उचित हो सकता है।
जावा आकार 1 के सरणियों की अनुमति क्यों देता है? क्या किसी सरणी में एकल मान को लपेटना बहुत बेकार नहीं है? क्या यह पर्याप्त नहीं होगा यदि जावा केवल 2 या उससे अधिक आकार के सरणियों की अनुमति देता है?
हां, हम nullखाली सरणी और एकल ऑब्जेक्ट या आदिम के बजाय आकार-एक-मैट्रिक्स के बजाय पास कर सकते हैं ।
लेकिन इस तरह के प्रतिबंध के खिलाफ कुछ अच्छे तर्क हैं। मेरे व्यक्तिगत शीर्ष तर्क:
प्रतिबंध बहुत जटिल है और वास्तव में आवश्यक नहीं है
सरणियों को आकारों में सीमित करने के लिए [1..INTEGER.MAX_INT] हमें अपने कोड में बहुत सी अतिरिक्त बाउड्री चैक (कॉनड्र्स टिप्पणी से सहमत) रूपांतरण तर्क और विधि ओवरलोड को जोड़ना होगा । अनुमत सरणी आकारों से 0 (और शायद 1) को छोड़कर, लागतों को नहीं बचाता है, इसके लिए अतिरिक्त प्रयास की आवश्यकता होती है और प्रदर्शन पर नकारात्मक प्रभाव पड़ता है।
ऐरे मॉडल वेक्टर
एक सरणी एक वेक्टर के लिए एक अच्छा डेटा मॉडल है (गणित, नहींVector वर्ग!)। और हां, गणित में एक वेक्टर शून्य आयामी हो सकता है। जो वैचारिक रूप से अस्तित्वहीन होने से अलग है।
सिडेनोट - एक (चार) सरणी के लिए एक प्रमुख आवरण Stringवर्ग है। अपरिवर्तनीय Stringखाली सरणी की अवधारणा को भौतिक बनाता है : यह खाली स्ट्रिंग ( "") है।
>= 0करने के लिए > 0)। लेकिन आप निश्चित रूप से बाकी के बारे में सही हैं, इसलिए इस प्रतिबंध को जोड़ना सार्थक नहीं होगा।
कभी-कभी शून्य की तुलना में शून्य आकार के सरणी को वापस करने के लिए यह अधिक अनुकूल है।
इस पर विचार करें (नून के उत्तर की अधिक विस्तृत व्याख्या):
public String[] getStrings() {
if( foo ) {
return null;
} else {
return new String[] {"bar, "baz"};
}
}
String[] strings = getStrings();
if (strings != null) {
for (String s : strings) {
blah(s);
}
}
अब इसकी तुलना इस से करें:
public String[] getStrings() {
if( foo ) {
return new String[0];
} else {
return new String[] {"bar, "baz"};
}
}
// the if block is not necessary anymore
String[] strings = getStrings();
for (String s : strings) {
blah(s);
}
यह (शून्य मानों के बजाय खाली सरणियों को लौटाना), वास्तव में जावा एपीआई डिजाइन की दुनिया में सबसे अच्छा अभ्यास है।
इसके अलावा, जावा में, आप सरणियों के लिए सूचियाँ (जैसे ArrayList) को गुप्त कर सकते हैं और यह केवल खाली सूची को एक खाली सरणी में बदलने के लिए समझ में आता है।
C ++ के समान, यह कोई डेटा न होने पर क्लीनर से निपटने की अनुमति देता है।
एक और मामला जहां एक शून्य लंबाई सरणी उपयोगी हो सकती है: किसी सूची में सभी तत्वों से युक्त सरणी वापस करने के लिए:
<T> T[ ] toArray(T[ ] a)
इस पद्धति में सरणी के प्रकार को पास करने के लिए एक शून्य लंबाई सरणी का उपयोग किया जा सकता है। उदाहरण के लिए:
ClassA[ ] result = list.toArray(new ClassA[0]);
शून्य लंबाई सरणी अभी भी ऑब्जेक्ट का एक उदाहरण है जो शून्य तत्व रखता है।
एक मामला मैं सोच सकता हूं कि एक खाली सरणी बेहद उपयोगी है, इसे शून्य की बजाय ऐसी स्थिति में उपयोग करना है जहां शून्य की अनुमति नहीं है। इसका एक संभावित उदाहरण सरणियों का एक ब्लॉकिंग क्यू है। जब आप पढ़ने वाले पक्ष को इनपुट के अंत का संकेत देना चाहते हैं, तो आप क्या करेंगे? नल भेजने के लिए एक स्पष्ट पसंद की तरह लगता है, लेकिन बात यह है कि ब्लॉकिंग क्यू को नल स्वीकार नहीं करता है। आप अपने एरे को क्लास के अंदर " boolean last;" तरह के क्षेत्र के साथ लपेट सकते हैं , लेकिन यह ओवरकिल की तरह है। एक खाली (शून्य-आकार) सरणी भेजना सबसे उचित विकल्प की तरह लगता है।
एक अन्य मामला जब एक शून्य लंबाई सरणी उपयोगी होती है, तो दो आयामी सरणी की प्रतिलिपि बनाते समय। मैं लिख सकता हूँ:
public int[][] copyArray(int[][] array){
int[][] newArray = new int[array.length][0];
for(int i=0;i<array.length;i++){
newArray[i] = array[i];
}
return newArray;
सरणी में प्रत्येक सरणी संदर्भ को अधिलेखित किया जा रहा है, उन्हें शून्य लंबाई सरणियों के संदर्भ के रूप में प्रारंभ करना सबसे अधिक कुशल है।
एक 0-लंबाई byte[], या char[]एक खाली का प्रतिनिधित्व कर सकता है String, जो इससे अलग है null। तार (का उपयोग करने से बाइट्स, या वर्ण, सरणियों के रूप में हो रही है getBytes(), getChars()के Stringवर्ग आदि) और उपाध्यक्ष प्रतिकूल बनाने की Stringसे रों byte[], char[]काफी आम है। उदाहरण के लिए, कस्टम एन्कोडिंग के लिए, स्ट्रिंग्स के डिकोडिंग।
test(Object... objects)स्पष्ट करने के लिए भी उपयोगी है जब कोई फ़ंक्शन होता हैtest()