LinkedHashSet的特点LinkedHashSet是基于哈希表和链表实现的,其内部使用了一个哈希表来存储元素,并使用一个链表来维护元素的插入顺序。 LinkedHashSet相对于HashSet的优势在于可以维护元素的插入顺序,这意味着可以使用LinkedHashSet来按照元素的插入顺序遍历集合。 LinkedHashSet的常用方法LinkedHashSet继承自HashSet,因此除了维护插入顺序的功能外,其还拥有HashSet的所有特性和方法。 下面是LinkedHashSet常用的方法:boolean add(E e):向LinkedHashSet中添加一个元素,如果集合中已经包含该元素,则返回false。 LinkedHashSet的示例下面给出一个使用LinkedHashSet的示例,该示例演示了如何使用LinkedHashSet来去除字符串中的重复字符,并保留字符的原始顺序。
转载请以链接形式标明出处: 本文出自:103style的博客 base on jdk_1.8.0_77 简介 通过上图我们知道LinkedHashSet是 HashSet 的子类,构造方法也是对应的
System.out.println(s.getName() + "----" + s.getAge()); } System. out.println("-----------------LinkedHashSet ----------------------"); LinkedHashSet<Student> set2= new LinkedHashSet<>(); set2.add -----HashSet---------------------- E----20 B----11 A----10 C----12 D----12 D----12 -----------------LinkedHashSet
LinkedHashSet 源码分析 1. 基本结构 如果你看了 HashSet 现在基本一分钟就能弄明白 LinkedHashSet 的底层原理。里面没有任何字段,只有一个序列化 id,这个我们不说。 但是调用的父类的构造方法都是同一个,很明显肯定是那个比较特殊的构造,也就是只能在包内访问,并且比其他的方法多一个 bool 参数的那个,因为它能指定底层的数据结构是 LinkedHashMap ,这也就解释了为什么 LinkedHashSet
一,LinkedHashSet源码分析 这里打算分析一下linkedHashSet的源码,也基本上把hashSet源码的方法实现过了一下,所以后面就不分析hashSet的源码了,其实这篇内容在我看来也仅仅帮助需要的人可以快速了解一下 set方法的基本实现,但是并不详细,理解hashSet的使用场景以及linkedHashSet的业务场景就非常有必要了。 2,方法分析 2.1,构造函数 (1) //构造一个默认容量为16,负载因子为0.75的hashSet public LinkedHashSet() { super(16, .75f, true); } (2) //其实hashset以及linkedHashSet底层实现都是map实现的,那我们继续~ HashSet(int initialCapacity 底层实现是基于hashMap实现的,我虽然分析了hashTable的源码,但却没有分析hashMap的源码,如果一上来就分析linkedHashSet的源码,也仅仅对其基本的方法做个大致的理解,本质上还是没有什么变化
那么在这一篇我们将学习LinkedHashSet集合的知识。在HashSet这篇文章中我们已经介绍过HashSet底层也是通过HashMap集合实现的。 所以我们通过LinkedHashSet集合的名字就基本可以猜到,LinkedHashSet集合底层应该就是用LinkedHashMap集合实现的。 这是因为只有LinkedHashMap这种集合的底层实现才能保证LinkedHashSet集合添加元素的顺序与访问元素的顺序一致,这也就是LinkedHashSet集合相比HashSet集合的一种独特的特性 还是和其它集合一样 ,我们首先看LinkedHashSet集合的初始化。 初始化 ? 下面我们看一下LinkedHashSet中add方法的底层实现。 ? 总结 LinkedHashSet集合可以保证添加元素的顺序与访问元素的顺序一致 LinkedHashSet集合不能保存相同的元素 LinkedHashSet集合并不是线程安全的集合类
LinkedHashSet 继承了 HashSet,在此基础上维护了元素的插入顺序。 原理 LinkedHashSet 的源码非常简单,只有简单的四4个构造方法。 public LinkedHashSet() { super(16, .75f, true); } public LinkedHashSet(Collection<? 这里我们要注意一个细节,即 LinkedHashSet 调用的都是 HashSet 的三个参数构造方法,即 HashSet 的这个方法。 总结 LinkedHashSet 是在 HashSet 的基础上,维护了元素的插入顺序。
概述: LinkedHashSet: 元素唯一,元素无索引,元素存取有序 由哈希表结构保证元素唯一,由链表保证元素存取有序 案例: public class Demo1 { public static void main(String[] args) { // 1.创建一个LinkedHashSet集合,指定集合中元素的类型为String类型 LinkedHashSet<String> set = new LinkedHashSet<>(); // 2.往集合中添加一些元素 set.add("张三"); set.add("李四"); set.add("王五"); set.add("赵六");
因此,我们需要LinkedHashSet,在HashSet的基础上保证了元素插入的顺序。本文将对LinkedHashSet进行原理及实现的解析,帮助读者更好地理解LinkedHashSet。 LinkedHashSet提供了以下构造方法: public LinkedHashSet() public LinkedHashSet(int initialCapacity) public LinkedHashSet LinkedHashSet。 LinkedHashSet。 <String> linkedHashSet = new LinkedHashSet<>(); // 向集合中添加元素 linkedHashSet.add("A");
LinkedHashSet LinkedHashSet内部是如何工作的 LinkedHashSet是HashSet的一个“扩展版本”,HashSet并不管什么顺序,不同的是LinkedHashSet会维护 这篇文章,我们将会看到LinkedHashSet内部是如何运作的及如何维护插入顺序的。 我们首先着眼LinkedHashSet的构造函数。在LinkedHashSet类中一共有4个构造函数。 LinkedHashSet是如何维护插入顺序的 LinkedHashSet使用LinkedHashMap对象来存储它的元素,插入到LinkedHashSet中的元素实际上是被当作LinkedHashMap LinkedHashSet<String> set = new LinkedHashSet<String>(); //Adding elements to LinkedHashSet 看一遍LinkedHashSet和LinkedHashMap的源码, 你就能够准确地理解在Java中LinkedHashSet内部是如何工作的。
除了基本的添加、删除、查找等操作,LinkedHashSet还提供了一些其他的常用方法,包括:clear():清空集合中的所有元素。 下面是一个使用LinkedHashSet的示例程序,演示了它的常见操作:import java.util.LinkedHashSet;public class LinkedHashSetExample { public static void main(String[] args) { LinkedHashSet<String> set = new LinkedHashSet<>(
本文主要介绍集合框架Set接口下的实现类LinkedHashSet底层添加元素机制。 首先,Set接口下的集合的特点一般有三个:无序、不可重复、无索引。 -> 按照从头节点到尾节点的顺序进行遍历 -> 从而与插入顺序保持的一致,也验证了LinkedHashSet的有序 存疑,如果形成了环会不会影响遍历? LinkedHashSet 的双重结构 LinkedHashSet 实际上是: 一个 HashMap(用于快速查找,解决哈希冲突的拉链法) 一个双向链表(维护插入顺序) 当你描述 "索引3挂了元素 但 LinkedHashSet 的 双向链表 是独立于 HashMap 的冲突链表的。 2. 因此,LinkedHashSet 不会因为哈希冲突形成环。 4.
LinkedHashSet和LinkedHashMap在Java里也有着相同的实现,前者仅仅是对后者做了一层包装,也就是说LinkedHashSet里面有一个LinkedHashMap(适配器模式)。 将对象放入到LinkedHashMap或LinkedHashSet中时,有两个方法需要特别关心: hashCode()和equals()。 所以,如果要将自定义的对象放入到LinkedHashMap或LinkedHashSet中,需要@Override hashCode()和equals()方法。 前面已经说过LinkedHashSet是对LinkedHashMap的简单包装,对LinkedHashSet的函数调用都会转换成合适的LinkedHashMap方法,因此LinkedHashSet的实现非常简单 { ...... // LinkedHashSet里面有一个LinkedHashMap public LinkedHashSet(int initialCapacity, float
概述 LinkedHashSet与HashSet类似, 不同的是LinkedHashSet底层使用LinkedHashMap维护元素插入的顺序. LinkedHashSet继承自HashSet, 只是重写了HashSet的构造方法, 初始化一个LinkedHashMap, 其他均与HashSet相同. LinkedHashSet构造方法 ? 以上几乎就是LinkedHashSet的全部代码了. Linked通过调用父类HashSet专为LinkedHashSet提供的构造方法来完成, 该方法为包访问权限, 并未对外公开.
文章目录 Pre 概述 数据结构 类继承关系 构造函数 方法 get() put() remove() LinkedHashSet 使用案例 - FIFO策略缓存 ---- Pre Java Review 那同样的套路 , LinkedHashSet和LinkedHashMap在Java里也有着相同的实现,LinkedHashSet仅仅是对LinkedHashMap做了一层包装,也就是说LinkedHashSet 对于插入元素较多的场景,将初始容量设大可以减少重新哈希的次数 将对象放入到LinkedHashMap或LinkedHashSet中时,有两个方法需要特别关心: hashCode()和equals( LinkedHashSet是对LinkedHashMap的简单包装,对LinkedHashSet的函数调用都会转换成合适的LinkedHashMap方法,因此LinkedHashSet的实现非常简单 { ...... // LinkedHashSet里面有一个LinkedHashMap public LinkedHashSet(int initialCapacity, float
---- 问题 (1)LinkedHashSet的底层使用什么存储元素? (2)LinkedHashSet与HashSet有什么不同? (3)LinkedHashSet是有序的吗? 我们今天的主角LinkedHashSet就有这个功能,它是怎么实现有序的呢?让我们来一起学习吧。 源码分析 LinkedHashSet继承自HashSet,让我们直接上源码来看看它们有什么不同。 package java.util; // LinkedHashSet继承自HashSetpublic class LinkedHashSet<E> extends HashSet<E> implements public LinkedHashSet(Collection<? 总结 (1)LinkedHashSet的底层使用LinkedHashMap存储元素。 (2)LinkedHashSet是有序的,它是按照插入的顺序排序的。
与HashSet相比,LinkedHashSet可以保证元素的插入顺序,这是因为LinkedHashSet内部维护了一个链表来记录元素的插入顺序。 LinkedHashSet内部维护了一个链表,可以利用迭代器快速遍历元素。 使用LinkedHashSet可以避免并发修改异常。 缺点 LinkedHashSet的性能比HashSet略低,因为LinkedHashSet需要维护链表。 LinkedHashSet相对于TreeSet来说,缺少排序功能。 类代码方法介绍 构造函数 public LinkedHashSet(); public LinkedHashSet(int initialCapacity); public LinkedHashSet( 以下是一个通过迭代器遍历LinkedHashSet中元素的例子: // 创建一个LinkedHashSet LinkedHashSet<String> set = new LinkedHashSet<>
主要用于递归集合,返回一个Iterator()对象 remove( ) 从集合中去掉特定的对象 size( ) 返回集合的大小 JAVA中的set有三种:HashSet,TreeSet和LinkedHashSet ①HashSet的输出顺序是不确定的,但是它的速度最快; ②TreeSet输出顺序是升序排列的,相当于C++中的set,个人比较喜欢这种; ③LinkedHashSet输出顺序是确定的,就是插入时的顺序 TreeSet输出顺序是升序排列的,相当于C++中的set System.out.print("TreeSet的输出顺序:"); Cmp(set2); //LinkedHashSet 输出顺序是确定的,就是插入时的顺序 System.out.print("LinkedHashSet的输出顺序:"); Cmp(set3); } } 运行代码后结果如下 : HashSet的输出顺序:1 99 6 23 88 58 耗时(单位:纳秒):263293 TreeSet的输出顺序:1 6 23 58 88 99 耗时(单位:纳秒):554667 LinkedHashSet
map.containsKey(o); } iterator public Iterator<E> iterator() { return map.keySet().iterator(); } LinkedHashSet float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); } public LinkedHashSet (int initialCapacity) { super(initialCapacity, .75f, true); } public LinkedHashSet() { super(16, .75f, true); } 所以说,LinkedHashSet 还是使用 LinkedHashMap 实现的。
HashSet存储自定义类型元素 LinkedHashSet java.util.Set接口和 java.util.List接口一样,同样继承自 Collection接口,它与 Collection Set集合有多个子类,这里我们介绍其中的 java.util.HashSet、 java.util.LinkedHashSet这两个集合。 } } } 执行结果: Student [name=李四, age=66] Student [name=张三, age=43] Student [name=王五, age=23] LinkedHashSet 在HashSet下面有一个子类java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。 public class LinkedHashSetDemo { public static void main(String[] args) { Set<String> set = new LinkedHashSet