AbstractSet 類在Java中是一部分Java集合框架它實現了采集接口並擴展了AbstractCollection 類。它提供了 Set 接口的骨架實現。該類不會覆蓋 AbstractCollection 類的任何實現,而隻是添加 equals() 和 hashCode() 方法的實現。
通過擴展此類來實現 Set 的過程與通過擴展 AbstractCollection 來實現 Collection 的過程相同,隻是此類子類中的所有方法和構造函數都必須遵守 Set 接口施加的附加約束(例如, add 方法不得允許將對象的多個實例添加到集合中)。
從類層次結構圖可以看出,它實現了可迭代<E>,集合<E>,設置<E>接口。直接子類是ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,TreeSet。正如我們上麵已經討論過的,AbstractSet 是一個抽象類,因此應該為其分配一個子類的實例,例如 TreeSet、HashSet 或 EnumSet。
用法:宣言
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E>
其中 E 是該 Set 維護的元素類型。
抽象集的不同特征:
在Java中,AbstractSet類是一個實現Set接口的抽象類。 AbstractSet 的一些關鍵特征包括:
- 實現Set接口:AbstractSet實現了Set接口,這意味著它提供了一組標準的方法來操作集合。
- 實現一些設置方法:AbstractSet實現了Set接口的一些方法,例如size()、isEmpty()、contains()和remove()。
- 支持迭代器:AbstractSet 提供了一個迭代器方法,該方法返回集合中元素的迭代器。
- 不實現所有設置方法:AbstractSet是一個抽象類,並沒有實現Set接口的所有方法。一些未實現的方法包括add()、addAll()和clear()。這些方法必須由 AbstractSet 的子類實現。
- 提供默認實現:AbstractSet 提供 Set 接口的某些方法的默認實現,如果需要,可以由子類覆蓋。
- 支持空元素:AbstractSet 允許將 null 元素添加到集合中。
- Unordered:AbstractSet 是無序集合,這意味著不保留元素添加到集合中的順序。
- Thread-unsafe:AbstractSet不是線程安全的,這意味著如果多個線程同時訪問同一個集合,可能會導致數據不一致。如果需要線程安全,可以使用同步集或者並發集。
內部工作:
在內部,Java HashMap 被實現為一個鏈表數組,其中數組中的每個元素都是一個可以保存一個或多個鍵值對的存儲桶。數組大小由 HashMap 的初始容量(可以在創建期間指定)和負載因子(確定何時應調整 HashMap 的大小)決定。
當將鍵值對添加到 HashMap 時,首先使用鍵的 hashCode() 方法將鍵哈希到數組中的索引。該索引對應於數組中的一個桶。如果桶為空,則將鍵值對添加到桶中。如果桶不為空,則使用鏈表存儲哈希到同一索引的鍵值對。
當從 HashMap 檢索值時,鍵首先被散列到數組中的索引。然後遍曆該索引處的鏈表以查找具有指定鍵的鍵值對。如果在鏈表中找不到該鍵,則與該鍵關聯的值不在 HashMap 中。
當HashMap中的鍵值對數量超過負載因子與HashMap當前容量的乘積時,調整HashMap的大小以增加容量。調整大小涉及創建一個更大大小的新數組,然後將舊數組中的所有鍵值對重新哈希到新數組中。
JavaHashMap還使用了一種稱為開放尋址的技術,這意味著如果兩個鍵具有相同的哈希碼,則它們存儲在同一個桶中,但存儲在不同的鏈表中。當檢索與另一個鍵具有相同哈希碼的鍵的值時,Java HashMap 將首先使用 equals() 方法比較鍵,以確定要返回哪個鍵值對。如果存在衝突,則檢索值可能需要更長的時間,因為需要遍曆鏈表來查找鍵值對。
AbstractSet 類的構造函數
1. 受保護AbstractSet(): 默認構造函數,但受保護,它不允許創建 AbstractSet 對象。
AbstractSet<E> as = new TreeSet<E>();
Methods of AbstractSet
METHOD |
DESCRIPTION |
---|---|
AbstractSet.equals() | 比較指定對象與該集合是否相等。 |
AbstractSet.hashCode() | 返回該集合的哈希碼值。 |
AbstractSet.removeAll() | 從此集合中刪除指定集合中包含的所有元素(可選操作)。 |
示例 1:
Java
// Java Program to Illustrate AbstractSet Class
// Importing required classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args) throws Exception
{
// Try block to check for exceptions
try {
// Creating an empty TreeSet of integer type by
// creating object of AbstractSet
AbstractSet<Integer> abs_set
= new TreeSet<Integer>();
// Populating TreeSet
// using add() method
abs_set.add(1);
abs_set.add(2);
abs_set.add(3);
abs_set.add(4);
abs_set.add(5);
// Printing the elements inside above TreeSet
System.out.println("AbstractSet: " + abs_set);
}
// Catch block to handle the exceptions
catch (Exception e) {
// Display exception on console
System.out.println(e);
}
}
}
AbstractSet: [1, 2, 3, 4, 5]
示例 2:
Java
// Java Program to Illustrate Methods
// of AbstractSet class
// Importing required classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args) throws Exception
{
// Try block to check for exceptions
try {
// Creating an empty TreeSet of integer type
AbstractSet<Integer> abs_set
= new TreeSet<Integer>();
// Populating above TreeSet
// using add() method
abs_set.add(1);
abs_set.add(2);
abs_set.add(3);
abs_set.add(4);
abs_set.add(5);
// Printing the elements inside TreeSet
System.out.println("AbstractSet before "
+ "removeAll() operation : "
+ abs_set);
// Creating an ArrayList of integer type
Collection<Integer> arrlist2
= new ArrayList<Integer>();
// Adding elements to above ArrayList
arrlist2.add(1);
arrlist2.add(2);
arrlist2.add(3);
// Printing the ArrayList elements
System.out.println("Collection Elements"
+ " to be removed : "
+ arrlist2);
// Removing elements from AbstractSet specified
// using removeAll() method
abs_set.removeAll(arrlist2);
// Printing the elements of ArrayList
System.out.println("AbstractSet after "
+ "removeAll() operation : "
+ abs_set);
}
// Catch block to handle the exceptions
catch (NullPointerException e) {
// Display exception on console
System.out.println("Exception thrown : " + e);
}
}
}
輸出:
例子:
Java
import java.util.*;
public class MySet<E> extends MyAbstractSet<E> {
public static void main(String[] args) {
MySet<String> set = new MySet<>();
set.add("apple");
set.add("banana");
set.add("orange");
set.add("pear");
set.add("banana"); // duplicate element
System.out.println("Set contains apple: " + set.contains("apple"));
System.out.println("Set contains watermelon: " + set.contains("watermelon"));
System.out.println("Set size: " + set.size());
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
下麵定義了一些類或接口的其他方法,以某種方式幫助我們更好地理解AbstractSet類,如下所示:
類 java.util.AbstractCollection 中聲明的方法
METHOD |
DESCRIPTION |
---|---|
AbstractCollection add() | 確保此集合包含指定的元素(可選操作)。 |
AbstractCollection addAll() | 將指定集合中的所有元素添加到此集合中(可選操作)。 |
AbstractCollection clear() | 從此集合中刪除所有元素(可選操作)。 |
AbstractCollection contains() | 如果此集合包含指定元素,則返回 true。 |
AbstractCollection containsAll() | 如果此集合包含指定集合中的所有元素,則返回 true。 |
AbstractCollection isEmpty() | 如果此集合不包含任何元素,則返回 true。 |
AbsractCollection iterator() | 返回此集合中包含的元素的迭代器。 |
AbstractCollection remove() | 從此集合中刪除指定元素的單個實例(如果存在)(可選操作)。 |
AbstractCollection retainAll() | 僅保留此集合中包含在指定集合中的元素(可選操作)。 |
AbstractCollection toArray() | 返回一個包含此集合中所有元素的數組。 |
AbstractCollection toArray() | 返回一個包含該集合中所有元素的數組;返回數組的運行時類型是指定數組的運行時類型。 |
AbstractCollection toString() | 返回此集合的字符串表示形式。 |
Methods Declared in Interface java.util.Collection
METHOD |
DESCRIPTION |
---|---|
parallelStream() | 返回一個可能並行的 Stream 並以此集合作為其源。 |
removeIf(Predicate<? super E> 過濾器) | 刪除此集合中滿足給定謂詞的所有元素。 |
stream() | 返回以此集合作為源的順序 Stream。 |
toArray(IntFunction<T[]> 生成器) | 返回一個包含此集合中所有元素的數組,使用提供的生成器函數分配返回的數組。 |
Methods Declared in interface java.lang.Iterable
METHOD |
DESCRIPTION |
---|---|
Iterable forEach() | 對 Iterable 的每個元素執行給定的操作,直到處理完所有元素或該操作引發異常。 |
Methods Declared in interface java.util.Set
METHOD |
DESCRIPTION |
---|---|
Set add() | 如果指定元素尚不存在,則將其添加到該集合中(可選操作)。 |
Set addAll() | 如果指定集合中的所有元素尚不存在,則將它們添加到該集合中(可選操作)。 |
Set clear() | 刪除該集合中的所有元素(可選操作)。 |
Set contains() | 如果此集合包含指定元素,則返回 true。 |
Set containsAll() | 如果此集合包含指定集合的所有元素,則返回 true。 |
Set isEmpty() | 如果該集合不包含任何元素,則返回 true。 |
Set iterator() | 返回此集合中元素的迭代器。 |
Set remove() | 從此集合中刪除指定元素(如果存在)(可選操作)。 |
Set retainAll() | 僅保留此集中包含在指定集合中的元素(可選操作)。 |
Set size() | 返回該集合中的元素數量(其基數)。 |
spliterator() | 在此集合中的元素上創建一個 Spliterator。 |
Set toArray() | 返回一個包含該集合中所有元素的數組。 |
Set toArray() | 返回一個包含該集合中所有元素的數組;返回數組的運行時類型是指定數組的運行時類型。 |
相關用法
- Java AbstractSet toArray(T[])用法及代碼示例
- Java AbstractSet add()用法及代碼示例
- Java AbstractSet clear()用法及代碼示例
- Java AbstractSet contains()用法及代碼示例
- Java AbstractSet containsAll()用法及代碼示例
- Java AbstractSet equals()用法及代碼示例
- Java AbstractSet hashCode()用法及代碼示例
- Java AbstractSet isEmpty()用法及代碼示例
- Java AbstractSet removeAll()用法及代碼示例
- Java AbstractSet retainAll()用法及代碼示例
- Java AbstractSet size()用法及代碼示例
- Java AbstractSet toArray()用法及代碼示例
- Java AbstractSet toString()用法及代碼示例
- Java AbstractSequentialList addAll()用法及代碼示例
- Java AbstractSequentialList clear()用法及代碼示例
- Java AbstractSequentialList conatinsAll()用法及代碼示例
- Java AbstractSequentialList contains()用法及代碼示例
- Java AbstractSequentialList equals()用法及代碼示例
- Java AbstractSequentialList get()用法及代碼示例
- Java AbstractSequentialList hashCode()用法及代碼示例
- Java AbstractSequentialList indexOf()用法及代碼示例
- Java AbstractSequentialList isEmpty()用法及代碼示例
- Java AbstractSequentialList lastIndexOf()用法及代碼示例
- Java AbstractSequentialList remove()用法及代碼示例
- Java AbstractSequentialList removeAll()用法及代碼示例
注:本文由純淨天空篩選整理自RishabhPrabhu大神的英文原創作品 AbstractSet Class in Java with Examples。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。