学习
实践
活动
工具
TVP
写文章

HashSet

HashSet类,是存在于java.util包中的类。 Object clone() 返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。 boolean contains(Object o) 如果此 set 包含指定元素,则返回 true。 , containsAll, equals, hashCode, removeAll, retainAll, toArray, toArray 附上数组查重例子 import java.util.HashSet ; public class ttt{ public static boolean isRepeat(Integer[] a){ HashSet test = new HashSet<Integer

27450

HashSet

HashSet 是一个不允许存储重复元素的集合,它的实现比较简单,只要理解了 HashMap,HashSet 就水到渠成了。 成员变量 首先了解下 HashSet 的成员变量: private transient HashMap<E,Object> map; // Dummy value to associate 构造函数 public HashSet() { map = new HashMap<>(); } public HashSet(int initialCapacity 由于 HashMap 的 key 是不能重复的,所以每当有重复的值写入到 HashSet 时,value 会被覆盖,但 key 不会受到影响,这样就保证了 HashSet 中只能存放不重复的元素。 总结 HashSet 的原理比较简单,几乎全部借助于 HashMap 来实现的。 所以 HashMap 会出现的问题 HashSet 依然不能避免。

26420
  • 广告
    关闭

    2022腾讯全球数字生态大会

    11月30-12月1日,邀您一起“数实创新,产业共进”!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Hashset

    HashSet类可用来存储对象集。就像ArrayList一样,HashSet类也实现了Collection接口。 但是,HashSet存储的是多个项构成的集合而不是列表,这意味着其中不包含任何重复的元素,这与ArrayList可以包含许多重复元素不同。 这个类被命名为HashSet是因为用来实现这种集合的算法称为哈希表。有关哈希表算法如何工作的描述

    17120

    HashSet

    HashSet类,是存在于java.util包中的类。同时也被称为集合,该容器中只能存储不重复的对象 方法摘要 boolean add(E e) 如果此 set 中尚未包含指定元素,则添加指定元素。 Object clone() 返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。 boolean contains(Object o) 如果此 set 包含指定元素,则返回 true。 addAll, containsAll, equals, hashCode, removeAll, retainAll, toArray, toArray 附上数组查重例子 import java.util.HashSet ; public class ttt{ public static boolean isRepeat(Integer[] a){ HashSet test = new HashSet<Integer

    21330

    Java HashSet

    HashSet继承自AbstractSet,实现了Set接口、Cloneable、Serializable接口。 构造函数 public HashSet() { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll( c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity , loadFactor); } public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity

    23920

    HashSet集合

    HashSet集合: hashSet集合是把存储进来的对象先计算出对象的hash值后才进行对应的存储,因为存储进来的对象都有一个hash值,所以在进行查询的时候不需要像其他集合一样,一个个去查询来得到所需要的对象 hashSet集合只需要把要查询的对象计算出hash值后查找存储区域里hash值一样的对象,然后拿出来即可。这样检索速度就会相当快,这也是hashSet集合的优点。 在hashSet集合里如果存储对象时出现两个或多个相同的hash值,则会以单链的形式挂在同一个hash值下,所以数组的长度越长检索的速度越快,因为数据分开的比较散不会挤在一起。 HashSet集合与数组集合检索速度对比: 数组集合检索: ? HashSet集合检索: ? 速度对比: ? 运行结果: ? 从以上实验可以看得出速度相差的不是一点点。 单链引用示意图: ? HashSet集合添加方法: 代码示例: ? ?

    34220

    HashSet的秘密

    这篇文章我们先轻松一下,不讲HashMap,来说说HashSet。如果有点Java基础的童鞋,应该都知道List和Set都实现自Collection,List保证元素的添加顺序,元素可重复。 有两个很重要的实现HashSet和TreeSet。其中黄色部分前面已经说过了是要重点了解的,老规矩,上代码,大家可以先想一想以下代码的执行结果。 public static void main(String[] args){ Set<String> strSet = new HashSet<>();//new了一个HashSet strSet.add ; System.out.println("strSet里是否为空 : " + strSet.isEmpty()); } 先来看第一行代码: Set<String> strSet = new HashSet <>();//new了一个HashSet new了一个HashSet,前面的文章已经说过很多次了,只要是看到new,这货肯定在堆内存里开辟了一块空间,先找到HashSet的构造函数看看,看到如下代码:

    10830

    HashSet源码学习

    HashSet源码学习 UML图(没实现SortedSet,无序的) 属性 static final long serialVersionUID = -5024744406713321676L; /* () { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll( c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap< >(initialCapacity, loadFactor); } public HashSet(int initialCapacity) { map = new

    5940

    HashSet 源码分析

    HashSet 源码分析 1. HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor ); } public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } // 包内可用!

    41540

    C语言系列】C语言数组

    ages)/sizeof(int); //数组的总长度除以单个的长度等于元素个数 三、数组内存存储细节 假设有数组如下: Int x[]={1,2}; Char ca[5]={‘a’,‘A’,‘B’,‘C’ 使用场合:五子棋,俄罗斯方块等, 假设: char Y[3][2]={ {‘A’,‘B’}, {‘C,‘D’}, {‘E,‘F’} }; 内存情况: ?

    1.1K61

    HashSet源码学习

    那么HashSet是否就是Hash算法与Set结合而来的一种寻址快捷的集合呐?带着这样的疑问我们学习一下HashSet的源码吧。 ? 从源码的结构来看,HashSet真的没有多少代码。 但是我们发现其中有一个Map,莫非HashSet是从Map演变而来? 16,因为要和HashMap保持一致 public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); //将传入的集合添加到 map中 addAll(c); } //按照标准的方式初始化这个HashMap public HashSet(int initialCapacity, float loadFactor

    15520

    HashSet、LinkedHashSet、HashMap

    } class HashSetTest { public static void main(String[] args) { Set<Student> set = new HashSet Student("A", "10"); Student stu2 = new Student("B", "11"); Student stu3 = new Student("C" (stu4); set.add(stu5); set.add(stu6); System. out.println("-----------------HashSet System.out.println(key+":"+s.getName() + "----" + s.getAge()); } } } 打印结果: -----------------HashSet ---------------------- E----20 B----11 A----10 C----12 D----12 D----12 -----------------LinkedHashSet

    17910

    聊聊HashSet源码

    今天聊一下HashSet源码,HashSet内部基本使用HashMap来实现,本博客将通过一下几个方向讲解。 HashSet的UML图 ? HashSet简介 HashSet数据结构 HashSet内部使用HashMap来实现,HashMap的key为要存储的元素,value为一个Object,大致数据结构如下: public class extends E> c) { map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll (c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object> 因此,对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet源码的实现比较简单,相关HashSet的操作,都是直接调用底层HashMap

    20830

    集合框架(HashSet

    system.out.println(demo),打印demo对象,Demo@xxxxxx Demo对象在内存中是按照哈希值存储在哈希表中,取出也是按照哈希值,所以是无序的 import java.util.HashSet set=new HashSet(); set.add(demo1); set.add(demo2); System.out.println(set); Demo@4b8efa2f [Demo@4b8efa2f, Demo@1a8fa0f0] 定义一个类Demo 重写hashCode()方法,返回一个固定的数字,例如:90,打印对象显示,Demo@3c 获取多个对象,哈希值都是一样的,此时存入HaseSet中,使用equals()方法,判断是否是同一个对象,如果不是同一个对象,会顺延存储 import java.util.HashSet; class set=new HashSet(); set.add(demo1); set.add(demo2); System.out.println(set);

    19730

    HashSet底层分析

    extends E> c) { // 创建map。 // 为什么要调用Math.max((int) (c.size()/.75f) + 1, 16),从 (c.size()/.75f) + 1 和 16 中选择一个比较大的树呢? // 所以,(c.size()/.75f) + 1 计算出来的正好是总的空间大小。 // 接下来,说明为什么是 16 。 map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); // 将集合(c)中的全部元素添加到HashSet 中 addAll(c); } // 指定HashSet初始容量和加载因子的构造函数 public HashSet(int initialCapacity, float

    34310

    HashSet 源码分析

    来存放我们的ID,HashSet可以自动的帮助我们去重,比如HashSetset = new HashSet<>(list) 等。 > c = (Collection<?>) o; if (c.size() ! = size()) return false; try { return containsAll(c); } catch extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll( c); } // 根据初始大小和加载因子创建 HashSet public HashSet(int initialCapacity, float loadFactor) {

    24630

    HashSet源码解析

    今天我们分析一下HashSet的底层实现,因为HashSet底层是通过HashMap实现的。 所以HashSet底层也是通过哈希表的数据结构存储的。 下面我们将和其它集合一样,从HashSet的初始化方面着手,来分析一下HashSet的底层实现。 初始化 ? 我们看到,在HashSet中的无参构造方法中,直接创建了一个HashMap对象。 总结 分析到这里使我们知道HashSet有以下几点特性,它们分别是: 在HashSet中是不能保证元素的添加顺序与遍历顺序是一致的。因为底层是通过HashMap中的key的值保存的。 因为HashSet底层是通过HashMap中的key的值保存的,所以在HashSet中是不能保存重复元素的。因为在HashMap中的key也是不能重复的。 因为HashMap不是线程安全的集合类,并且我们分析HashSet源码时,也没有发现HashSet添加额外的同步关键字synchronized,所以说明HashSet也不是线程安全的集合类。

    29920

    HashMap和HashSet

    就像HashSet一样,这个类称为HashMap是因为它也使用了哈希表算法。它可以用作小型数据库,当给定键对象时,能够快速地获取值对象。 HashSet类可用来存储对象集。 就像ArrayList一样,HashSet类也实现了Collection接口。 但是,HashSet存储的是多个项构成的集合而不是列表,这意味着其中不包含任何重复的元素,这与ArrayList可以包含许多重复元素不同。

    17321

    C语言自学(一)C语言基础

    由于工作需要用到C语言,所以开始接触学习C语言,从最基础开始学习了解。 C语言中的关键字: auto 声明自动变量 break 跳出当前循环 case 开关语句分支 char 声明字符型变量或函数返回值类型 const 声明只读变量 continue C变量 基本数据类型 char int float double void C常量 常量是固定值,在程序执行期间不会改变 字符常量 \n 换行符 \f 换页符 \r 回车 C存储类 auto register static extern C运算符 算术运算符 + - * / % ++ – 关系运算符 == ! : 条件表达式 枚举 enum C中操作字符串的函数 strcpy(s1,s2) 复制字符串s2到字符串s1 Strcat(s1,s2) 连接字符串s2到字符串s1的末尾 Strlen(

    31820

    C语言笔记---(1)初识C语言

    C语言简介 C语言的历史 1972年,贝尔实验室,1972年,丹尼斯·里奇和布莱恩·柯林汉(Brian Kernighan)在B语言的基础上重新设计了一种新语言,这种新语言取代了B语言,所以称为C语言 C语言的源代码可以在任意架构的处理器上使用。 C语言的特点 1.语言简洁灵活 C语言是现有程序设计语言中规模最小的语言之一,C语言的关键字仅仅只有32个,控制语句也只有9个。 C语言是完全模块化和结构化的语言C语言对于输入和输出的处理也是通过函数调用来实现的。 C语言的版本 在C语言的发展史上,有过许多不同的版本。 这本书被C语言开发者们称为“K&R”,很多年来被当作C语言的非正式的标准说明。人们称这个版本的C语言为“K&R C”。

    15210

    扫码关注腾讯云开发者

    领取腾讯云代金券