'उथला' या 'गहरी' - और यह एक बात है कि मैं कोई भी ठीक परिभाषित करने को देखने के है - विधि Arrays.copyOf(..)
व्यवहार में करता है एक प्रति का उत्पादन स्रोत सरणी का जो स्रोत सरणी में परिवर्तनों से अप्रभावित रहता है।
पूर्णांक सरणियों के साथ निम्नलिखित सरल उदाहरण लें:
import java.util.Arrays;
public class DeepCopyTest
{
public static void main(String[] args)
{
int[] source = { 1, 2, 3, 4, 5, 6};
int[] target = new int[source.length];
// Copy target from source via Arrays.copyOf(..) method :
target = Arrays.copyOf(source, 6);
// Check for equality :
System.out.println("Source1 : " + Arrays.toString(source));
System.out.println("Target1 : " + Arrays.toString(target));
// Increment all entries in source array :
for(int i = 0; i < source.length; i++)
{
source[i] = source[i] +1;
}
// See if target is affected :
System.out.println("Source2 : " + Arrays.toString(source));
System.out.println("Target2 : " + Arrays.toString(target));
}
}
// OUTPUT
// ------
Source1 : [1, 2, 3, 4, 5, 6]
Target1 : [1, 2, 3, 4, 5, 6]
Source2 : [2, 3, 4, 5, 6, 7]
Target2 : [1, 2, 3, 4, 5, 6]
अभ्यास में, जब लोग एक सरणी के एक "गहरी प्रतिलिपि" की तलाश, वे केवल कुछ है कि मूल में परिवर्तन से अप्रभावित है चाहता हूँ।
और यह Arrays.copyOf (..) 'विधि उन्हें यह देती है।
साथ ही आदिम प्रकार सरणियों, स्ट्रिंग ऑब्जेक्ट सरणियों भी ऊपर के उदाहरण के रूप में व्यवहार करते हैं, जैसे उत्पादन दे रही है:
Source1 : [a, b, c, d, e, f]
Target1 : [a, b, c, d, e, f]
Source2 : [a1, b1, c1, d1, e1, f1]
Target2 : [a, b, c, d, e, f]
जब प्रारंभिक स्रोत सरणी प्रविष्टियों "1" से concatenated रहे हैं।
यह ऑब्जेक्ट एरे के लिए भी 'काम करता है' इस अर्थ में कि लक्ष्य को फिर से सौंपे जाने पर स्रोत से अब बंधे नहीं हैं। लेकिन नकल के बाद दोनों सरणियों के पहले तत्व के लिए और उसके बाद स्रोत में फेरबदल के बाद उत्पादन को देख [0] पूरा सच का पता चलता है:
Source1 : [email protected]
Target1 : [email protected]
Source2 : [email protected]
Target2 : [email protected]
के बाद मूल स्रोत सरणी नकल की जाती है लक्ष्य तत्वों बस ओर इशारा किया गया है वर्तमान में उनके स्रोत समकक्षों में जो भी मूल्य रखे जाते हैं। लक्ष्य के लिए [0] यह स्मृति पता 1 डीबी 9 742 की सामग्री है - जो एक ही मेमोरी एड्रेस होल्डिंग स्रोत [0] है। । । ।
और कारण है कि हम स्रोत [0] को पुन: असाइन करने के बाद स्रोत और लक्ष्य के बीच एक debonding मिल तथ्य यह है कि काम के बयान
source[0] = new Object();
बस स्मृति संदर्भ स्रोत में आयोजित का कारण बनता है की वजह से है [0] को किसी नए ऑब्जेक्ट को इंगित करने के रूप में कुछ नए स्थान पर बदला जा सकता है। तो यह शुद्ध अर्थ में एक सच्ची गहरी प्रतिलिपि के बाद नहीं है, भले ही कई मामलों में यह कोडर को गहरी प्रति के समान लाभ प्रदान करता है।
आदिम डेटा के सरणी के साथ Arrays.copyOf (..) विधि संदर्भों की प्रतिलिपि नहीं बना सकती क्योंकि इन्हें प्राइमेटिव के लिए उपयोग नहीं किया जाता है। यह केवल स्रोत तत्व मानों को लक्षित तत्वों में प्रतिलिपि बनाता है। फिर से हमारे पास एक गहरी प्रतिलिपि के मुकाबले बहुत कम कोड की आवश्यकता वाले ऑपरेशन की कीमत पर गहरी प्रतिलिपि के समान प्रभाव पड़ता है।
तो Arrays.copyOf (..) आदिम और 1-डी ऑब्जेक्ट एरे दोनों के लिए एक 'सस्ता' गहरी प्रति है। लेकिन कोई डेटा सरणी अधिक जटिल है और यह पता चला है।
शायद इसे अर्ध-गहरी प्रतिलिपि कहा जाना चाहिए।
शायद सिर्फ स्ट्रिंग्स – Matthias
@Matthias का होना शामिल की एक और घटना। चूंकि "फू" एक शाब्दिक है, इसलिए इसे प्रशिक्षित किया जाएगा; परीक्षण मानते हैं कि। यदि वह धारणा सही है, तो परीक्षण जांच कर रहे हैं कि लक्षित तत्व को स्रोत स्रोत तत्व के '=" बार "द्वारा बदला गया है या नहीं। – ToolmakerSteve
मुझे नहीं पता कि परीक्षण कहां से अंतर्निहित हैं कि स्ट्रिंग्स आंतरिक हैं या नहीं।मुझे कोई पहचान परीक्षण नहीं दिख रहा है, मुझे केवल समानता परीक्षण दिखाई देता है। परिणाम उथले और गहरी प्रतियों के लिए समान होंगे, क्योंकि समानता परीक्षण उथले और गहरी प्रतियों के बीच भिन्न नहीं हो सकते हैं। उथले और गहरी प्रतियों के बीच अंतर करने के लिए किसी को पहचान परीक्षण की आवश्यकता होती है। –