जावा में किसी सरणी का डिफ़ॉल्ट इनिशियलाइज़ेशन क्या है?


144

इसलिए मैं एक इंट सरणी घोषित कर रहा हूं और शुरू कर रहा हूं:

static final int UN = 0;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
    arr[i] = UN;
}

कहो मैं इसके बजाय ऐसा करता हूं ...

int[] arr = new int[5];
System.out.println(arr[0]);

... 0मानक के लिए प्रिंट होगा। इसके अलावा, अगर मैं ऐसा करता हूं:

static final int UN = 0;
int[] arr = new int[5];
System.out.println(arr[0]==UN);

... trueमानक के लिए प्रिंट होगा। तो जावा डिफ़ॉल्ट रूप से मेरी सरणी को कैसे आरंभ कर रहा है? क्या यह मान लेना सुरक्षित है कि डिफ़ॉल्ट इनिशियलाइज़ेशन सरणी सूचकांकों को सेट कर 0रहा है, जिसका अर्थ होगा कि मुझे एरे के माध्यम से लूप नहीं करना है और इसे इनिशियलाइज़ करना है?

धन्यवाद।


जवाबों:


281

एक जावा प्रोग्राम में सब कुछ प्रोग्रामर द्वारा स्पष्ट रूप से सेट नहीं किया जाता है, इसे शून्य मान के लिए प्रारंभ किया जाता है।

  • संदर्भों के लिए (कुछ भी जो एक वस्तु रखता है) जो है null
  • इंट / शॉर्ट / बाइट / लॉन्ग के लिए जो ए 0
  • फ्लोट / डबल के लिए जो कि ए 0.0
  • बूलियन के लिए जो कि ए false
  • चार के लिए वह अशक्त वर्ण है '\u0000'(जिसका दशमलव समतुल्य 0 है)।

जब आप किसी चीज़ की एक सरणी बनाते हैं, तो सभी प्रविष्टियाँ शून्य भी होती हैं। तो आपके सरणी में इसके द्वारा बनाए जाने के ठीक बाद पाँच शून्य हैंnew

ध्यान दें (टिप्पणियों के आधार पर): जावा वर्चुअल मशीन को स्थानीय चर आवंटित करते समय अंतर्निहित मेमोरी को शून्य करने की आवश्यकता नहीं होती है (यह यदि आवश्यक हो तो कुशल स्टैक संचालन की अनुमति देता है) तो यादृच्छिक मूल्यों से बचने के लिए जावा भाषा विशिष्टता को आरंभिक रूप से स्थानीय चर की आवश्यकता होती है।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
ब्रैड लार्सन

स्थानीय चर को छोड़कर सब कुछ, जो संकलक आपको कुछ भी नहीं बताएगा।
लोर्न

@ user207421 जैसा कि उत्तर के अंत में बताया गया है।
थोरबजर्न रेवन एंडरसन

जिसका अर्थ है कि आपके उत्तर का पहला वाक्य सही नहीं है और इसमें संशोधन किया जाना चाहिए। और चैट में आपका 'आप कैसे जानते हैं' सवाल निरर्थक है। जेएलएस ऐसा कहता है, यह बात है, और कंपाइलर इसे लागू करता है, डिट्टो।
लोर्ने

@ user207421 "प्रोग्रामर द्वारा स्पष्ट रूप से कुछ करने के लिए सेट नहीं किया गया है" (जो कंपाइलर द्वारा आवश्यक हो सकता है)।
Thorbjørn रावन एंडरसन

60

से जावा भाषा विशिष्टता :

  • प्रत्येक वर्ग चर, उदाहरण चर, या सरणी घटक एक डिफ़ॉल्ट मान के साथ प्रारंभ होता है जब इसे बनाया जाता है (.915.9, variable15.10):

    • प्रकार बाइट के लिए, डिफ़ॉल्ट मान शून्य है, अर्थात, का मान (byte)0
    • छोटे प्रकार के लिए, डिफ़ॉल्ट मान शून्य है, अर्थात का मान (short)0
    • प्रकार इंट के लिए, डिफ़ॉल्ट मान शून्य है, अर्थात 0
    • प्रकार लंबे समय के लिए, डिफ़ॉल्ट मान शून्य है, अर्थात 0L
    • प्रकार फ़्लोट के लिए, डिफ़ॉल्ट मान सकारात्मक शून्य है, अर्थात 0.0f
    • टाइप डबल के लिए, डिफ़ॉल्ट मान धनात्मक शून्य है, अर्थात 0.0d
    • प्रकार चार के लिए, डिफ़ॉल्ट मान अशक्त चरित्र है, अर्थात '\u0000'
    • प्रकार बूलियन के लिए, डिफ़ॉल्ट मान है false
    • सभी संदर्भ प्रकारों (.34.3) के लिए, डिफ़ॉल्ट मान है null

2
और लांग एस और इंटेगर एस के एरे के बारे में क्या?
जॉर्जी डोबरेव

1
@GeorgyDobrev। वे संदर्भ प्रकार हैं। वे ऊपर दिए गए विनिर्देश के अनुसार अशक्त होंगे।
डेव कोस्टा

स्ट्रिंग सरणी के बारे में क्या?
Zac

1
@Zac ऊपर के समान, एक स्ट्रिंग एक वस्तु है, इसलिए सरणी में डिफ़ॉल्ट मान होगा null
डेव कोस्टा

18

जेएलएस स्पष्ट रूप से कहता है

एक सरणी आरंभीकरण एक सरणी बनाता है और इसके सभी घटकों के लिए प्रारंभिक मान प्रदान करता है।

और यह इस बात पर ध्यान दिए बिना है कि सरणी एक उदाहरण चर या स्थानीय चर या वर्ग चर है।

आदिम प्रकारों के लिए डिफ़ॉल्ट मान: डॉक्स

ऑब्जेक्ट्स के लिए डिफ़ॉल्ट मान है null


1
सवाल का जवाब नहीं देता। वह डिफ़ॉल्ट आरंभीकरण के बारे में पूछ रहा है।
लोर्ने

3

जावा के अनुसार,

डेटा प्रकार - डिफ़ॉल्ट मान

बाइट - ०

लघु - ०

int - ०

लंबा - 0 एल

फ्लोट - 0.0f

डबल - 0.0 डी

चार - '\ u0000'

स्ट्रिंग (या कोई वस्तु) - अशक्त

बूलियन - गलत


2
वह खेतों के बारे में नहीं पूछ रहा है, वह सरणी घटकों के बारे में पूछ रहा है।
लोर्ने

3
@EJP u कृपया विस्तृत कर सकते हैं कि सरणी घटक का मतलब क्या है ???? आम तौर पर सरणी में कुछ डेटा प्रकार (एक ही प्रकार) होता है जो ऊपर के रूप में आरंभीकृत होता है ताकि u कृपया मुझे बता सकें, घटक का मतलब ???
अभिषेक सिंह

3

Thorbjørn रावन एंडरसन ने अधिकांश डेटा प्रकारों के लिए उत्तर दिया। चूंकि सरणी के बारे में एक गर्म चर्चा थी,

Jls स्पेक से http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "ऐरे घटक को डिफ़ॉल्ट मान के साथ आरंभ किया जाता है जब इसे बनाया जाता है"

मुझे लगता है कि चाहे वह स्थानीय हो या उदाहरण या वर्ग चर, डिफ़ॉल्ट मानों के साथ


2

जावा में हर वर्ग का एक कंस्ट्रक्टर है (एक कंस्ट्रक्टर एक विधि है जिसे तब कहा जाता है जब एक नया ऑब्जेक्ट बनाया जाता है, जो क्लास वेरिएबल्स के फ़ील्ड को इनिशियलाइज़ करता है)। इसलिए जब आप क्लास का एक उदाहरण बना रहे होते हैं, तो ऑब्जेक्ट बनाते समय कंस्ट्रक्टर विधि को बुलाया जाता है और उस समय सभी डेटा वैल्यूज़ को इनिशियलाइज़ किया जाता है।

पूर्णांक सरणी के ऑब्जेक्ट के लिए, सरणी में सभी मान कंस्ट्रक्टर विधि में 0 (शून्य) के लिए प्रारंभ किए जाते हैं। इसी तरह बूलियन सरणी की वस्तु के लिए, सभी मूल्यों को झूठे के लिए आरंभीकृत किया जाता है।

इसलिए जावा ऑब्जेक्ट को बनाते समय इसके कंस्ट्रक्टर विधि को चलाकर सरणी को आरंभीकृत कर रहा है


1

जावा का कहना है कि आरंभीकरण के समय एक JAVA सरणी की डिफ़ॉल्ट लंबाई 10 होगी।

private static final int DEFAULT_CAPACITY = 10;

लेकिन size()विधि सरणी में सम्मिलित तत्वों की संख्या लौटाती है, और आरंभीकरण के समय से, यदि आपने सरणी में कोई तत्व नहीं डाला है, तो यह शून्य पर वापस आ जाएगा।

private int size;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,size - index);
    elementData[index] = element;
    size++;
}

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