John Squirrels
等級 41
San Francisco

Java集

在 Toto sisi 群組發布
Set是 Java Collection Framework 中的一個接口。您可以使用 Java Set來實現具有唯一元素的無序集合。在本文中,我們將研究此接口及其在 Java 語言中的實現、使用集合的方法,並提供一些示例。

什麼是 Java 集

Set是 Java Collection Framework 的接口,但Set不是有序集合,這與List不同。這意味著 Java Set元素的保存沒有特定的順序。因此無法控制可以插入元素的位置。您也不能通過索引訪問元素。從數學上講,Set是唯一元素的集合。實際上,這是一個無序集合(unordered Collection),其中不能存儲相同的元素。如果您有意向Set添加重複元素,則此操作將被忽略並且Set不會更改。但是允許在其中存儲一個空元素。

設置實現

Java Set是一個接口,因此您需要使用其實現之一來創建對象。它們是HashSetTreeSetLinkedHashSet。在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 個SetHashSetLinkedHashSet,並為每個添加了 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);
    }
}
這是程序的輸出:
[亞歷克斯、伊戈爾、斯圖爾特、約翰尼、貝爾] [斯圖爾特、亞歷克斯、約翰尼、伊戈爾、貝爾]
正如我們上面提到的,HashSet不維護元素的順序,而LinkedHashSet維護。LinkedHashSet按照我們將元素寫入集合的順序為我們提供了元素。

Java 設置方法

以下是 Java Set 的一些重要方法:
  • 布爾加法(E e)。如果指定的元素不存在,則將其添加到集合中(可選操作)。

  • 布爾刪除(對象 o)。如果指定元素存在(可選操作),則從該集合中移除指定元素。

  • 布爾 removeAll(Collection c)。從此集合中刪除指定集合中包含的所有元素(可選操作)。

  • 布爾保留全部(集合 c)。僅保留此集合中包含在指定集合中的元素(可選操作)。

  • 無效清除()。從集合中移除所有元素。

  • 迭代器 iterator()。返回此集合中元素的迭代器。

  • 整數大小()。它用於獲取 Set 中元素的數量。

  • 布爾 isEmpty()。檢查 Set 是否為空。

  • 布爾值包含(對象 o)。如果此 Set 包含指定元素,則返回 true。

  • 迭代器 iterator()。返回此集合中元素的迭代器。返回的元素沒有特定的順序。

  • 對象[] 到數組()。返回包含此集合中所有元素的數組。如果此集合對其迭代器返回其元素的順序作出任何保證,則此方法必須以相同的順序返回元素。

這些方法類似於ArrayList的方法,不同之處在於add(Object o)方法僅將一個對象添加到集合中(如果它不存在)。如果已添加對象,則該方法的返回值為 true,否則為 false。還有一些方法繼承自Collection<>接口:parallelStream()removeIf()stream()forEach()方法繼承自java.lang.Iterable接口。

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());

   }
}
該程序的輸出在這裡:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] set 的元素數量 = 5 mySet 是否為空?false 伊戈爾在集合中嗎?false 約翰尼在集合中嗎?true mySet 現在是空的嗎?真的

使用 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]);

       }
   }
這是程序的輸出:
[C, D, E, F, G, A, B] false 打印刪除元素的集合:[C, D, E, G, A, B] 來自集合的新數組:[C, D, E, G, A, B] C

使用迭代器設置示例

讓我們創建一個集合,然後使用迭代器將其打印出來,然後從中刪除所有偶數,同樣使用迭代器。

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);

       }
}
該程序的輸出在這裡:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

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 的一部分。

  • 實現的類:AbstractSetConcurrentHashMap.KeySetViewConcurrentSkipListSetCopyOnWriteArraySetEnumSetHashSetJobStateReasonsLinkedHashSetTreeSet

  • 最流行的Set實現是HashSetLinkedHashSetTreeSet

  • HashSet元素順序由複雜的算法確定。如果存儲順序對您很重要,請使用TreeSet容器,它存儲按比較順序按升序排序的對象,或者使用LinkedHashSet,它按加法順序存儲元素。

  • 大多數情況下,集合用於測試成員資格。也就是說,檢查一個對像是否屬於數學意義上的給定集合。因此,在實踐中,大多數情況下,在所有Set實現中,通常會選擇HashSet 。此實現針對快速搜索進行了優化。

  • 您不能向集合中添加重複元素,因此您可以使用Set接口的實現來存儲唯一元素。

  • Set允許您只添加一個空元素。

  • Set不是列表,不支持其元素的索引或位置。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION