18Hvad er generics, og hvad er typesletning (type erasure)?
Generics gør det muligt for kode at udtrykke typesikre containere og API'er (Application Programming Interfaces), såsom List<String>. På kompileringstidspunktet kontrollerer compileren typer og indsætter typekonverteringer (casts), hvor det er nødvendigt. I kørselsmiljøet slettes størstedelen af den generiske typeinformation, så List<String> og List<Integer> deler den samme runtime-klasse. Det er grunden til, at man ikke direkte kan oprette new T(), bruge primitive typeparametre eller pålideligt tjekke instanceof List<String>.
List<String> names = new ArrayList<>();
names.add("Alice");
List<? extends Number> producer;
List<? super Integer> consumer;
Prøv at besvare dette spørgsmål med en AI-coach
19Hvad er Java Collections Framework?
Collections Framework er et sæt af grænseflader (interfaces) og implementeringer til at gemme og behandle grupper af objekter. Kernegrænseflader inkluderer `List`, `Set`, `Queue`, `Deque` og `Map`. Implementeringer inkluderer `ArrayList`, `LinkedList`, `HashSet`, `TreeSet`, `HashMap`, `TreeMap` og `PriorityQueue`. Man vælger en samling (collection) ud fra tilgangsmønster, krav til rækkefølge, unikhed, kompleksitet ved opslag, ekstra hukommelsesforbrug (memory overhead) og behov for samtidighed (concurrency).
List<String> list = new ArrayList<>();
Set<Long> ids = new HashSet<>();
Map<Long, User> usersById = new HashMap<>();
Deque<String> queue = new ArrayDeque<>();
Prøv at besvare dette spørgsmål med en AI-coach
20Hvordan fungerer `HashMap`?
`HashMap` gemmer poster i "buckets", der vælges ved hjælp af et hash af nøglen. Ved opslag beregner den hashet, finder den pågældende bucket og sammenligner nøgler med metoden `equals`. Kollisioner håndteres internt i den enkelte bucket; i moderne Java kan lange kæder omdannes til et balanceret træ (treeified), når visse betingelser er opfyldt. `HashMap` tillader én null-nøgle samt null-værdier, er ikke trådsikker (thread-safe), og den kan ændre størrelse, når tærsklen for belastningsfaktoren (load factor) overskrides.
Map<Long, User> users = new HashMap<>();
users.put(user.id(), user);
User found = users.get(user.id());
Prøv at besvare dette spørgsmål med en AI-coach
21Hvad er forskellen mellem HashMap, LinkedHashMap, TreeMap og ConcurrentHashMap?
HashMap giver hurtig usorteret adgang og er ikke trådsikker. LinkedHashMap bevarer indsættelsesrækkefølgen eller tilgangsrækkefølgen og er nyttig til LRU-lignende (Least Recently Used) cacher. TreeMap holder nøgler sorteret efter naturlig rækkefølge eller en Comparator og har O(log n) operationer. ConcurrentHashMap er designet til samtidig adgang med segmenteret/intern synkronisering, tillader ikke null-nøgler eller -værdier, og foretrækkes frem for synchronizedMap under belastning.
map.computeIfAbsent(key, ignored -> loadValue());
Prøv at besvare dette spørgsmål med en AI-coach
22Hvad er forskellen mellem ArrayList og LinkedList?
ArrayList er baseret på et array. Den giver hurtig indekseret adgang, kompakt hukommelseslayout og effektiv iterering, men indsættelse i midten kræver, at elementer rykkes. LinkedList er en dobbeltkædet liste. Den har billigere indsættelse, hvis noden allerede er kendt, men indekseret adgang er O(n), hukommelses-overheadet er højere, og cache-lokaliteten er dårligere. I mange reelle applikationer er ArrayList hurtigere, selv når der forekommer indsættelser.
Prøv at besvare dette spørgsmål med en AI-coach
23Hvad er forskellen mellem Comparable og Comparator?
Comparable definerer den naturlige rækkefølge internt i klassen via compareTo. Comparator er et separat objekt eller en lambda, der definerer ekstern sortering. Comparable er nyttig, når en type har én indlysende standardrækkefølge. Comparator er bedre, når der er flere sorteringskriterier, såsom efter navn, dato eller prioritet. compare og compareTo skal være konsistente og helst kompatible med equals, når de bruges i sorterede sets eller maps.
class User implements Comparable<User> {
private int age;
@Override
public int compareTo(User other) {
return Integer.compare(age, other.age);
}
}
Comparator<User> byName =
Comparator.comparing(User::getName);
Comparator<User> byAgeThenName =
Comparator.comparingInt(User::getAge)
.thenComparing(User::getName);
Prøv at besvare dette spørgsmål med en AI-coach