一、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);
} }

重写之后再运行测试方法,输出结果如下:

可以看到最后一个元素已经去除成功。

最新文章

  1. 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?
  2. XdbxAnalysis
  3. 微信公众平台网页获取用户OpenID方法
  4. C#中String.Empty,“”,NULL的区别
  5. 1037. Magic Coupon (25)
  6. 安装 adobe flash player
  7. billing是如何的拆分的?
  8. Optipng—PNG的优化图像工具初探
  9. NPOI 创建Excel,数据读取与写入
  10. NET MVC运行机制
  11. 生成ssl秘钥的方法(纯粹本人记录用的,勿踩)
  12. java —— 内部类
  13. python3 第十章 - 如何进行进制转化
  14. 福州大学W班-助教总结
  15. iOS 私有API调用
  16. java.io.FileNotFoundException: D:\Program%20Files\Apache%20Software%20Foundation\Tomcat%205.0\webapp
  17. 【linux】线上服务器要关注哪些参数
  18. IDEA(添加类注释以及方法注释)
  19. sendmail邮件自动发送
  20. sqoop加载mysql数据库

热门文章

  1. python动态绑定属性和方法
  2. win7 没有权限使用网络资源
  3. OpenJudge Cartesian Tree
  4. mysql视图 触发器 事物 函数 存储过程
  5. C语言:冒泡排序
  6. 《马哥出品高薪linux运维教程》wingkeung学习笔记-linux基础入门课程
  7. SPOJ COT3 - Combat on a tree
  8. Python并发编程-事件驱动模型
  9. git解决冲突插件之Beyond Compare
  10. MySQL关于sql_mode的修改(timestamp的默认值不正确)