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 + '\'' +
'}';
}
}

最新文章

  1. linux 服务
  2. vux 获取后台数据
  3. SublimeText个性化快捷键设置
  4. 动态修改attr里的多个属性
  5. ado.net 连接,删除,添加
  6. RobotFrameWork webservice soap接口测试 (二)
  7. Linux运行级详解
  8. github and SourceTree初步使用
  9. iOS7适配之设计篇
  10. HM中CU,TU的划分
  11. iptables原理详解以及功能说明
  12. 关于微信小程序的的总结
  13. 纯CSS实现二级导航下拉菜单--css的简单应用
  14. ASP.NET三剑客 HttpApplication HttpModule HttpHandler 解析
  15. javascript 总结(常用工具类的封装)
  16. git 入门教程之删除文件
  17. Vue中import引入模块路径时的@符号
  18. JS算法练习三
  19. python模块介绍- binascii:二进制和ASCII互转以及其他进制转换
  20. virtualbox不能安装64位操作系统

热门文章

  1. vue--axios分装
  2. PyQt(Python+Qt)学习随笔:QTableWidgetItem的位置相关方法
  3. 第十章、Qt Designer中的Spacers部件
  4. mysql中innodb引擎的mvcc机制和BufferPool缓存机制
  5. sql绕过2
  6. Java模拟表单POST上传文件
  7. 安全声明标记语言SAML2.0初探
  8. 二、利用Git将GitHub上的项目拉下项目
  9. Spring Boot 启动事件和监听器,太强大了!
  10. 记一次 HBase Master is initializing 问题处理