Java linkedhashset,java集合hashset用法
00-1010一、HashSet II介绍。存储数据的HashSet的结构(哈希表)1。什么是哈希表?三。HashSet存储自定义类型元素IV。链接哈希集前言:
与java.util.List接口一样,java.util.Set接口也继承自Collection接口。与集合接口中的方法基本相同,不扩展集合接口的功能,但比集合接口更严格。与列表界面不同,集合界面中的元素是无序的,使用一些规则来保证存储的元素不会出现重复。Set有很多子类,这里我们介绍其中的两个,java.util.HashSet和java.util.LinkedHashSet
tips:集可以通过迭代器获取元素,并为。
00-1010java.util.hashset是set接口的实现类。它存储的元素是不可重复的,并且所有元素都是无序的(即访问顺序不一致)。java.util.HashSet的底层实现实际上是java.util.HashMap支持。
HashSet根据对象的哈希值确定元素在集合中的存储位置,因此具有良好的访问和搜索性能。保证元素唯一性的方法取决于:hashCode和equals方法。
我们先来使用一下Set集合存储,看下现象,再进行原理的讲解:
class hashSet demo { public static void main(string[]args){//Create a set set hashSet string set=new hashSet string();//添加元素set.add(新字符串( CBA ));set . add( ABC );set . add( BAC );set . add( CBA );//遍历for(string name 3360 set){ system . out . println(name);} } }输出结果如下,说明集合中不能存储重复元素:
cbaabcbac
根据tips:的结果,我们发现只存储了一个字符串“cba ”,这意味着没有存储重复的元素集。
目录
00-1010JDK1.8,之前的哈希表底层是通过数组链表实现的,即使用链表来处理冲突,哈希值相同的链表都存储在一个链表中。然而,当桶中有许多元素时,即有许多具有相等散列值的元素时,顺序搜索键值的效率较低。但在JDK1.8中,哈希表存储是通过数组链表红黑树实现的。当链表长度超过阈值(8)时,链表转换为红黑树,大大减少了搜索时间。
简单来说,哈希表是通过数组链表的红黑树实现的(JDK1.8增加了红黑树部分),
如下图所示:
看到这张图,有人会问,这是怎么储存的?
为了方便大家的理解我们结合一个存储流程图来说明一下:
综上所述,JDK1.8红黑树的引入大大优化了HashMap的性能,所以对我们来说,保证HashSet中元素的唯一性实际上是由对象的hashCode和equals方法决定的。如果我们在集合中存储一个自定义对象,那么为了确保它的惟一性,我们必须重写hashCode和equals方法来创建一个属于
当前对象的比较方式。
三、HashSet存储自定义类型元素
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一。
创建自定义Student类:
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age); }}
public class HashSetDemo2 { public static void main(String[] args) { //创建集合对象 该集合中存储 Student类型对象 HashSet<Student> stuSet = new HashSet<Student>(); //存储 Student stu = new Student("张三", 43); stuSet.add(stu); stuSet.add(new Student("李四", 66)); stuSet.add(new Student("张三", 43)); stuSet.add(new Student("王五", 23)); stuSet.add(stu); for (Student stu2 : stuSet) { System.out.println(stu2); } }}
执行结果:
Student [name=李四, age=66]Student [name=张三, age=43]Student [name=王五, age=23]
四、LinkedHashSet
我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?
在HashSet下面有一个子类java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。
演示代码如下:
public class LinkedHashSetDemo {public static void main(String[] args) {Set<String> set = new LinkedHashSet<String>();set.add("bbb");set.add("aaa");set.add("abc");set.add("bbc"); Iterator<String> it = set.iterator();while (it.hasNext()) {System.out.println(it.next());}}}
结果:
bbb aaa abc bbc
到此这篇关于Java Set集合及其子类HashSet与LinkedHashSet详解的文章就介绍到这了,更多相关Java Set集合 内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。