2012-05-25 17 views
6

संभव डुप्लिकेट:
Is Java pass-by-reference?Arrays.sort() कैसे पारित चर बदलता है?

मैं यहाँ एक छोटे से उलझन में हूँ। Arrays.sort (ए) कैसे एक के मान को संशोधित करता है?

int[] a = {9,8,7,6,5,4,3,2,1}; 
Arrays.sort(a); 
System.out.println(Arrays.toString(a)); 

मैंने सोचा था कि जावा मूल्य द्वारा पारित था ...

+0

इसके अलावा, JDK सूत्रों के साथ आता है, तो आप इसे पर एक नज़र हो सकता है अगर आप इसके बारे में और जानना चाहते। – Puce

+0

बस उत्तरों पर विस्तार करने के लिए: यह केवल काम करता है क्योंकि क्रम सरणी के आकार को नहीं बदलता है। यदि आप ऐसा करना चाहते हैं, तो आपको एक नई सरणी आवंटित करनी होगी और मौजूदा सरणी को संशोधित नहीं कर सका। – biziclop

उत्तर

10

हाँ, जावा पारित-दर-मूल्य है। हालांकि, यहां मूल्य द्वारा पारित किया जा रहा है संदर्भ सरणी में, सरणी नहीं है। जावा में

+1

तो यदि आप मूल को बदलने के बिना किसी अन्य विधि में सरणी को बदलना नहीं चाहते हैं, तो आपको इसकी प्रतिलिपि बनाना चाहिए। सही बात? – Josh

+1

@ जोश: सही। आप प्रतिलिपि बनाने के लिए 'a.clone()' का उपयोग कर सकते हैं। – NPE

+0

@ जोश हाँ, आप सही हैं –

6

वस्तुओं संदर्भ की मूल्य द्वारा पारित कर रहे हैं। तो यदि आप किसी ऑब्जेक्ट में पास करते हैं, तो उसे संदर्भ की एक प्रति प्राप्त होती है (यदि आप किसी अन्य संदर्भ को संदर्भित करते हैं, तो केवल पैरामीटर संशोधित होता है, मूल वस्तु अभी भी मौजूद है और मुख्य कार्यक्रम द्वारा संदर्भित है)।

This link demonstrates a bit about passing by value of reference

public void badSwap(Integer var1, Integer var2) 
{ 
    Integer temp = var1; 
    var1 = var2; 
    var2 = temp; 
} 

उन वस्तुओं के लिए संदर्भ हैं, लेकिन वे क्योंकि वे केवल समारोह दायरे में आंतरिक संदर्भ हैं बदली नहीं किया जाएगा। हालांकि, अगर आप ऐसा करते हैं:

var1.doubleValue();

यह मूल वस्तु को संदर्भ का प्रयोग करेंगे।

+0

+1 यह याद रखना महत्वपूर्ण है: केवल संदर्भ "क्लोन" है, ऑब्जेक्ट संदर्भित नहीं है। हम इसे ज्यादातर मामलों में मानते हैं लेकिन किसी कारण से यह सरणी के साथ भ्रम पैदा करता है। – biziclop

+0

जावा में ऑब्जेक्ट्स संदर्भ द्वारा कभी पारित नहीं होते हैं। जब आप किसी ऑब्जेक्ट को किसी फ़ंक्शन पर पास करते हैं, तो आप ऑब्जेक्ट (इसके मान) का संदर्भ पास करते हैं, उदा। सी ++ में आप संदर्भ पास करते हैं और पॉइंटर अंकगणित कर सकते हैं, जावा में आप इसे नहीं कर सकते हैं। –

+0

@LuiggiMendoza मुझे इसे "छद्म संदर्भ" के रूप में और अधिक सोचना पसंद है। आप ऑब्जेक्ट और उसके फ़ील्ड तक पहुंचने के लिए इसका उपयोग कर सकते हैं, लेकिन यह सी-स्टाइल पॉइंटर से तुलनीय नहीं है। –

2

सच है, जावा हमेशा पास-दर-मूल्य करता है और वस्तुओं के लिए, संदर्भ मान द्वारा पारित किया गया है। इस प्रकार, आपके सरणी का संदर्भ मूल्य से गुजरता है।

5

Arrays.sort चर संशोधित नहीं करता है, उसे संशोधित सरणी चर अंक आपत्ति है।

1
  1. यह क्रमबद्ध करता है।
  2. सरणी के संदर्भ मूल्य से पारित कर दिया है। सरणी नहीं है।
0

सरणी के संदर्भ मूल्य से पारित कर दिया है, इसलिए sort विधि का अपना संदर्भ है कि अभी भी a संदर्भ के रूप में एक ही सरणी के लिए संदर्भित करता है। इसका मतलब है कि sort उसी सरणी की सामग्री को बदल सकता है जो a संदर्भ।

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