首先介绍一下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同样要争元素的唯一性,不允许存放重复元素