Junior
Jaký je rozdíl mezi rozhraními List a Set v jazyce Java?
sobes.tech AI
Odpověď od AI
Hlavní rozdíly mezi rozhraními List a Set v Javě jsou:
-
Pořadí prvků:
Listzachovává pořadí přidání prvků. Prvky mají indexy začínající od 0.Setnezaručuje pořadí prvků. Některé implementace (napříkladLinkedHashSet,TreeSet) mohou mít určité pořadí, ale rozhraníSetto nevyžaduje.
-
Duplikáty:
Listumožňuje ukládání duplicitních prvků.Setneumožňuje ukládání duplicitních prvků. Při pokusu o přidání duplicitního prvku je operace buď ignorována, nebo vracífalse(závisí na implementaci a metodě).
-
Výkon:
- Operace přidání a odstranění uprostřed
Listmohou být pomalejší (zejména uArrayList) než uSet. - Kontrola existence prvku (
contains) vSetzaloženém na hashování (HashSet) je obvykle rychlejší (průměrně O(1)) ve srovnání sList(průměrně O(n)). - Operace založené na indexu (
get,set) jsou dostupné pouze vList.
- Operace přidání a odstranění uprostřed
-
Implementace:
- Typické implementace
List:ArrayList,LinkedList,Vector. - Typické implementace
Set:HashSet,LinkedHashSet,TreeSet.
- Typické implementace
Zde jsou příklady, které ukazují rozdíly:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CollectionDifferences {
public static void main(String[] args) {
// List umožňuje duplicitní prvky a zachovává pořadí
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Apple"); // Přidání duplicitního prvku
System.out.println("List: " + list); // Vypíše [Apple, Banana, Apple]
System.out.println("Prvek na indexu 1: " + list.get(1)); // Přístup podle indexu
// Set neumožňuje duplicitní prvky a pořadí není garantováno (pro HashSet)
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Apple"); // Pokus o přidání duplicitního prvku - bude ignorováno
System.out.println("Set: " + set); // Vypíše něco jako [Apple, Banana] nebo [Banana, Apple]
// set.get(1); // Chyba kompilace - není přístup podle indexu
}
}
Porovnávací tabulka:
| Charakteristika | List | Set |
|---|---|---|
| Pořadí | Garantované (pořadí přidání) | Není garantované (pro HashSet), řazené (TreeSet) |
| Duplikáty | Povolené | Nepovolené |
| Přístup podle indexu | Možný (get(int index)) |
Není možný |
| Výkon contains() | O(n) průměrně (pro ArrayList) | O(1) průměrně (pro HashSet) |
| Typické implementace | ArrayList, LinkedList, Vector | HashSet, LinkedHashSet, TreeSet |