天天看点

为什么说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同样要争元素的唯一性,不允许存放重复元素

继续阅读