HashSet不能添加重复的元素,当调用add(Object)方法时候,
首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;
如果已存在则调用Object对象的equals方法判断是否返回true, 如果为true则说明元素已经存在,如为false则插入元素。
例如Person类,重写hashCode方法和equals方法,用以判断传入集合的元素是否已经存在。
package com.test;
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<Person>();
Person p1 = new Person("张三");
Person p2 = new Person("张三");
boolean flag1 = set.add(p1);// 首先调用p1对象的hashCode进行判断,如果不存在相同的hashCode,则调equals方法进行判断。
boolean flag2 = set.add(p2);// 首先调用p2对象的hashCode进行判断,如果不存在相同的hashCode,则调equals方法进行判断。
System.out.println("flag1的值为:" + flag1);// flag1的值为:true
System.out.println("flag2的值为:" + flag2);// flag2的值为:false.因为p1与p2是永远相同的hashCode并且有相同的name。
System.out.println("set的值为:" + set);
}
}
class Person {
private String name;
Person(String name) {//有参构造器
this.name = name;
}
@Override
public int hashCode() {// 重写hashCode方法
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {// 重写equals方法
if (this == obj) {
return true;
}
if (null != obj && obj instanceof Person) {
Person p = (Person) obj;
if (name.equals(p.name)) {// 判断name是否相同
return true;
}
}
return false;
}
}
运行结果:
flag1的值为:true
flag2的值为:false------->p2没有插入成功返回false
set的值为:[com.test.Person@bd2e0] ---->set只有一个元素
分享到:
相关推荐
主要介绍了从源码的角度浅析HashMap、TreeMap元素的存储和获取元素的逻辑;从Map与Set之间的关系浅析常用的Set中元素的存储和判断是否重复的逻辑,需要的朋友可以参考下
向 HashSet 中 add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合 equles 方法比较。
Set:元素不可以重复,是无序。p508 Set接口中的方法和Collection一致。 |--HashSet: 内部数据结构是哈希表 ,是不同步的。 如何保证该集合的元素唯一性呢? 是通过对象的hashCode和equals方法来完成对象唯一性的...
HashSet 是如何保证不重复的 向 HashSet 中 add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合 equles 方法比较。 HashSet 中的 add ()方法会使用 HashMap 的 add ()方法。以下是 HashSet 部分...
Java集合框架中的Set接口是一种不允许包含重复元素的集合。Set接口继承自Collection接口,因此它具有Collection接口定义的所有方法。同时,Set接口还具有自己的特殊方法,例如:添加元素、删除元素、判断元素是否...
再把第二个集合中的元素放进hashSet中,如果有重复元素,就是这2个集合的交集,时间复杂度为O(N)。即总的时间复杂度从O(M*N)降低到了O(M+N)。 代码: public static List<string> GetIntersection2(List<string> ...
2.利用HashSet的元素不重复性,涉及到:set.contains(nums[i])、set.add(nums[i])方法。同时HashSet和HashMap相比Set是一维,Map是二维。 3.利用Arrays.sort(nums)排序方法,先排序,再判断相邻是否相等。 字符串: 1...
思路一:HashSet第一个重复元素就是环的入口 按照查找单链表带环的思路二,我们用一个HashSet维护已经跑过的元素,当重复的时候,那个结点就是环的入口。这法子还算好使,不过还是老问题——空间复杂度大。 思路二:...
中至少有2个重复元素。②、A != B (ab与ba,abc与bca): AB中只能有2对不同索引 (元素互换相等)。注意:判断是否有重复时,使用set或数组++。 代码: package com.lihe.leetcode.string; import java.util.HashSet; ...
有序、有索引、元素可重复 1.ArrayList: 底层是数组结构、查询快、增删慢、不同步 添加第一个元素的时候,创建默认个数是10个,如果超出了10个,就创建一个长度为 10+10>>1=15的数组 2.LinkedList: 底层是链表结构、...
31、HashSet与HashMap怎么判断集合元素重复? 33、ArrayList和LinkedList的区别,以及应用场景 34、数组和链表的区别 35、开启线程的三种方式? 36、线程和进程的区别? 38、run()和start()方法区别 39、如何...
leetcode添加元素使和等于 leetcode_record 剑指offer 第2版 Title-Link Describe Method Note 03 数组中重复的数字 长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内,找出数组中任意一个重复的数字 数组 ...
怎么判断集合元素重复? String、StringBuffer、StringBuilder 之间的区别? 对反射的了解? 对注解的了解? 对依赖注入的了解? 对泛型的了解? 泛型中 extends 和 super 的区别? 对 Java 的异常体系的了解? 对...
26删除排序数组的重复元素 双指针 :glowing_star: 136只出现一次的数字 位运算 :glowing_star::glowing_star::glowing_star: 344反转字符串 双指针 :glowing_star: 141判断链表有环 双指针,快慢指针 :glowing_star:...
数组元素在[1,n]之间的替换重复缺失问题: 有序矩阵: 5 图 二分图: 拓扑排序: 常用于在具有先序关系的任务规划中。 并查集: 并查集可以动态地连通两个点,并且可以非常快速地判断两个点是否连通。 6 位运算 7 双...
1,编写程序,判断给定的某个年份是否是闰年。 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年。 (2)若某个年份能被400整除,则也是闰年。 import java.util.Scanner; class ...
实例64 去除重复元素 88 实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求...