List去重问题引出来的hashCode和equals方法
一、List 里面是基本类型的去重问题
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set; /**
*
* @author Jenson 2018年10月31日下午2:26:02
*/
public class Demo { public static void main(String[] args) {
List list = new ArrayList();
list.add(11);
list.add(12);
list.add(13);
list.add(14);
list.add(15);
list.add(11);
System.out.println(list);
Set set = new HashSet();
List newList = new ArrayList();
set.addAll(list);
newList.addAll(set);
System.out.println(newList);
}
}
这样子可以看到已经去重成功了。
在面试中被问到 List 去重的时候,回答出 List 和Set互转并不会是满意的答案,当 List 集合中存在对象的时候,就要使用下面的方式去去重。
二、List 集合里面存在引用类型(对象)
2.1
我们定义一个People类,然后重写 equals 和 hashCode 方法
public class People {
private String name;
private String phoneNumber;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public People(String name, String phoneNumber) {
super();
this.name = name;
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "People [name=" + name + ", phoneNumber=" + phoneNumber + "]";
}
@Override
public int hashCode() {
// 判断这个对象的属性的hashCode
String str = name + phoneNumber;
return str.hashCode();
}
@Override
public boolean equals(Object obj) {
People p = (People) obj;
// 分别判断这个对象的属性是否物理相等
return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);
}
}
如果继续使用 一 中的方法去重,可以看到是没有去重的。
public static void main(String[] args) {
List<People> listPeople = new ArrayList<People>();
listPeople.add(new People("张三", "11111"));
listPeople.add(new People("张三", "22222"));
listPeople.add(new People("李四", "33333"));
listPeople.add(new People("张三", "22222"));
Set<People> setData = new HashSet<People>();
setData.addAll(listPeople);
System.out.println("list:" + listPeople.toString());
System.out.println("set:" + setData.toString());
}

可以看到并没有去掉最后一个对象。
这个时候我们必须在 People 类中重写 equals 和 hashCode 方法
public class People {
private String name;
private String phoneNumber;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public People(String name, String phoneNumber) {
super();
this.name = name;
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "People [name=" + name + ", phoneNumber=" + phoneNumber + "]";
}
@Override
public int hashCode() {
// 判断这个对象的属性的hashCode
String str = name + phoneNumber;
return str.hashCode();
}
@Override
public boolean equals(Object obj) {
People p = (People) obj;
// 分别判断这个对象的属性是否物理相等
return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);
}
}
重写之后再运行测试方法,输出结果如下:

可以看到最后一个元素已经去除成功。
List去重问题引出来的hashCode和equals方法的更多相关文章
- 关于hashcode和equals方法说明
一.前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄.对象头.对象实例数据.对象类型数据等 ...
- 重写hashcode和equals方法
重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...
- 用HashSet的add方法谈hashcode和equals方法重写
本文主要通过用HashSet的add方法讲一下hashCode和equals方法重写.错误的地方望指正. 1.了解HashSet的add方法 了解一个方法的好办法是看源码,所以先看源码 private ...
- Java 中正确使用 hashCode 和 equals 方法
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...
- 使用hashCode()和equals()方法 - Java
在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...
- K:java中的hashCode和equals方法
hashCode和equals方法是Object类的相关方法,而所有的类都是直接或间接的继承于Object类而存在的,为此,所有的类中都存在着hashCode和equals.通过翻看Object类 ...
- 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...
- 【转】 如何重写hashCode()和equals()方法
转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...
- hashcode和equals方法的区别和联系
说到 hashcode就要和Java中的集合,HashSet,HashMap 关系最为密切. 首先附录两张Java的集合结构图: 图二:(上图的简化版) 从Set集合的特点说起 & Set是如 ...
随机推荐
- 方法 - ShellCode测试
机器码->汇编 1 // ShellCode测试.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windo ...
- HDOJ 2005 第几天?
#include<iostream> using namespace std; ] = { ,,,,,,,,,,, }; ] = { ,,,,,,,,,,, }; bool isRYear ...
- linux下开启某个端口的方法:可用于SQL
- Linux安装jsvc,及Linux服务开发
在linux上以服务的方式启动java程序,需要提前安装jsvc.linux是利用daemon(jsvc)构建java守护进程. 编译 daemon 安装JSVC 1 下载文件,http://comm ...
- Change default network name (ens33) to old “eth0” on Ubuntu 18.04 / Ubuntu 16.04
Change default network name (ens33) to old “eth0” on Ubuntu 18.04 / Ubuntu 16.04 By Raj Last updated ...
- [SQL]SQL中EXISTS的用法
比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FR ...
- lua开发
1:安装luaBridge git地址 https://github.com/vinniefalco/LuaBridge.git 2:编写程序 #include <lua.hpp> #in ...
- mysql:视图,触发器,事务,存储过程,函数。
一 视图 1 什么是视图:视图其实就是通过查询得到一张表并且保存下来,就是一张虚拟的表,并非真实存在,比如我们将两个表在终端通过(inner join)内链接起来,那么我们得到的这个表就叫做视图,其 ...
- 2-scala集合
1.集合的数据结构: array.seq .set .map(映射) 2.集合分类 集合分为可变集合和不可变集合(除元组外,元组没有可变和不可变) scala.collection.immutable ...
- url后面带斜杠与不带斜杠的区别
比如: https://www.baidu.com/test/ https://www.baidu.com/test 当Web服务器接收到对某个末尾不含斜杠的url请求时,例如https://www. ...