Kolekcje - co Junior wiedzieć musi?

1

Co trzeba wiedzieć więcej poza:

Collections {
    Set = { SortedSet = {TreeSet}, HashSet, LinkedHashSet}, 
    List = {LinkedList, ArrayList}, 
    Queue = {PriorityQueue, Deque = {ArrayDeque, LinkedList}}
}
Map {TreeMap, HashMap, LinkedHashMap}
  • co robią i jakie metody mają
  • kiedy wybieramy który i do czego
  • jak są zaimplementowane powyższe oraz umieć wskazać różnice np. ArrayList vs LinkedList czy ArrayDeque i LinkedList i powiedzieć kiedy który lepszy
0
Julian_ napisał(a):

Co trzeba wiedzieć więcej poza:

Collections {
    Set = { SortedSet = {TreeSet}, HashSet, LinkedHashSet}, 
    List = {LinkedList, ArrayList}, 
    Queue = {PriorityQueue, Deque = {ArrayDeque, LinkedList}}
}
Map {TreeMap, HashMap, LinkedHashMap}
  • co robią i jakie metody mają
  • kiedy wybieramy który i do czego
  • jak są zaimplementowane powyższe oraz umieć wskazać różnice np. ArrayList vs LinkedList czy ArrayDeque i LinkedList i powiedzieć kiedy który lepszy

Trzeba widzeciec wszystko;]

6

Musisz wiedzieć, że wolno używać tylko ArrayList i ewentualnie, jako interfejsu, List.
Jeśli przypadkiem jakiś senior/architekt ( 15 lat w firmie) zobaczy np. taki Set w kodzie, to momentalnie zacznie mu się przegrzewać procesor. Po jakiejś godzinie / dwóch ogarnie, że faktycznie jest taki interfejs i, przy odrobinie szczęścia, zrozumie czym się różni od zwykłej Listy.
Jednakże, to będzie już godzina 17-ta - fajrant. Biedactwo wyjdzie na dwór, wieczory teraz chłodniejsze, a procesor nadal przegrzany. Przeziębienie będzie na 100%.

TL;DR - nie chcesz mieć posmarkanych seniorów to trzymaj się ArrayListy.

1

@Julian_: to co wymieniłeś jest wystarczające. Dodatkowo może takie praktyczne spostrzeżenia jak np jak ktoś napisze w kodzie

final List<String> list = new ArrayList<>();

to wcale nie znaczy, że ta lista będzie niemutowalna ;) i jak już przy tym jesteśmy - jak zrobić kolekcję niemutowalną, i czy znasz implementacje kolekcji które są thread safe

4

Jak dodać do projektu vavra ;)

0

jeden jełop który mnie rekrutował dowalił się dlaczego nie wymieniłem Stack'a po pytaniu "jakie znasz kolekcje"
mówie mu, że to się na LinkedList implementuje*
"ale nie wymieniłeś"
i w tym stylu zagrywki przez 1/2 h - tak to jest jak wezmie sie debila, ktory 10 lat spedzil w gownofirmach (sprawdzilem typa na LI), gdzie sie zatrzymal na java 1.1 i zrobi sie z niego jakąś szyszke, ktora pokazuje potem ze on cie moze up.....
wielkie polskie** "korpo" z samymi negatywami na gowork - żenada na maxa.....

*) już 10 lat temu Bruce Eckel w "Thinking in java" pisał, że Stack jest przestarzały i nie należy stosować, zamiast niego natomiast LL
**) żeby nie było że mam ojkofobie - inny przyklad: naprawde mega korpo miedzynarodowe - kod na kartce - jakis architekt mnie egzaminuje - jak zobaczyl petle foreach to zapytal "to takie sa w javie?"

1

Często też pytają o implementacje thread-safe kolekcji.
Ponadto w szczególności często jest wałkowana implementacja HashMapy i różniste pytania o hashcode, zagrożenia wynikające z używanie obiektów typu mutable w Setach albo jako klucz w Mapach

0
jarekr000000 napisał(a):

[...] i ewentualnie, jako interfejsu, List.

Dziwna nazwa dla interfejsu. Jeśli ktoś przebranżawia się z C# na Javę, to raczej nie ma lekko...

0
jarekr000000 napisał(a):

i ewentualnie, jako interfejsu, List.

"programming for interface not implementation"

a czy uważasz za coś złego aby jako interfejs stosować ImmutableList jeżeli w większości przypadków programuje używając kolekcji niemutowalnych (w zasadzie takie kolekcje powinny być jako domyślne a reszta to odstępstwa od normy). Zaletą zejścia z zasady
"programming for interface not implementation"
przy Immutable* kolekcjach jest to, że programista od razu widzi, że ma doczynienia z kolekcją immutable i nie będzie próbować durnych rzeczy z tym robić (np. operacja add).

0

Uważam jak @Leroy w komentarzu. Trzeba olać java.util i korzystać zdobrych kolekcji, gdzie jest interfejs od razu niemutowalny.
Interfejs List w vavr, ma metodę append i prepend, ale one tworzą nową listę (nie mutują orginalnej )- i tak jest ładnie i wygodnie.

0
jarekr000000 napisał(a):

Uważam jak @Leroy w komentarzu. Trzeba olać java.util i korzystać zdobrych kolekcji, gdzie jest interfejs od razu niemutowalny.
Interfejs List w vavr, ma metodę append i prepend, ale one tworzą nową listę (nie mutują orginalnej )- i tak jest ładnie i wygodnie.

@jarekr000000 a jesli chodzi o kwestie optymalizacyjne? Jak np zrobi się to w pętli 10 000 razy, to nie będzie niszczyło apki?

1

Do listy dorzuciłbym:

0
Pinek napisał(a):

@jarekr000000 a jesli chodzi o kwestie optymalizacyjne? Jak np zrobi się to w pętli 10 000 razy, to nie będzie niszczyło apki?

Problemy optymalizacyjne rozwiązujesz jak masz problem oiptymalizacyjny, wiesz jak szybko i na jakim sprzecie ma działać lub ile pamięci zajmowąć.
Przy listach o rozmiarze 10 tys może się okazać, że VAVR lista jest wielokrotnie wolniejsza, ale.. to zależy.

  1. Najczęściej listy w projektach mająrozmiary poniżej 20 elemenów (najczęściej to mają 0 elementów).
  2. Funkcyjne struktury nie są takie złe jak się wydaje, co więcej nowsze JVM im coraz lepiej pomagają.
  3. W klasycznym podejściu robiłem bardzo dużo defensywnego kopiowania list (i to ogólnie jest często stosowane) , po przejściu na niemutowalne struktury nie ma potrzeby, więc
    paradoksalnie przejście na VAVR może nawet pomóc CPU i pamięci (mam taki jeden projekt, gdzie to bardzo dobrze widać, wyleciało tony niepotrzebnych kopiowań).

1 użytkowników online, w tym zalogowanych: 0, gości: 1