2012-08-13 16 views
5

मैं अपेक्षाकृत बड़े String सरणी के साथ काम कर रहा था। (आकार में लगभग 400 x 400) मैं सोच रहा था कि कैसे एक सरणी एक और काम के बराबर बना रही है। उदाहरण के लिए,जावा: कैसे एरे काम करते हैं

String[][] array1 = new String[400][400]; 
String[][] array2 = array1; 

एक सरणी एक और प्रत्येक तत्व के माध्यम से पाशन और यह एक और सरणी में संबंधित स्थिति के बराबर बनाने के रूप में एक ही बात करने के लिए बराबर बना रही है? (नीचे की तरह)

for(int y = 0; y < 400; y++) { 
    for(int x = 0; x < 400; x++) { 
     array2[x][y] = array1[x][y]; 
    } 
} 

अब पाशन विधि एक सरणी दूसरे के बराबर बनाने के रूप में एक ही बात है? या दूसरे की तुलना में पहला/दूसरा तेज है? निजी तौर पर, मुझे लगता है कि पहला तेज होगा क्योंकि रिकर्सन से पहले array2 पर कोई रिकर्सन नहीं है या मैन्युअल रूप से मेमोरी आवंटित नहीं किया जा रहा है। लेकिन, मुझे नहीं पता कि इस जानकारी को कहां से शुरू करना है और मैं इस तरह की चीजों को कैसे संसाधित करता हूं, इस बारे में रसद समझना चाहता हूं।

+0

[जावा Arrays] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html) पर एक नज़र डालें – adatapost

+3

मुझे लगता है कि आप रिकर्सन की परिभाषा के बारे में उलझन में हैं। –

+0

दिलचस्प है लेकिन मुझे इसके बारे में कुछ भी नहीं दिख रहा है, जहां नीचे यह एरेकॉपी विधि का उल्लेख करता है, जिसमें एक बराबर चिह्न डॉग रैमसे के साथ एक सरणी बनाने के साथ कुछ भी नहीं लगता है: शायद मैं इसलिए हूं मैं वास्तव में नहीं जानता कि चीजें कितनी काम करती हैं जितनी मुझे पता है कि वे वास्तव में काम करते हैं .. – CoderTheTyler

उत्तर

12

नहीं, यह वही बात नहीं है: सरणी संदर्भ वस्तुएं हैं, इसलिए array2array1 का उपनाम बन गया है, इसकी प्रति नहीं। array2 के तत्व में कोई भी असाइनमेंट array1 के माध्यम से "दृश्यमान" बन जाता है, और इसके विपरीत। यदि आप एकल-आयाम सरणी की एक प्रति बनाना चाहते हैं, तो आप इसकी clone() विधि का उपयोग कर सकते हैं; ध्यान दें कि प्रति उथले होगी, यानी सरणी के अलग-अलग तत्व क्लोन किए जाएंगे (चाल को आपके पोस्ट में वर्णित 2-डी सरणी में अपरिहार्य बनाने के लिए)।

+0

वाह ... मैंने कभी यह महसूस नहीं किया। इससे शायद यह समझाया जा सकता है कि मेरे कई कार्यक्रम एरे के साथ क्यों काम नहीं करते हैं। ज्ञान के लिए धन्यवाद! – CoderTheTyler

5

array2 = array1 तत्वों की प्रतियां, केवल सरणी संदर्भ नहीं बनाता है। तो array2 और array1 दोनों एक ही अंतर्निहित सरणी का संदर्भ देते हैं।

String[][] array1 = new String[4][4]; 
array1[0][0] = "some string"; 
String[][] array2 = array1; 
array1[0][0] = "another string"; 
System.out.println("array2: " + array2[0][0]); 
array2[0][0] = "a third string"; 
System.out.println("array1: " + array1[0][0]); 
+0

@ dasblinkenlight के उत्तर के समान लेकिन एक उदाहरण के साथ। धन्यवाद! : डी – CoderTheTyler

1

हम्म मुझे लगता है कि जब आप एक सरणी दूसरे के बराबर बनाने के लिए, आप बस संदर्भ बदलने के लिए:

यह अपने आप के लिए निर्धारित करने के लिए बहुत आसान है। उदाहरण के लिए:

ARRAY 1 - * [] [] [] [] ... [] [] जहां * सरणी के लिए एक संदर्भ है 1
सरणी 2 - & [] [] [] [] .. । [] [] जहां & सरणी 2

फिर स्थापना सरणी के संदर्भ में है 1 = सरणी 2 सरणी 1 बस & करने के लिए अपने संदर्भ बदल सकते हैं और स्मृति संदर्भ &

1

में दूसरी पंक्ति में पढ़ने शुरू होगा पहला कोड उदाहरण प्रकार स्ट्रिंग [] का एक संदर्भ चर बना रहा है जो कि समान द्वि-आयामी सरणी ऑब्जेक्ट को संदर्भित करता है जो रेफरी ईरेंस सरणी 1 को संदर्भित करता है। स्मृति में केवल एक द्वि-आयामी सरणी है, लेकिन दो संदर्भ चर इसे संदर्भित करते हैं, array1 और array2।

आप रिकर्सन की परिभाषा के बारे में उलझन में हैं, इसलिए मैं आपको यहां इंगित करूंगा- Recursion in Computer Science

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