Java Collection - Set

Set

一種不允許重複元素的集合

特性

唯一性:

Set 集合不允許重複的元素。

無序性:

大多數 Set 實現不保證元素的順序。但 LinkedHashSet 例外,它按照元素插入的順序保存元素。

null 值:

大多數 Set 實現允許集合中有一個 null 元素(TreeSet 除外)。

主要方法

  • add(E e):將指定元素添加到集合中,如果該元素已存在則不添加。
  • remove(Object o):從集合中移除指定元素。
  • contains(Object o):檢查集合是否包含指定元素。
  • size():返回集合中的元素數量。
  • isEmpty():檢查集合是否為空。
  • iterator():返回一個用於遍歷集合的迭代器。

實現

print 出來的結果放在 https://github.com/shengshengyang/java-for-practice/blob/master/src/Collection/Set/ShowSet.java

HashSet

特性

  • HashSet 是基於哈希表的 Set 接口實現。
  • 它不保證集合的迭代順序;特別是它不保證該順序恆久不變。
  • 允許使用 null 元素。
  • 比較高效的查找和插入性能。

LinkedHashSet

特性

  • LinkedHashSet 是 HashSet 的一個子類,維護著一個運行於所有條目的雙重鏈接列表。
  • 保留了元素的插入順序
  • 略微低於 HashSet 的查找和插入效率,但在迭代訪問整個集合時有更好的性能。

TreeSet

特性

  • TreeSet 是基於紅黑樹(Red-Black tree)的 NavigableSet 實現。
  • 元素按升序排序。
  • 提供了許多有關排序的操作,如 first(), last(), headSet(), tailSet(), 等等。
  • 不允許 null 元素。
  • 插入和查找的效率低於 HashSet。

比較

特性 HashSet LinkedHashSet TreeSet
底層數據結構 哈希表 鏈接哈希表 紅黑樹
排序 無序 插入順序 自然排序或自定義排序
null 元素 允許 允許 不允許
性能(查找、插入) 略低於 HashSet 低於 HashSet
迭代順序 不固定 插入順序 排序順序
適用情景 需快速查找,無序 保持插入順序 有序集合、範圍查詢

自行實作

https://github.com/shengshengyang/java-for-practice/blob/master/src/Collection/Set/SimpleSet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

public class SimpleSet<E> implements Set<E> {
private Object[] elements;
private int size = 0;

public SimpleSet() {
elements = new Object[10]; // 初始容量設為 10
}

@Override
public boolean add(E e) {
if (!contains(e)) {
if (size == elements.length) {
increaseCapacity(); // 如果陣列滿了,增加容量
}
elements[size++] = e;
return true;
}
return false;
}

private void increaseCapacity() {
Object[] newElements = new Object[elements.length * 2];
System.arraycopy(elements, 0, newElements, 0, elements.length);
elements = newElements;
}

@Override
public boolean contains(Object o) {
for (int i = 0; i < size; i++) {
if (elements[i].equals(o)) {
return true;
}
}
return false;
}

@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
private int currentIndex = 0;

@Override
public boolean hasNext() {
return currentIndex < size;
}

@Override
public E next() {
return (E) elements[currentIndex++];
}

};
}
}


Java Collection - Set
https://shengshengyang.github.io/2024/01/30/java-set/
作者
Dean Yang
發布於
2024年1月30日
許可協議