जावा आकार 0 के सरणियों की अनुमति क्यों देता है?


82

जावा में एरेज़ लंबाई में तय की जाती हैं। जावा आकार 0 के सरणियों की अनुमति क्यों देता है?

String[] strings = new String[0];

जवाबों:


122

यह दर्शाता है कि यह खाली है। यानी आप इसके ऊपर लूप कर सकते हैं जैसे कि इसमें आइटम थे और कोई परिणाम नहीं हुआ:

for(int k = 0; k < strings.length; k++){
   // something
}

जिससे जाँच करने की आवश्यकता नहीं है। यदि विचाराधीन सरणी थी null, तो एक अपवाद होगा, लेकिन इस मामले में यह कुछ भी नहीं करता है, जो उचित हो सकता है।


9
यह एक फ़ंक्शन को test(Object... objects)स्पष्ट करने के लिए भी उपयोगी है जब कोई फ़ंक्शन होता हैtest()
फ्रिटजॉफ

51

जावा आकार 1 के सरणियों की अनुमति क्यों देता है? क्या किसी सरणी में एकल मान को लपेटना बहुत बेकार नहीं है? क्या यह पर्याप्त नहीं होगा यदि जावा केवल 2 या उससे अधिक आकार के सरणियों की अनुमति देता है?

हां, हम nullखाली सरणी और एकल ऑब्जेक्ट या आदिम के बजाय आकार-एक-मैट्रिक्स के बजाय पास कर सकते हैं ।

लेकिन इस तरह के प्रतिबंध के खिलाफ कुछ अच्छे तर्क हैं। मेरे व्यक्तिगत शीर्ष तर्क:

प्रतिबंध बहुत जटिल है और वास्तव में आवश्यक नहीं है

सरणियों को आकारों में सीमित करने के लिए [1..INTEGER.MAX_INT] हमें अपने कोड में बहुत सी अतिरिक्त बाउड्री चैक (कॉनड्र्स टिप्पणी से सहमत) रूपांतरण तर्क और विधि ओवरलोड को जोड़ना होगा । अनुमत सरणी आकारों से 0 (और शायद 1) को छोड़कर, लागतों को नहीं बचाता है, इसके लिए अतिरिक्त प्रयास की आवश्यकता होती है और प्रदर्शन पर नकारात्मक प्रभाव पड़ता है।

ऐरे मॉडल वेक्टर

एक सरणी एक वेक्टर के लिए एक अच्छा डेटा मॉडल है (गणित, नहींVector वर्ग!)। और हां, गणित में एक वेक्टर शून्य आयामी हो सकता है। जो वैचारिक रूप से अस्तित्वहीन होने से अलग है।


सिडेनोट - एक (चार) सरणी के लिए एक प्रमुख आवरण Stringवर्ग है। अपरिवर्तनीय Stringखाली सरणी की अवधारणा को भौतिक बनाता है : यह खाली स्ट्रिंग ( "") है।


2
मुझे आपके प्रतिबंध तर्क पर विश्वास नहीं है। जावा (उदाहरण सी के विपरीत) पहले से ही नकारात्मक संख्याओं के लिए एक जांच की आवश्यकता है। यह चेक तुच्छता 0 समायोजित करने के लिए (बस बदलने अनुकूलित किया जा सकता >= 0करने के लिए > 0)। लेकिन आप निश्चित रूप से बाकी के बारे में सही हैं, इसलिए इस प्रतिबंध को जोड़ना सार्थक नहीं होगा।
कोनराड रूडोल्फ

मेरे विचार में लूप पुनरावृत्ति तर्क बेहतर लगता है: "(int k = 0; k <strings.length; k ++) {// कुछ}" के लिए
dannyxyz22

2
नहीं, यह मेरी राय में नहीं है , क्योंकि शून्य-आकार के सरणियों के बिना एक दुनिया में, खाली तार (चार सरणियों के आधार पर) बस मौजूद नहीं होंगे और इसलिए छोरों में खाली सरणियों पर विचार करने की कोई आवश्यकता नहीं होगी। यह पुनरावृत्ति तर्क एक बहुत ही व्यावहारिक पक्ष प्रभाव है। उस दुनिया में, एक सरणी में न्यूनतम एक प्रविष्टि होगी। (या दो क्योंकि: क्यों सिर्फ एक आइटम के लिए एक सरणी की आवश्यकता होगी?)
एंड्रियास डॉक

एक नकारात्मक सूचकांक और बहुत अधिक सूचकांक के लिए जांच समान हैं: नकारात्मक सूचकांक हमेशा अहस्ताक्षरित होते हैं-सरणी की लंबाई से कम नहीं
हेरोल्ड

26

कभी-कभी शून्य की तुलना में शून्य आकार के सरणी को वापस करने के लिए यह अधिक अनुकूल है।


9
इसे "नल ऑब्जेक्ट" पैटर्न कहा जाता है।
Aleksandr Dubinsky

16

इस पर विचार करें (नून के उत्तर की अधिक विस्तृत व्याख्या):

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) को गुप्त कर सकते हैं और यह केवल खाली सूची को एक खाली सरणी में बदलने के लिए समझ में आता है।



4

एक और मामला जहां एक शून्य लंबाई सरणी उपयोगी हो सकती है: किसी सूची में सभी तत्वों से युक्त सरणी वापस करने के लिए:

<T> T[ ] toArray(T[ ] a)

इस पद्धति में सरणी के प्रकार को पास करने के लिए एक शून्य लंबाई सरणी का उपयोग किया जा सकता है। उदाहरण के लिए:

ClassA[ ] result = list.toArray(new ClassA[0]);

शून्य लंबाई सरणी अभी भी ऑब्जेक्ट का एक उदाहरण है जो शून्य तत्व रखता है।


2

एक मामला मैं सोच सकता हूं कि एक खाली सरणी बेहद उपयोगी है, इसे शून्य की बजाय ऐसी स्थिति में उपयोग करना है जहां शून्य की अनुमति नहीं है। इसका एक संभावित उदाहरण सरणियों का एक ब्लॉकिंग क्यू है। जब आप पढ़ने वाले पक्ष को इनपुट के अंत का संकेत देना चाहते हैं, तो आप क्या करेंगे? नल भेजने के लिए एक स्पष्ट पसंद की तरह लगता है, लेकिन बात यह है कि ब्लॉकिंग क्यू को नल स्वीकार नहीं करता है। आप अपने एरे को क्लास के अंदर " boolean last;" तरह के क्षेत्र के साथ लपेट सकते हैं , लेकिन यह ओवरकिल की तरह है। एक खाली (शून्य-आकार) सरणी भेजना सबसे उचित विकल्प की तरह लगता है।


0

एक अन्य मामला जब एक शून्य लंबाई सरणी उपयोगी होती है, तो दो आयामी सरणी की प्रतिलिपि बनाते समय। मैं लिख सकता हूँ:

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

एक 0-लंबाई byte[], या char[]एक खाली का प्रतिनिधित्व कर सकता है String, जो इससे अलग है null। तार (का उपयोग करने से बाइट्स, या वर्ण, सरणियों के रूप में हो रही है getBytes(), getChars()के Stringवर्ग आदि) और उपाध्यक्ष प्रतिकूल बनाने की Stringसे रों byte[], char[]काफी आम है। उदाहरण के लिए, कस्टम एन्कोडिंग के लिए, स्ट्रिंग्स के डिकोडिंग।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.