जावा: ऐरे सूचियों का आकार बदलना, पुराने और अस्थायी सरणी बनने के लिए क्या होता है?

मैं डेटा संरचनाओं के असाइनमेंट के लिए जावा में एक कक्षा पर काम कर रहा हूं जहां हम मैन्युअल रूप से एक सरणी सूची लागू करते हैं, यहां क्लास में बनाई गई विधि है जो सरणी सूची की क्षमता को बढ़ाती है:

public void increaseCapacity() {

    Object[] tmp = new Object[_maxItems*2];
    if (_listItems !=null) {
        System.arraycopy(_listItems, 0, tmp, 0, _maxItems);
        _maxItems = _listItems.length;
    }
    _listItems = tmp;

}//Increase size of list (doubles in size each time)

_listItem ऑब्जेक्ट सरणी होने के साथ जो मैं तत्वों को आकार/आकार बदलने के लिए तत्व जोड़ता हूं .., मैं समझता हूं कि अस्थायी सरणी का उपयोग करने से इसकी सामग्री को _listItem आकार में बदल दिया जा सकता है लेकिन मैं क्या समझ में नहीं आता है कि छोटे आकार के मूल _listItem सरणी का क्या होता है।

जब tmp ऑब्जेक्ट सरणी _listItem में कॉपी की जाती है तो वैरिएबल _listItem और tmp की प्रतिलिपि बनाई गई नई मेमोरी है उस में? या tlist को _listItem में कॉपी किया गया है जब अतिरिक्त स्पेस "संलग्न" के साथ उपयोग की जाने वाली वही स्मृति है? (मुझे उम्मीद है कि अच्छी तरह से पढ़ता है)।

अनिवार्य रूप से सरणी _listItem एक नया चर है जब tmp की प्रतिलिपि बनाई जाती है और यदि ऐसा है तो मेरे आकार में स्पष्ट रूप से ऐसा क्यों किया गया है?

मुझे लगता है कि जावा के साथ मेमोरी प्रबंधित करने के साथ कुछ करने के लिए कुछ है लेकिन मैं अपने सिर को इसके चारों ओर लपेट नहीं सकता।

1
Arrays स्मृति में संगत हैं। जब आप कोई नया सरणी ऑब्जेक्ट बनाते हैं तो उसे नए मानों को पकड़ने के लिए स्मृति का एक नया संगत ब्लॉक आवंटित करना होगा। जब आप अपनी चर _listItem को tmp सरणी में असाइन करते हैं, तो आप उस स्मृति पते को बदलते हैं जो _listItem को इंगित करता है। उस समय मूल मूल्य जीसी के अधीन हो जाता है (मानते हैं कि इसमें कोई अन्य संदर्भ मौजूद नहीं है)
जोड़ा लेखक Mark W, स्रोत

3 उत्तर

जब तुम करोगे:

Object[] tmp = new Object[_maxItems*2];

आप ऑब्जेक्ट और एक चर tmp की एक नई सरणी बना रहे हैं जो इसका संदर्भ देता है।

Later, जब तुम करोगे:

_listItems = tmp;

दो चीजें होती हैं:

  1. जिस सरणी को _listItems द्वारा संदर्भित किया गया था, अब इसके संदर्भ में नहीं है। यदि इसे किसी अन्य चर द्वारा संदर्भित नहीं किया गया है, तो यह कचरा बाद में एकत्र किया जाएगा।
  2. tmp द्वारा संदर्भित सरणी को अब _listItems द्वारा संदर्भित किया गया है। कोई प्रति नहीं किया जाता है।

जावा में एक कचरा कलेक्टर तंत्र है। प्रत्येक चर (अभिन्न प्रकारों के चर जैसे int , float , आदि को छोड़कर) वास्तव में वस्तुओं के संदर्भ धारण करते हैं। ये वस्तुएँ सरणी जैसी सरणी या अन्य सादे वस्तुएं हो सकती हैं। हर बार किसी ऑब्जेक्ट को किसी भी चर द्वारा संदर्भित नहीं किया जाता है, कचरा कलेक्टर ऑब्जेक्ट का उपयोग करने वाली स्मृति को मुक्त कर सकता है। यह प्रदर्शन कारण के लिए तत्काल ऐसा नहीं करेगा, यह उस समय की प्रतीक्षा कर सकता है जहां किसी अन्य वस्तु को बनाने के लिए कुछ मेमोरी की आवश्यकता होगी।

3
जोड़ा
बहुत बढ़िया!!! मुझे लगता है कि जिस चीज ने इसे सबसे अधिक साफ़ किया है, वह _listItems = tmp को समझ रहा है, ऑब्जेक्ट्स की नई सरणी के संदर्भ को संपादित कर रहा है
जोड़ा लेखक The_Neo, स्रोत

एक बार संदर्भ गुम हो जाता है और आप इसे फिर से एक्सेस नहीं कर सकते हैं GarbageCollector स्मृति को मुक्त कर देगा और पुरानी (छोटी) सरणी "नष्ट" हो जाएगी।

http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

2
जोड़ा

से पहले

_listItems = tmp;

_listItems is referencing the old array object . After that line, it is referencing the object referenced by tmp.

मान लें कि आपके कार्यक्रम में पुराने ऑब्जेक्ट का कोई अन्य पहुंच योग्य संदर्भ नहीं है, यह कचरा इकट्ठा किया जाएगा और जिस स्मृति को इसे जारी किया जा रहा था।

1
जोड़ा