一、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方法的更多相关文章

  1. 关于hashcode和equals方法说明

    一.前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄.对象头.对象实例数据.对象类型数据等 ...

  2. 重写hashcode和equals方法

    重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...

  3. 用HashSet的add方法谈hashcode和equals方法重写

    本文主要通过用HashSet的add方法讲一下hashCode和equals方法重写.错误的地方望指正. 1.了解HashSet的add方法 了解一个方法的好办法是看源码,所以先看源码 private ...

  4. Java 中正确使用 hashCode 和 equals 方法

    在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...

  5. 使用hashCode()和equals()方法 - Java

    在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...

  6. K:java中的hashCode和equals方法

      hashCode和equals方法是Object类的相关方法,而所有的类都是直接或间接的继承于Object类而存在的,为此,所有的类中都存在着hashCode和equals.通过翻看Object类 ...

  7. 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

    我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...

  8. 【转】 如何重写hashCode()和equals()方法

    转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...

  9. hashcode和equals方法的区别和联系

    说到 hashcode就要和Java中的集合,HashSet,HashMap 关系最为密切. 首先附录两张Java的集合结构图: 图二:(上图的简化版) 从Set集合的特点说起 & Set是如 ...

随机推荐

  1. 廖雪峰Java3异常处理-1错误处理-3抛出异常

    1.异常的传播 当某个方法抛出异常时: 如果当前方法没有捕获,异常就被抛到上层调用方法 直到遇到某个try...catch被捕获 使用printStackTrace()打印处方法的调用栈 import ...

  2. 廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar

    1.classpath 1.1classpath定义 classpath是一个环境变量 classpath指示JVM如何搜索class classpath设置的搜索路径与操作系统相关 * window ...

  3. php的基本内容

    php是一门后台语言,不能直接用浏览器打开,浏览器是他的载体, php的环境时apache,我们现在用的时phpstudy的继承环境,文件目录应放在apache中的www的根目录下: js的环境为no ...

  4. python中文件操作

      打印进度条

  5. 修改Linux终端提示符颜色

    修改Linux终端提示符颜色 作者:Eric 微信:loveoracle11g [root@linux-node2 ~]# tail -1 .bashrc PS1='[\[\033[1;31m\]\u ...

  6. 07 grep命令与正则表达式

    grep命令 首先我们知道grep命令是用来做文件内容过滤的!如果你要在文件中查找一些对应的内容,我们如何来过滤找到其中我们需要符合条件的内容呢?grep命令结合正则表达式就可以实现: grep.eg ...

  7. SpringBoot应用部署到Tomcat中无法启动问题(初识)

    参考http://blog.csdn.net/asdfsfsdgdfgh/article/details/52127562 背景 最近公司在做一些内部的小型Web应用时, 为了提高开发效率决定使用Sp ...

  8. MySQL函数大全及用法示例

    1.字符串函数ascii(str)   返回字符串str的第一个字符的ascii值(str是空串时返回0)  mysql> select ascii('2');   -> 50  mysq ...

  9. JQ获取选中select 标签的值

    Jq://#ses为select 标签的Id$("#ses option:selected").val(); $("#ses option:selected") ...

  10. [python,2018-01-15] 冒泡法排序

    想写一个冒泡法排序,没什么思路,就先写了个java的 public static void main(String[] args) { int array[] = {88,2,43,12,34,8,6 ...