2011-09-08 10 views
11
public class TestingArray { 

    public static void main(String[] args) { 

     int iCheck = 10; 
     int j = iCheck; 
     j = 11; 
     System.err.println("value of iCheck "+iCheck); 

     int[] val1 = {1,2,9,4,5,6,7}; 
     int[] val2 = val1; 
     val2[0] = 200; 
     System.err.println("Array Value "+val1[0]); 
    } 

} 

आउटपुट: iCheck कीसमस्या

मूल्य 10
सरणी मूल्य 200

ऊपर कोड से मैंने पाया कि यदि कोई सरणी val2 को अन्य सरणी val1 को असाइन किया जा रहा है और यदि हम val2 सरणी के किसी भी मान को बदलते हैं, तो परिणाम सरणी val1 के लिए भी प्रतिबिंबित होता है जबकि वही परिदृश्य परिवर्तनीय असाइनमेंट के साथ नहीं होता है। क्यों?

उत्तर

21

निम्नलिखित बयान val2 बनाता val1 रूप में एक ही सरणी का संदर्भ लें:

int[] val2 = Arrays.copyOf(val1, val1.length); 

ऑब्जेक्ट (सहित उदाहरणों:

int[] val2 = val1; 

आप एक प्रति बनाना चाहते हैं, तो आप val1.clone() या Arrays.copyOf() इस्तेमाल कर सकते हैं संग्रह कक्षाओं, String, Integer इत्यादि) इसी तरह से काम करते हैं, जिसमें एक चर को दूसरे चर को असाइन करना संदर्भ में प्रतिलिपि बनाता है, दोनों को बनाना चर एक ही वस्तु का संदर्भ लें। यदि प्रश्न में वस्तु उत्परिवर्तनीय है, तो इसके बाद के संस्करणों में से एक के माध्यम से अपनी सामग्री में किए गए संशोधनों को भी दूसरे के माध्यम से दिखाई देगा।

आदिम प्रकार (int, double आदि) अलग-अलग व्यवहार करते हैं: इसमें कोई संदर्भ शामिल नहीं है और असाइनमेंट मूल्य की एक प्रति बनाता है।

+1

+1: या 'int [] val2 = val1.clone() का उपयोग करें; ' –

3

बस शब्दों में कहें, "val1" और "val2" वास्तविक सरणी के पॉइंटर्स हैं। आप val1 के समान सरणी को इंगित करने के लिए val2 असाइन कर रहे हैं। इसलिए, एक को बदलें, और दूसरा एक ही परिवर्तन देखता है। इसे वास्तव में एक प्रतिलिपि बनाने के लिए, आपको असाइन करने के बजाय सरणी को क्लोन करना होगा।

1

क्योंकि आप val1 से val2 का संदर्भ निर्दिष्ट करते हैं, इसलिए वे दोनों स्मृति में एक ही ऑब्जेक्ट को इंगित करते हैं।

1

क्योंकि जावा में सरणी वस्तुएं हैं, यानी संदर्भ द्वारा पारित किया गया है।