2011-01-06 19 views

उत्तर

94

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

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

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

+6

यह फ़ंक्शन 'टेस्ट (ऑब्जेक्ट ... ऑब्जेक्ट्स)' को कॉल करने के लिए भी उपयोगी है, जब कोई फ़ंक्शन 'टेस्ट() ' – Frithjof

+1

@ फ़्रिथजोफ: फेसपाल्म: –

20

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

+4

इसे "शून्य ऑब्जेक्ट" पैटर्न कहा जाता है। –

5

सी ++ के समान, यह कोई डेटा नहीं होने पर क्लीनर हैंडलिंग की अनुमति देता है।

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); 
} 

यह (शून्य मान के बजाय खाली सरणियों लौटने), वास्तव में है

11

इस (दोपहर का जवाब की एक अधिक विस्तृत विवरण) पर विचार करें जावा एपीआई डिजाइन दुनिया में एक सर्वोत्तम अभ्यास।

इसके अलावा, जावा में, आप सूची में सूचियों (उदा। ऐरेलिस्ट) को गुप्त कर सकते हैं और यह केवल रिक्त सूची को रिक्त सरणी में परिवर्तित करने के लिए समझ में आता है।

47

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

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

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

प्रतिबंध भी जटिल है और वास्तव में जरूरी

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

सरणी मॉडल वेक्टर

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


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

+2

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

+0

लूप पुनरावृत्ति तर्क मेरी राय में बेहतर लगता है: "के लिए (int k = 0; k dannyxyz22

+2

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

2

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

4

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

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

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

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

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

2

केवल एक नोट:

आप कहते हैं: लेकिन सी में आप सी के लिए सरणी के आयाम ही नहीं बदल सकते, ++ 'सी है, जहां आप गतिशील रूप से, एक सरणी के आकार को बढ़ा सकते हैं .. के विपरीत "।

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; 

होने के नाते है कि सरणी में हर सरणी संदर्भ ओवरराइट किया जा रहा है, उनमें आरंभ के रूप में शून्य लंबाई सरणियों को refernces सबसे कारगर है।

संबंधित मुद्दे