为什么说HashSet是无序的

首先介绍一下HashSet接口

java.util.Set接口 extends Collection接口

一个不包含重复元素的 collection

HashSet不包含带索引的方法

HashSet是一个哈希表结构,查询速度非常快,是一个无序集合,此实现不是同步的,意思就是多线程

HashSet会自动排序

顺带着说一下哈希值

哈希值是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑值,是模拟出来的地址,并不是数据实际储存的 物理地址)

在Object类中有一个方法,可以获取对象的哈希值

int hashCode() 返回对象的哈希码值
public native int hashCode();
native :代表该方法调用的是本地操作系统的方法

哈希表结构是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同样要争元素的唯一性,不允许存放重复元素

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值