Почему статический hashmap создается для каждого экземпляра? - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть курс с одним Hashmap. Я пытаюсь добавить значения на карту с различными объектами. Карта является общей для всех объектов, поэтому я пометил ее как статическую, но она показывает странное поведение. У меня есть следующий код -

class Course
{
    static HashMap<Integer,List<String>> map;
    Course()
    {
        map = new HashMap<>();
    }
    public boolean add(int id,String Course)
    {
        if(!map.containsKey(id))
        {
            map.put(id,new ArrayList<>());
        }
        try 
        {
            List<String> temp = map.get(id);
            temp.add(Course);
            return true;        
        } catch (Exception e) 
        {   
            return false;
        }        
    }
    public void get()
    {
        System.out.println(map);
    }

    public static void main(String[] args)
    {
        Course c = new Course();
        c.add(1, "abs");
        c.add(2,"xyx");
        c.add(1,"new");
        c.add(3,"tye");
        c.get();
        Course c2  = new Course();
        c2.add(1,"GP");
        c2.add(2, "PT");
        c2.get();

    }   
}

Я определил Hashmap как статический, потому что он является общим для всех объектов. Но, тем не менее, новый Hashmap создается для каждого экземпляра.

Вывод

{1=[abs, new], 2=[xyx], 3=[tye]}
{1=[GP], 2=[PT]}

1 Ответ

2 голосов
/ 10 ноября 2019

Потому что вы инициализируете его в конструкторе.

Не. Просто инициализируйте его в поле:

static HashMap<Integer,List<String>> map = new HashMap<>();

(и удалите конструктор).

И рассмотрите возможность создания поля final, если вы никогда не намереваетесь переназначить его. Это гарантирует, что 1) вы фактически не переназначаете его;2) вы действительно назначаете его один раз.

...