什麼是 Java 集
Set是 Java Collection Framework 的接口,但Set不是有序集合,這與List不同。這意味著 Java Set元素的保存沒有特定的順序。因此無法控制可以插入元素的位置。您也不能通過索引訪問元素。從數學上講,Set是唯一元素的集合。實際上,這是一個無序集合(unordered Collection),其中不能存儲相同的元素。如果您有意向Set添加重複元素,則此操作將被忽略並且Set不會更改。但是允許在其中存儲一個空元素。設置實現
Java Set是一個接口,因此您需要使用其實現之一來創建對象。它們是HashSet、TreeSet和LinkedHashSet。在Set中,每個元素僅存儲在一個實例中,並且 Set 的不同實現使用不同的順序來存儲元素。在HashSet中,元素的順序由複雜的算法確定。如果存儲順序對您很重要,請使用TreeSet容器,它存儲按比較順序按升序排序的對象,或LinkedHashSet, 它以加法順序存儲元素。集合通常用於成員資格測試,以便您可以輕鬆檢查對像是否屬於給定集合,因此在實踐中通常選擇針對快速查找進行優化的 HashSet實現。HashSet是一個集合,它使用hashCode()方法返回的它們的哈希值在內部存儲元素。即在HashSet<E>內部,存儲了HashMap<E, Object>對象,該對象將HashSet的值存儲為鍵。使用哈希碼可以讓您快速搜索、添加和刪除Set中的元素。 LinkedHashSet是一個HashSet它還將元素存儲在鍊錶中。普通的HashSet不維護元素順序。首先,官方根本不存在,其次,只要添加一個元素,即使內部順序也會發生巨大變化。您可以從LinkedHashSet獲取一個迭代器,並使用它按照元素添加到 LinkedHashSet 的確切順序遍歷所有元素。不經常,但有時可能非常必要。TreeSet 是一個將元素存儲為按值排序的樹的集合。TreeSet<E>內部是一個存儲所有這些值的TreeMap<E, Object> 。還有這個TreeMap使用紅黑平衡二叉樹來存儲元素。因此,它具有非常快的add()、remove()、contains()操作。創建一個集合對象
要創建一個集合對象,您可以使用下一種形式:
Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
這是一個簡單的示例,我們創建了 2 個Set,HashSet和LinkedHashSet,並為每個添加了 5 個元素。為此, 我們可以使用add()方法。
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
Set mySet = new HashSet();
Set mySet2 = new LinkedHashSet();
//adding some string elements
mySet.add("Stuart");
mySet.add("Alex");
mySet.add("Johnny");
mySet.add("Igor");
mySet.add("Bel");
System.out.println(mySet);
mySet2.add("Stuart");
mySet2.add("Alex");
mySet2.add("Johnny");
mySet2.add("Igor");
mySet2.add("Bel");
System.out.println(mySet2);
}
}
這是程序的輸出:
Java 設置方法
以下是 Java Set 的一些重要方法:-
布爾加法(E e)。如果指定的元素不存在,則將其添加到集合中(可選操作)。
-
布爾刪除(對象 o)。如果指定元素存在(可選操作),則從該集合中移除指定元素。
-
布爾 removeAll(Collection c)。從此集合中刪除指定集合中包含的所有元素(可選操作)。
-
布爾保留全部(集合 c)。僅保留此集合中包含在指定集合中的元素(可選操作)。
-
無效清除()。從集合中移除所有元素。
-
迭代器 iterator()。返回此集合中元素的迭代器。
-
整數大小()。它用於獲取 Set 中元素的數量。
-
布爾 isEmpty()。檢查 Set 是否為空。
-
布爾值包含(對象 o)。如果此 Set 包含指定元素,則返回 true。
-
迭代器 iterator()。返回此集合中元素的迭代器。返回的元素沒有特定的順序。
-
對象[] 到數組()。返回包含此集合中所有元素的數組。如果此集合對其迭代器返回其元素的順序作出任何保證,則此方法必須以相同的順序返回元素。
Java Set 主要操作示例
在此示例中,我們創建了一個字符串數組,然後使用Arrays.asList操作將其傳遞給mySet。然後我們刪除更多元素,並添加更多元素。在這種情況下,集合中的一個元素已經存在:它不會被添加。我們還將嘗試檢查是否為空isEmpty()、確定集合的大小 size ()和清除集合中所有元素的操作clear()。
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class HashSetTest2 {
public static void main(String[] args) {
//creating a string Array with some names
String [] friends = {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
//creating a new set and adding elements from string array into it
Set<String> mySet = new HashSet<>(Arrays.asList(friends));
System.out.println(mySet);
//removing two elements from the set
mySet.remove("Igor");
mySet.remove("Stuart");
System.out.println(mySet);
//adding 2 new Elements into set
mySet.add("Dasha");
mySet.add("Alex"); //it's second Alex, can't be added
System.out.println(mySet);
//cheking the size of mySet
int size = mySet.size();
System.out.println("The quantity of set's elements = " + size);
//Checking if the set is empty
System.out.println("Is mySet empty? " + mySet.isEmpty());
//checking if some elements are in set
System.out.println("Is Igor in set? " + mySet.contains("Igor"));
System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
//deleting all elements from the set
mySet.clear();
System.out.println("Is mySet empty now? " + mySet.isEmpty());
}
}
該程序的輸出在這裡:
使用 LinkedHashSet 並設置為 Array 的示例
讓我們再寫一個程序。在其中,我們將基於LinkedHashSet創建一個集合,向其中添加元素,然後將該集合轉換為數組。
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSet3 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("C");
set.add("D");
set.add("E");
set.add("F");
set.add("G");
set.add("A");
set.add("B");
System.out.println(set);
set.remove("F");// removing an element from our set
set.remove("C sharp");//trying to remove element that isn't in set
System.out.println(set.remove("C sharp"));
System.out.println("Print our set with elements removed: ");
System.out.println(set);
//set to array
String strArray[] = set.toArray(new String[set.size()]);
System.out.println("New Array from set: ");
System.out.println(Arrays.toString(strArray));
System.out.println(strArray[0]);
}
}
這是程序的輸出:
使用迭代器設置示例
讓我們創建一個集合,然後使用迭代器將其打印出來,然後從中刪除所有偶數,同樣使用迭代器。
import java.util.*;
public class SetTest5
{
public static void main(String[] args)
{
Set<Integer> mySet = new HashSe<>();
for(int i = 0; i < 10; i++)
mySet.add(i);
Iterator iterator = mySet.iterator();
//simple iteration
while(iterator.hasNext()){
int i = (int) iterator.next();
}
System.out.println(" " + mySet);
//modification of mySet using iterator - removing all even numbers
iterator = mySet.iterator();
while(iterator.hasNext()){
int x = (int) iterator.next();
if(x%2 == 0) iterator.remove();
}
System.out.println(mySet);
}
}
該程序的輸出在這裡:
TreeSet 示例
如果排序對您很重要,請使用TreeSet實現。在這個簡短的例子中,我們將用朋友的名字填充集合,就像前面的例子一樣。但是,在排序的TreeSet中,元素將立即按排序順序寫入。在這種情況下,名稱將按字母順序顯示。
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
Set mySet = new TreeSet<>();
mySet.add("Stuart");
mySet.add("Alex");
mySet.add("Johnny");
mySet.add("Igor");
mySet.add("Bel");
System.out.println(mySet);
}
輸出是:
簡要結論
-
Java Set接口是 Java Collections Framework 的一部分。
-
實現的類:AbstractSet、ConcurrentHashMap.KeySetView、ConcurrentSkipListSet、CopyOnWriteArraySet、EnumSet、HashSet、JobStateReasons、LinkedHashSet、TreeSet。
-
最流行的Set實現是HashSet、LinkedHashSet和TreeSet。
-
HashSet元素順序由複雜的算法確定。如果存儲順序對您很重要,請使用TreeSet容器,它存儲按比較順序按升序排序的對象,或者使用LinkedHashSet,它按加法順序存儲元素。
-
大多數情況下,集合用於測試成員資格。也就是說,檢查一個對像是否屬於數學意義上的給定集合。因此,在實踐中,大多數情況下,在所有Set實現中,通常會選擇HashSet 。此實現針對快速搜索進行了優化。
-
您不能向集合中添加重複元素,因此您可以使用Set接口的實現來存儲唯一元素。
-
Set允許您只添加一個空元素。
-
Set不是列表,不支持其元素的索引或位置。
GO TO FULL VERSION