HashSet存储数据原理:

当HashSet调用add方法时,有返回值,返回值是boolean类型,表示是否添加成功(如果对象不存在,则添加成功,否则添加失败)

但是,添加的过程并不是一个个去遍历去判断是否已存在,这样效率太低(假设一种场景,有100W数据要放到set里,如果采用这种方法,就会每一次调用add方法,都会要跟集合的元素一一对比)

java中是这样添加元素的:(其实HashSet底层用的就是HashMap实现的,这也是HashMap的实现原理)

(1)首先会对这个对象做一个hash(其实拿的就是这个对象的hashCode方法的返回值),看看这个位置里有没有其他对象了,如果没有,则可以添加,如果有,进入(2)。这一步的时间复杂度是O(1)

(2)判断该对象与在这个hash的位置对象是否相等(调的是该对象的equals方法),如果一样,则返回false,不一样则返回true

所以,如果要自定义存储HashSet,需要实现泛型的equals和hashCode方法

现有一个场景,需要把所有学生都放到集合里,认为名字相同的学生是同一个学生。代码如下

package test;

import java.util.HashSet;
import java.util.Set; public class SetTest { public static void main(String[] args) { Set<String> set = new HashSet<>(); // add方法有返回值,返回值是boolean类型,表示是否添加成功
// 这里3行代码,分别返回true true false
set.add(new String("abc"));
set.add("xyz");
set.add("abc"); // 这里只输出2个对象——"abc"和"xyz"
for (String s : set) {
System.out.println(s);
} /**
* HashSet的add方法原理:
* HashSet之所以能不会重复去
*/ Set<People> set2 = new HashSet<>();
set2.add(new People("zhangsan"));
set2.add(new People("lisi"));
set2.add(new People("zhangsan")); for (People people : set2) {
System.out.println(people);
}
} } class People { private String name; public People(String name) {
this.name = name;
} @Override
public int hashCode() {
return this.name.hashCode();
} @Override
public boolean equals(Object obj) {
if(obj == this) {
return true;
} if(!(obj instanceof People)) {
return false;
} People people = (People) obj; if(this.name == null && people.name == null) {
return true;
} if(this.name.equals(people.name)) {
return true;
} return false;
} @Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
'}';
}
}

关于HashSet的更多相关文章

  1. HashSet HashTable 与 TreeSet

    HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet& ...

  2. Set容器--HashSet集合

    Set容器特点: ①   Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序; ②   最常用的两个Set接口的实 ...

  3. 计算机程序的思维逻辑 (41) - 剖析HashSet

    上节介绍了HashMap,提到了Set接口,Map接口的两个方法keySet和entrySet返回的都是Set,本节,我们来看Set接口的一个重要实现类HashSet. 与HashMap类似,字面上看 ...

  4. Bloom Filter:海量数据的HashSet

    Bloom Filter一般用于数据的去重计算,近似于HashSet的功能:但是不同于Bitmap(用于精确计算),其为一种估算的数据结构,存在误判(false positive)的情况. 1. 基本 ...

  5. HashSet,TreeSet和LinkedHashSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  6. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  7. java在类定义时对hashset的便捷初始化方法

    有时候我们在类成员定义时,当这个类成员类型为 HashSet时,我们可以不方便调用 add函数进行初始化,所以可以采用下面的便捷方式来进行初始化 public class MyTest{ final ...

  8. Java集合之HashSet

    1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSe ...

  9. ArrayList和HashSet的Contains()方法(转)

    来源: ArrayList和HashSet的Contains()方法 笔试题: package com.champion.test.exam; import java.util.ArrayList; ...

  10. 利用 HashSet 去过滤元素是否重复

    HashSet<Integer> hashSet = new HashSet<Integer>(); for (int i = resultDoctorDetails.size ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:Model/View架构概述

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 模型-视图-控制器(Model-View-Controller,简称MVC)是一种源于Sm ...

  2. CTFHub Web题学习笔记(SQL注入题解writeup)

    Web题下的SQL注入 1,整数型注入 使用burpsuite,?id=1%20and%201=1 id=1的数据依旧出现,证明存在整数型注入 常规做法,查看字段数,回显位置 ?id=1%20orde ...

  3. mysql 创建新用户、数据库、授权

    创建用户 1.登录mysql mysql -uroot -p 2.创建本地用户(2.3选其一) #use mysql;             //选择mysql数据库 #create user 'w ...

  4. 【题解】「CF363A」Soroban

    哎呀呀,咕值要掉光了,赶快水篇题解( solution 这题就是个纯模拟,首先我们根据输出样例看一下输出算盘的规则. 看数最大的 720 ,我们发现,输出的算盘张这样(之所以我不用代码框而用 \(\K ...

  5. js实现弹幕

    弹幕是一个很常见的功能,下面是本人封装的一个小小的实现方案,存在不足之处可以提出来或自由改进. 直接上代码:复制可运行 <!DOCTYPE html> <html> <h ...

  6. selenium_学习笔记——二次封装常用的方法

    # coding = utf-8 ''' 二次封装元素方法 加入循环查找方法,提高查找元素的稳定性 ''' from selenium import webdriver from selenium.w ...

  7. rabbitmq3.6.6安装,环境centos7

    一,需求描述 在centos7上安装rabbitmq3.6.6 附上安装脚本 ,附上官网地址 http://www.rabbitmq.com/ ,从这上面可以下载rabbitmq-server-3.6 ...

  8. CAP、BASE、ACID

    CAP定理 定义 CAP定理(CAP theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本:写操作之 ...

  9. Shiro实现Basic认证

    前言 今天跟小伙伴们分享一个实战内容,使用Spring Boot+Shiro实现一个简单的Http认证. 场景是这样的,我们平时的工作中可能会对外提供一些接口,如果这些接口不做一些安全认证,什么人都可 ...

  10. 移动端 Swiper

    一.什么是swiper 开源.免费.强大的触摸滑动插件 Swiper常用于移动端网站的内容触摸滑动 Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果 #二.如何使用 1.首先加载插 ...