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

+5 гласа
78 прегледа
попитан 2016 юни 16 от 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,180 точки)
Привет,

Въпреки че е вярно,че не можеш да се довериш на специфичния ред (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-ваш.
...