Java - HashMap Memory: оптимизация - PullRequest
0 голосов
/ 29 мая 2018

Я хотел бы знать, есть ли более эффективный способ обработки хеш-карт.

У меня есть следующая карта (основная), которая состоит из ее ключа и другой карты в качестве значения.

   final Map<String,Map<Boolean,String>> primaryMap = new HashMap<>();
     Map<Boolean,String> secondaryMap = new HashMap<>();

Для каждой клавиши я назначаю 2 вторичных карты и снова инициализирую вторичную карту. Последовательность аналогична приведенной ниже:

 secondaryMap = new HashMap<>();
       secondaryMap.put(true, "A");
       primaryMap.put("DOG", listedMap);

        secondaryMap.put(false, "B");
        primaryMap.put("DOG", listedMap);

 secondaryMap = new HashMap<>();

        secondaryMap.put(true, "C");
        primaryMap.put("CAT", listedMap);

        secondaryMap.put(false, "D");
        primaryMap.put("CAT", listedMap);

Возможно, существует более эффективный способсделать это?Влияет ли secondaryMap.clear() на память до вызова secondaryMap = new HashMap<>();

Заранее большое спасибо,

Kat

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Поскольку внутренний Map может иметь только два ключа, вы можете заменить его на собственный класс:

final Map<String,Map<Boolean,String>> primaryMap = new HashMap<>();

может быть:

final Map<String, Foo> map = new HashMap<>();

и выможет заполнить его, например:

 map.put("DOG", new Foo("A", "B"));

, где конструктор Foo может быть:

public Foo(String valueForTrue, Sting valueForFalse){
   this.valueForTrue = valueForTrue;
   this.valueForFalse = valueForFalse;
}

Это сэкономит некоторую память (потребуется гораздо меньше объектов)но в целом это сделает ваш код намного понятнее.

Конечно, если вы можете добавить значение String только для true в случае false, вы можете предпочесть фабрику общедоступному конструктору вFoo таких как:

private Foo(){
}

public static Foo ofTrue(String valueForTrue){
   Foo foo = new Foo();
   foo.valueForTrue = valueForTrue;
   return foo;
}

public static Foo ofFalse(String valueForFalse){
   Foo foo = new Foo();
   foo.valueForFalse = valueForFalse;
   return foo;
}

public static Foo of(String valueForTrue, Sting valueForFalse){
   Foo foo = new Foo();
   foo.valueForTrue = valueForTrue;
   foo.valueForFalse = valueForFalse;
   return foo;
}
0 голосов
/ 29 мая 2018

Не уверен, что это ваш код или просто проблема копирования / вставки, но похоже, что вы будете более эффективны с:

 secondaryMap = new HashMap<>();
 secondaryMap.put(true, "A");
 secondaryMap.put(false, "B");
 primaryMap.put("DOG", secondaryMap);

И secondaryMap.clear() до того, как ваш new также очиститкарту вы положили в основную - они один и тот же объект .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...