Eksempler på Brug af Collections-metoder
I dag vil vi primært se på metoder, der hjælper med at oprette trådsikre samlinger.
Collections-metoder
Her er nogle vigtige metoder, som klassen stiller til rådighed for at oprette synkroniserede Collections samlinger:
synchronizedList(List<T> list): Returnerer en synkroniseret (trådsikker) liste, der understøtter samme kontrakt som den angivne liste.
Main.java
1List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set): Returnerer et synkroniseret (trådsikkert) sæt, der understøtter samme kontrakt som det angivne sæt.
Main.java
1Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m): Returnerer et synkroniseret (trådsikkert) map, der understøtter samme kontrakt som det overførte map.
Main.java
1Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list): Returnerer en uforanderlig liste med de samme elementer som den angivne liste.
Main.java
123456789101112131415package com.example; import java.util.Collections; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { List<Integer> unmodifiableList = Collections.unmodifiableList(new ArrayList<>(List.of(1,2,3))); System.out.println(unmodifiableList); // output [1,2,3] unmodifiableList.add(4); // throw exception `UnsupportedOperationException` } }
unmodifiableMap(Map<? extends K, ? extends V> m): Returnerer et uforanderligt map med de samme mappinger som det angivne map.
Main.java
12345678910111213package com.example; import java.util.Collections; import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) { Map<Integer, Integer> unmodifiableMap = Collections.unmodifiableMap(new HashMap<>()); unmodifiableMap.put(1, 2); // exception `UnsupportedOperationException` } }
unmodifiableSet(Set<? extends T> set): Returnerer et ikke-modificerbart sæt med de samme elementer som det angivne sæt.
Main.java
12345678910111213package com.example; import java.util.Collections; import java.util.Set; import java.util.HashSet; public class Main { public static void main(String[] args) { Set<Integer> unmodifiableSet = Collections.unmodifiableSet(new HashSet<>()); unmodifiableSet.add(4); // exception `UnsupportedOperationException` } }
Hvad er så forskellen mellem at oprette synkroniserede collections gennem normale implementeringer (dem, der er diskuteret i de foregående kapitler) og ved at bruge Collections metoder?
Lad os se på forskellen ved at bruge én Map collection som eksempel
Forskelle mellem ConcurrentHashMap og synchronizedMap()
ConcurrentHashMap anvender en avanceret metode kaldet lock splitting, som opdeler map i segmenter og synkroniserer operationer kun på segmentniveau. Denne tilgang muliggør, at flere tråde samtidig kan læse og skrive data på forskellige segmenter af mappet, hvilket forbedrer samtidighed og ydelse.
Metoden synchronizedMap() indkapsler det oprindelige map i et synkroniseret proxy-objekt. Alle metoder i dette proxy-objekt er synkroniserede, hvilket sikrer trådsikkerhed. Denne tilgang kan dog reducere ydeevnen i et multitrådet miljø på grund af den høje låsefrekvens.
For eksempel, hvis ConcurrentHashMap skriver til forskellige buckets, vil trådene ikke blokere hinanden. Hvis én bucket derimod tilgås af 2 tråde, vil én af dem vente. Hvis samlingen derimod er oprettet via synchronizedMap(), vil kun 1 tråd have adgang til alle buckets, og hele mappet er blokeret.
Dette betyder, at indtil én tråd er færdig med sit arbejde, vil andre tråde ikke kunne få adgang. Som resultat udføres operationer i ConcurrentHashMap ganske enkelt hurtigere.
Der findes også andre metoder i Collections til praktisk arbejde med samlinger:
Klassen Collections tilbyder praktiske metoder til at arbejde med collections i Java, hvilket forenkler ofte anvendte operationer. Synkroniserede collections oprettet via Collections-metoder er nyttige for trådsikkerhed, men til mere komplekse multitrådede opgaver anbefales det at anvende collections fra pakken java.util.concurrent.
1. Hvilken metode i Collections-klassen bruges til at oprette en uforanderlig liste?
2. Hvilken af følgende metoder i Collections-klassen returnerer et trådsikkert map?
3. Hvad er forskellen mellem ConcurrentHashMap og synchronizedMap?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
What are some other useful methods provided by the Collections class?
Can you give examples of when to use synchronizedMap() vs ConcurrentHashMap?
How do unmodifiable collections work in practice?
Awesome!
Completion rate improved to 3.33
Eksempler på Brug af Collections-metoder
Stryg for at vise menuen
I dag vil vi primært se på metoder, der hjælper med at oprette trådsikre samlinger.
Collections-metoder
Her er nogle vigtige metoder, som klassen stiller til rådighed for at oprette synkroniserede Collections samlinger:
synchronizedList(List<T> list): Returnerer en synkroniseret (trådsikker) liste, der understøtter samme kontrakt som den angivne liste.
Main.java
1List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set): Returnerer et synkroniseret (trådsikkert) sæt, der understøtter samme kontrakt som det angivne sæt.
Main.java
1Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m): Returnerer et synkroniseret (trådsikkert) map, der understøtter samme kontrakt som det overførte map.
Main.java
1Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list): Returnerer en uforanderlig liste med de samme elementer som den angivne liste.
Main.java
123456789101112131415package com.example; import java.util.Collections; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { List<Integer> unmodifiableList = Collections.unmodifiableList(new ArrayList<>(List.of(1,2,3))); System.out.println(unmodifiableList); // output [1,2,3] unmodifiableList.add(4); // throw exception `UnsupportedOperationException` } }
unmodifiableMap(Map<? extends K, ? extends V> m): Returnerer et uforanderligt map med de samme mappinger som det angivne map.
Main.java
12345678910111213package com.example; import java.util.Collections; import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) { Map<Integer, Integer> unmodifiableMap = Collections.unmodifiableMap(new HashMap<>()); unmodifiableMap.put(1, 2); // exception `UnsupportedOperationException` } }
unmodifiableSet(Set<? extends T> set): Returnerer et ikke-modificerbart sæt med de samme elementer som det angivne sæt.
Main.java
12345678910111213package com.example; import java.util.Collections; import java.util.Set; import java.util.HashSet; public class Main { public static void main(String[] args) { Set<Integer> unmodifiableSet = Collections.unmodifiableSet(new HashSet<>()); unmodifiableSet.add(4); // exception `UnsupportedOperationException` } }
Hvad er så forskellen mellem at oprette synkroniserede collections gennem normale implementeringer (dem, der er diskuteret i de foregående kapitler) og ved at bruge Collections metoder?
Lad os se på forskellen ved at bruge én Map collection som eksempel
Forskelle mellem ConcurrentHashMap og synchronizedMap()
ConcurrentHashMap anvender en avanceret metode kaldet lock splitting, som opdeler map i segmenter og synkroniserer operationer kun på segmentniveau. Denne tilgang muliggør, at flere tråde samtidig kan læse og skrive data på forskellige segmenter af mappet, hvilket forbedrer samtidighed og ydelse.
Metoden synchronizedMap() indkapsler det oprindelige map i et synkroniseret proxy-objekt. Alle metoder i dette proxy-objekt er synkroniserede, hvilket sikrer trådsikkerhed. Denne tilgang kan dog reducere ydeevnen i et multitrådet miljø på grund af den høje låsefrekvens.
For eksempel, hvis ConcurrentHashMap skriver til forskellige buckets, vil trådene ikke blokere hinanden. Hvis én bucket derimod tilgås af 2 tråde, vil én af dem vente. Hvis samlingen derimod er oprettet via synchronizedMap(), vil kun 1 tråd have adgang til alle buckets, og hele mappet er blokeret.
Dette betyder, at indtil én tråd er færdig med sit arbejde, vil andre tråde ikke kunne få adgang. Som resultat udføres operationer i ConcurrentHashMap ganske enkelt hurtigere.
Der findes også andre metoder i Collections til praktisk arbejde med samlinger:
Klassen Collections tilbyder praktiske metoder til at arbejde med collections i Java, hvilket forenkler ofte anvendte operationer. Synkroniserede collections oprettet via Collections-metoder er nyttige for trådsikkerhed, men til mere komplekse multitrådede opgaver anbefales det at anvende collections fra pakken java.util.concurrent.
1. Hvilken metode i Collections-klassen bruges til at oprette en uforanderlig liste?
2. Hvilken af følgende metoder i Collections-klassen returnerer et trådsikkert map?
3. Hvad er forskellen mellem ConcurrentHashMap og synchronizedMap?
Tak for dine kommentarer!