天天看點

為什麼說HashSet是無序的

首先介紹一下HashSet接口

java.util.Set接口 extends Collection接口

一個不包含重複元素的 collection

HashSet不包含帶索引的方法

HashSet是一個哈希表結構,查詢速度非常快,是一個無序集合,此實作不是同步的,意思就是多線程

HashSet會自動排序

順帶着說一下哈希值

哈希值是一個十進制的整數,由系統随機給出(就是對象的位址值,是一個邏輯值,是模拟出來的位址,并不是資料實際儲存的 實體位址)

在Object類中有一個方法,可以擷取對象的哈希值

int hashCode() 傳回對象的哈希碼值

public native int hashCode();

native :代表該方法調用的是本地作業系統的方法

哈希表結構是HashSet結合儲存資料的結構

哈希表結構儲存資料如下圖

為什麼說HashSet是無序的

代碼分别用HashSet和LinkedHashSet向集合中添加元素并進行輸出對比

package com.qy.ds.Demo2;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;

public class Demo05LinkedHashSet {
    public static void main(String[] args) {
        HashSet<String> hss = new HashSet<>();
        hss.add("Hello");
        hss.add("World");
        hss.add("abc");
        hss.add("abc");

        Iterator<String> is = hss.iterator();
        while (is.hasNext()){
            System.out.println(is.next());
        }
        
         System.out.println("上邊是HashSet集合");
        System.out.println("*********************");
        System.out.println("下邊是LinkedHashSet集合");
        
        LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add("Hello");
        linkedHashSet.add("World");
        linkedHashSet.add("abc");
        linkedHashSet.add("abc");
        Iterator<String> il = linkedHashSet.iterator();
        while (il.hasNext()){
            System.out.println(il.next());
        }
    }
}
           

讓我們看一下輸出結果

abc
Hello
World
上邊是HashSet集合
*********************
下邊是LinkedHashSet集合
Hello
World
abc
           

很明顯HashSet集合輸入的資料,在輸出時順序改變了,而LinkedHashSet,隻是去掉了重複元素,其他元素和輸入時的順序相同。

LinkedHashSet

可以使存放到集合中的元素有序,HashSet保證元素唯一,但元素放進去是沒有順序的

LinkedHashset 是由連結清單和哈希表(由數組+連結清單/紅黑樹)組成的一個資料儲存結構

這裡說的HashS是無序的 意思是存和取得順序不一樣 就是無序

而LinkedHashSet 存和取得順序一樣,稱之為有序,且LinkedHashSet同樣要争元素的唯一性,不允許存放重複元素

繼續閱讀