Java Set集合去重的原理及实现
作者:崔笑颜 发布时间:2023-08-11 10:56:11
标签:Java,set集合,去重
在开发中经常使用到Set集合去重,那么去重的原理是怎样实现的呢?在此文章记录一下去重原理!!!
下面是set集合类图
下面我们来跟踪一下执行过程;
首先我们实例化一个Set对象;
Set<8大基本类型> set = new HashSet<8大基本类型>();
set.add(8大基本类型);
add操作会调用HashMap中的add方法;
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashMap中的add方法依赖了HashMap的put方法;
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {//每添加一个,则循环判断是否与map中的元素相等
Object k;
// 先判断hashcode是否一致,然后再判断值是否相等
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
但是上述方法只对基本数据类型有效,下面是应用到复杂对象的讲解。
下面就是重写对象User的实现,重写equals和hashCode方法;
测试类
public class User {
//id
protected Integer id;
//username
protected String username;
//构造方法
public User(int id,String username){
this.id = id;
this.username = username;
}
/**
* 如果对象是USER,先比较hashcode,一致的场合在比价每个属性的值
*/
@Override
public boolean equals(Object obj) {
if(obj == null)
return false;
if(this == obj)
return true;
if(obj instanceof User){
User user = (User) obj;
//if(user.id == this.id) return true; //只比较id
//比较id和username 一致时才返回true,之后再去比较hashCode
if(user.id == this.id && user.username.equals(this.username)){
return true;
}
}
return false;
}
/**
*
* 重写hashCode方法,返回的hashCode不一样 才认为是不一样的对象;
*/
@Override
public int hashCode() {
//return id.hashCode(); 只比较id,id不一样就添加进集合;
return id.hashCode() * username.hashCode();
}
}
实现类
import java.util.HashSet;
import java.util.Set;
public class test {
public static void main(String[] args){
User user1 = new User(1,"xiaoqiang");
User user2 = new User(2,"xiaoqiang");
User user3 = new User(1,"xiaoqiang");
User user4 = new User(1,"xiaoqiang");
Set<User> set = new HashSet<User>();
set.add(user1);
set.add(user2);
set.add(user3);
set.add(user4);
for(User u : set){
System.out.println("id:" + u.id +" username:"+ u.username);
}
}
}
输出结果
id:2 username:xiaoqiang
id:1 username:xiaoqiang
来源:https://cloud.tencent.com/developer/article/1649007


猜你喜欢
- 基本概念Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制并发访问
- idea中创建一个maven项目在pom文件中导入下面的依赖<!--mybatis核心包--> <depend
- 1)打开idea,开始创建SpringBoot项目2)选择 Spring Initializr ,选择合适的jdk版本,点击Next在操作到
- 一、Flutter代码的启动起点我们在多数的业务场景下,使用的都是FlutterActivity、FlutterFragment。在在背后,
- 同线程回收对象上一小节剖析了从recycler中获取一个对象, 这一小节分析在创建和回收是同线程的前提下, recycler是如何进行回收的
- 本文实例讲述了C#图像处理之边缘检测(Sobel)的方法。分享给大家供大家参考。具体如下://定义sobel算子函数private stat
- SqlMapConfig.xml的约束,也就是Mybatis主配置文件的约束<?xml version="1.0"
- 当键盘敲下后退键(Backspace)后1、禁止浏览器自动后退2、但不影响密码、单行文本、多行文本输入框等的回退操作<script t
- 一、前言在java中,和C语言一样,也有关于字符串的定义,并且有他自己特有的功能,下面我们一起来学习一下。二、String类概述string
- /// <summary>/// 生成二维码/// </summary>/// <param name=&qu
- 1.之前在使用AutoMapper 框架感觉用着比较不够灵活,而且主要通过表达式树Api 实现对象映射 ,写着比较讨厌,当出现复杂类型和嵌套
- 1.情景展示将要访问的接口地址等常用的配置添加到properties文件中,比直接写到java类中的好处在于:当我们需要修改相应配置时,直接
- 使用filter对request body参数进行校验@Slf4jpublic class ParameterCheckServletReq
- 一、什么是简单工厂模式简单工厂模式又称为静态工厂模式,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父
- Java8 移除两个相同List对象List<Data> data1 = new ArrayList<>(
- 在C#绘制中国象棋棋盘是C#程序设计中GDI+的一个重要组成部分。这也是非常考验编程技巧的操作。在绘制之前首先要对棋盘有一个完整的认识。下面
- 本文由Markdown语法编辑器编辑完成。1. 需求分析;已知当在调用某一webservice的服务时,如果调用成功,会接受到该服务的返回X
- 缘起工作时使用java开发服务器后台,用Jersey写Restful接口,发现有一个Post方法始终获取不到参数,查了半天,发现时获取参数的
- 被kafka-client和springkafka版本坑上周刚刚欢天喜地的在linux上部了kafka,这周打算用spring-boot框架
- 常需要对list进行排序,小到List<String>,大到对自定义的类进行排序。不需要自行归并或堆排序。简单实现一个接口即可。