LinkedHashMap का उपयोग करते समय मुझे एक समस्या हुई। मैं इसमें कुछ मूल्य स्टोर करने की कोशिश करता हूं और फिर इसे अपडेट करता हूं।

मैं मूल्य के लिए कुंजी और सूची के लिए स्ट्रिंग का उपयोग कर रहा हूं। मैंने सूची में 2 मान डाले और उन्हें LinkedHashMap में डाल दिया। अगला चरण, मैं LinkedHashMap में किसी एक मान को अपडेट करना चाहता हूं। मैं सूची साफ़ करता हूं और इसमें नया मान डालता हूं और LinkedHashMap में मान अपडेट करता हूं।

लेकिन कुछ अजीब होता है, जब मैं सूची में मान साफ़ करता हूं, LinkedHashMap में मान भी साफ़ हो जाता है।

किसी के पास इस मुद्दे के बारे में कोई सुझाव है?

धन्यवाद।

यहाँ स्रोत कोड है:

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class TestLinkedHash {

    private static LinkedHashMap<String, List<Object>> linkObj = new LinkedHashMap<String, List<Object>>();
    private static List<Object> test =  new ArrayList<Object>();
    
    public static void main(String[] args) {
        long timestamp = System.currentTimeMillis();
        double value = 900.0;
        
        String key = "TPS";
        String key1 = "TEST"; 
        String key2 = "TOST";
        
        test.add(timestamp);
        test.add(value);
        
        linkObj.put(key, test);
        linkObj.put(key1, test);
        linkObj.put(key2, test);
        System.out.println(linkObj);    
        
        test.clear();
        System.out.println(linkObj);
        
        test.add(System.currentTimeMillis());
        test.add(200.0);
        linkObj.put(key, test);
        System.out.println(linkObj);
    }
}
0
Akbar 24 अगस्त 2020, 15:50

2 जवाब

सबसे बढ़िया उत्तर

यदि आप उन सूचियों को क्लोन करते हैं जिन्हें आप मानचित्र में जोड़ते हैं तो आपको अपना अपेक्षित व्यवहार मिलता है जो मुझे लगता है:

package stackoverflow;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.stream.Collectors;

public class TestLinkedHash {

    private static LinkedHashMap<String, List<Object>> linkObj = new LinkedHashMap<String, List<Object>>();
    private static List<Object> test = new ArrayList<Object>();

    public static void main(String[] args) {
        long timestamp = System.currentTimeMillis();
        double value = 900.0;

        String key = "TPS";
        String key1 = "TEST";
        String key2 = "TOST";

        test.add(timestamp);
        test.add(value);

        linkObj.put(key, test);
        linkObj.put(key1, test.stream().collect(Collectors.toList()));
        linkObj.put(key2, test.stream().collect(Collectors.toList()));
        System.out.println(linkObj);

        test.clear();
        System.out.println(linkObj);

        test.add(System.currentTimeMillis());
        test.add(200.0);
        linkObj.put(key, test);
        System.out.println(linkObj);
    }
}

आउटपुट:

{TPS=[1598276243552, 900.0], TEST=[1598276243552, 900.0], TOST=[1598276243552, 900.0]}
{TPS=[], TEST=[1598276243552, 900.0], TOST=[1598276243552, 900.0]}
{TPS=[1598276243626, 200.0], TEST=[1598276243552, 900.0], TOST=[1598276243552, 900.0]}
0
Conffusion 24 अगस्त 2020, 16:38

आपके संग्रह में test के संदर्भ हैं। उसके बाद से, जब test को हटा दिया जाएगा, तो आपके संग्रह में खाली सूची के संदर्भ होंगे।

यदि आप किसी वस्तु की उथली प्रति को संग्रह में सम्मिलित करेंगे, तो मूल वस्तु के परिवर्तन से उसकी प्रतिलिपि प्रभावित नहीं होगी। हालाँकि, संदर्भ स्मृति के एक निश्चित खंड की ओर इशारा कर रहा है, जबकि जब यह उत्परिवर्तित होता है, तो सभी उत्परिवर्तन संदर्भ द्वारा दृश्यमान और सुलभ होते हैं।

UPD: किसी वस्तु का परिवर्तन साझा किया जाता है, क्योंकि जिस वस्तु को आप संशोधित करते हैं वह वही वस्तु है जिसे आपने अपने संग्रह में डाला है।

1
Steyrix 24 अगस्त 2020, 16:40