Czy istnieje różnica między Map.of()
i Collections.emptyMap()
między List.of()
i Collections.emptyList()
oraz między Set.of()
i Collections.emptySet()
?Map.of()() vs. Collections.emptyMap
Odpowiedz
Tak, istnieją nawet behawioralne, a nie różnice tylko technicznych między zbiorami zwracanych przez metody fabrycznych emptyXyz
w klasie Collections
i nowych of
metod fabrycznych wprowadzonych w interfejsy (Map
, List
, Set
) z JDK 9 , jeśli są wywoływane bez żadnych argumentów.
Odpowiednia różnica jest taka, że zbiory zwracane przez nowe of
metod fabrycznych zabronić null
klucze i wartości (jak wskazano w dokumentacji API w List, Set i Map interfejsów). Może to brzmieć nieistotnie dla pustych kolekcji, ale nawet jeśli nie jest to do końca udokumentowane, nawet metody dostępu w nowych implementacjach kolekcji sprawdzają wartości puste.
Niektóre przykłady różnic:
Collections.emptyList().contains(null)
zwróci false, a List.of().contains(null)
rzuci NullPointerException
.
zwróci V
, natomiast Map.of().getOrDefault(null, V)
wyrzuci NullPointerException
.
Zgodnie z aktualnie wdrożonym w Oracle JDK 9, co najmniej następujące metody na kolekcje zwrócone przez nowe metody fabryczne rzucają NullPointerException
s, ale zachowują się "sanely" (jak w tym, w jaki sposób klasy kolekcji zostały pierwotnie zaprojektowane i określone do obsługi klucze i wartości zerowe) przy użyciu starych metod fabrycznych w klasie Collections
:
List.of().contains(null);
Set.of().contains(null);
Map.of().containsKey(null);
Map.of().containsValue(null);
Map.of().getOrDefault(null, <any>);
+1 To dobrze. Być może, gdy zwrócisz uwagę na "jak wskazano w dokumentacji API", określ sekcję we wszystkich typach kolekcji: * "Immutable
Również "sanely" jest dyskusyjny - NPE jest prawdopodobnie bardziej rozsądny, ale nie zgodny wstecz. – slim
@slim tutaj nie ma problemu z kompatybilnością wsteczną tutaj. Metody 'X.of()' są nowe i nie mają na celu bezpośredniej zamiany metod 'Collections.emptyX()'. Istniejący kod będzie działał jak w starszych wersjach Javy. – Jesper
- 1. metoda vs funkcja vs procedura vs klasa?
- 2. body.scrollTop vs documentElement.scrollTop vs window.pagYOffset vs window.scrollY
- 3. Opa vs Dart vs Haxe vs coffeescript
- 4. VS 2008 vs VS 2008 Express
- 5. Strona vs Extent vs. Segment vs. Tabele
- 6. Crystalspace vs. Irrlicht vs. .....?
- 7. NetSqlAzMan vs AzMan vs (?????)
- 8. SpiderMonkey vs JavaScriptCore vs?
- 9. Klasa vs pakiet vs moduł vs komponent vs kontener kontra serwis vs platforma w świecie Java
- 10. Zmierz czas w Linuksie - czas vs zegar vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?
- 11. IDataErrorInfo vs ValidationRule vs Exception
- 12. Boo vs C# vs Python?
- 13. DbConnection vs OleDbConnection vs OdbcConnection
- 14. Matlab vs Aforge vs OpenCV
- 15. DDS vs AMQP vs ZeroMQ
- 16. ScheduledExecutorService vs Timer vs Handler
- 17. flume vs kafka vs inni
- 18. ActiveMQ vs Apollo vs Kafka
- 19. getBBox() vs getBoundingClientRect() vs getClientRects()
- 20. Object vs Class vs Function
- 21. Wskaźniki vs auto_ptr vs shared_ptr
- 22. fadeIn fadeOut vs vs fadeTo
- 23. DMD vs. GDC vs. LDC
- 24. select vs poll vs epoll
- 25. Xamarin vs. Mono vs. Monodevelop
- 26. rmi vs servlets vs gniazda
- 27. filter_var vs htmlentities vs htmlspecialchars
- 28. managedQuery() vs context.getContentResolver.query() vs android.provider.something.query()
- 29. getchar_unlocked() VS scanf() VS cin
- 30. HttpRequest vs HttpRequestMessage vs HttpRequestBase
Jaką różnicę szukasz? Nazwy metod różnią się, ale wynikowe struktury danych zachowują się bardzo podobnie. –
@ C-Otto Jeśli twierdzisz, że metody są po prostu "bardzo podobne" (i nie identyczne), musisz oczywiście myśleć, że istnieje różnica. – jarnbjo
@jarnbjo są różnice - zobacz moją odpowiedź – xenteros