Последователен ли е редът на повторенията над различните Collection views на даден Map?

+5 гласа
33 прегледа
попитан 2016 юни 16 в Java от Nikola.Nikolov. (3,100 точки)
прекатегоризирани 2016 юни 16 от Nikola.Nikolov.

За даден тип Map има ли някаква гаранция, че повторението над Collections views, return-нато от keySet-а,values и enties методите са повторени в същия ред?

На заден фон: Чудя се дали трансформацията на

public static void doSomethingForEachEntry(Map<String, Integer> someMap) {

    for (String key : someMap.keySet()) {

        doSomething(someMap.get(key));

    }       

}

в

public static void doSomethingForEachEntry(Map<String, Integer> someMap) {

    for (Integer value : someMap.values()) {

        doSomething(value);

    }       

}

е гарантирано да запази редът на повторение без да се променя.

1 отговор

0 гласа
отговорени 2016 юни 17 от Daniel Ivanov (11,160 точки)
Привет,

Въпреки че е вярно,че не можеш да се довериш на специфичния ред (specific ordering) докато Map имплементацията изрично не го дефинира, има 1 изречение в API  документацията

https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

което казва,че Map-а и неговите collection views имат една и съща подредба:

The order of a map is defined as the order in which the iterators on the map's collection views return their elements.

Превод: Наредбата на map-а е дефинирана от начина по който повторенията на collection view-овете на map-а връщат техните елементи.

За да бъде изпълнено това, map-а има присъща наредба (въпреки,че може да не е уточнена,и може да да се промени,ако се модифицира map-а), и всичките и collection views могат да кореспондират към този ред. Дали това дава гаранция, и в частност дали  всички third-party map имплементации ще го следват, това е друг въпрос.

Също така си заслужава да се отбележи,че тези са изрично дефинирани в Map интерфейса като views  са подкрепени от map-а (views backed by the map),например (ако махнеш елемент от keySet, отговарящото на него Map entry трябва да бъде махнато от map-а).

Да се върнем отново на темата. Ако въпросът е  : „Сигурно ли е?“ => отговора е „Да, докато не променяш оригиналния код“, в противен случай не.

Ако някакъв специфичен caller се осланя на някаква специфична наредба,понеже знае че pass-ва наредена Map имплементация, тогава всичко е наред и тази наредба ще бъде запазена след като refactor-ваш.
...