数据结构---Java---HashSet
1、概述
1.1 HashSet不是线程安全的;
1.2 基于HashMap实现的;
1.3 *********JDK给出重写hashCode()的规则:***********
1.1.1 当2个对象的equals返回true,它们的hashCode()应该相等;
1.1.2 对象中用作equals比较的属性,都应该用来计算hashCode()值;
2、HashSet源码
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{
//底层适应HashMap保存HashSet的所有元素
private transient HashMap<E,Object> map;
//使用一个虚拟的Object作为HashMap的value
private static final Object PRESENT = new Object();
/**
* 初始化HashSet时,默认使用HashMap的初始容量16、加载因子0.75
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//add时,底层实际将元素作为key放入HashMap中
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
}
3、重写equals(),hashCode()案例
package com.exiuge.mytest.hashset;
public class Person {
private int age;
private String name;
public Person(){
}
public Person(int age,String name){
this.age=age;
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Person){
Person p=(Person) obj;
if (p.getName().equals(this.name)){
return true;
}
}
return false;
}
}
package com.exiuge.mytest.hashset; import java.util.HashSet;
import java.util.Set; public class Test { public static void main(String[] args){
Person p1=new Person(12,"a");
Person p2=new Person(12,"a");
Set set=new HashSet();
boolean a=set.add(p1);
boolean b=set.add(p2);
System.out.println("p1 hashCode:"+p1.hashCode());
System.out.println("p2 hashCode:"+p2.hashCode());
System.out.println("equals:"+p1.equals(p2));
System.out.println(a+"====="+b);
}
}
执行结果:

数据结构---Java---HashSet的更多相关文章
- 纯数据结构Java实现(5/11)(Set&Map)
纯数据结构Java实现(5/11)(Set&Map) Set 和 Map 都是抽象或者高级数据结构,至于底层是采用树还是散列则根据需要而定. 可以细想一下 TreeMap/HashMap, T ...
- Java HashSet和TreeSet【笔记】
Java HashSet和TreeSet[笔记] PS:HashSet.TreeSet 两个类是在 Map 的基础上组装起来的类 HashSet 类注释 1.底层实现基于 HashMap,所以迭代时不 ...
- Java HashSet和LinkedHashSet的用法
Java HashSet和LinkedHashSet的用法 类HashSet和LinkedHashSet都是接口Set的实现,两者都不能保存重复的数据.主要区别是HashSet不保证集合中元素的顺序, ...
- Java HashSet和HashMap源码剖析
转自: Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...
- Java HashSet对txt文本内容去重(统计小说用过的字或字数)
Java HashSet对txt文本内容去重(统计小说用过的字或字数) 基本思路: 1.字节流读需要去重的txt文本.(展示demo为当前workspace下名为utf-8.txt的文本) 2.对读取 ...
- java数据结构之HashSet和HashMap(java核心卷Ⅰ读书笔记)
增加 删除 remove方法,可以删除指定的一个元素. 查找 ********************* **************************** HashSet既不可以用 0 1 2 ...
- java数据结构之HashSet和TreeSet以及LinkedHashSet
一.HashSet源码注释 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cl ...
- 数据结构(java)
数据结构1.什么是数据结构?数据结构有哪些? 数据结构是指数据在内存中存放的机制. 不同的数据结构在数据的查询,增删该的情况下性能是不一样的. 数据结构是可以模拟业务场景. 常见的数据结构有:栈,队列 ...
- Java HashSet集合的子类LinkedHashSet集合
说明 HashSet保证元素的唯一性,可是元素存放进去是没有顺序的. 在HashSet下面有一个子类java.util.LinkedHashSet,它是 链表 + 哈希表(数组+链表 或者 数组+红黑 ...
- 数据结构Java实现01----算法概述
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- 巧用 git rebase 合并多个 commit。
一.为什么需要合并多个 commit 呢? 有时候,我们开发一个功能. 修修补补 commit 了很多次,过多的 commit 会显得很复杂. 不够直观,不能比较清晰查看那些 commit 是对应 ...
- 【实习项目记录】(四)Android 实现手机验证时,按钮倒计时60s
手机注册一般都会有一个按钮,默认显示获取验证码,点击之后变成xx秒之后重新获取验证码 在网上查到有两种方法可以实现这种功能,一种是自定义一个timeButton,另外一种是利用封装好的60秒获取验证码 ...
- python 爬虫之requests+日志+配置文件读取+mysql入库
#!/usr/bin/env python # -*- coding: utf-8 -*- # 日志管理 import logging import sys reload(sys) sys.setde ...
- CefSharp使用一
一.使用NuGet搜索CefSharp然后下载CefSharp.WinForms和CefSharp.Common 二.引用CefSharp.Windows,CefSharp,CefSharp三个dll ...
- jQuery实例代码-表单相关
select option 获取选中项的文本值 $("#ddl_GoOutReasonType option:selected").text() 根据索引定于option项 $(& ...
- Python3 中socket使用
1.动态导入模块 在当前目录下有lib和test目录,在test中要想使用lib中的aa的C类: test中: 第一种方法:推荐 importlib.import_module('lib.aa') o ...
- 网络模拟工具Clumsy
Clumsy 是一款小巧而功能强大的开源弱网模拟工具,它能在windows平台下人工造成不稳定的网络状况,方便你调试应用程序在极端网络状况下的表现. 你可以选择 clumsy 提供的功能来有目的性的调 ...
- C语言数据结构-链式栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-链式栈的实现-C语言 //链式栈的链式结构 typedef struct StackNode { int data; struct StackNode *next; } StackNod ...
- log4j配置文件及java调用 每个级别输出到不同的文件2
log4j.rootLogger=debug,stdout,info,debug,error log4j.appender.stdout=org.apache.log4j.ConsoleAppende ...
- kuangbin专题十二 POJ3186 Treats for the Cows (区间dp)
Treats for the Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7949 Accepted: 42 ...