• List去重问题引出来的hashCode和equals方法


    一、List 里面是基本类型的去重问题

     1 import java.util.ArrayList;
     2 import java.util.HashSet;
     3 import java.util.List;
     4 import java.util.Set;
     5 
     6 /**
     7  * 
     8  * @author Jenson 2018年10月31日下午2:26:02
     9  */
    10 public class Demo {
    11 
    12     public static void main(String[] args) {
    13         List list = new ArrayList();
    14         list.add(11);
    15         list.add(12);
    16         list.add(13);
    17         list.add(14);
    18         list.add(15);
    19         list.add(11);
    20         System.out.println(list);
    21         Set set = new HashSet();
    22         List newList = new ArrayList();
    23         set.addAll(list);
    24         newList.addAll(set);
    25         System.out.println(newList);
    26     }
    27 }

    这样子可以看到已经去重成功了。

    在面试中被问到 List 去重的时候,回答出 List 和Set互转并不会是满意的答案,当 List 集合中存在对象的时候,就要使用下面的方式去去重。

    二、List 集合里面存在引用类型(对象)

    2.1

    我们定义一个People类,然后重写 equals 和 hashCode 方法

     1 public class People {
     2     private String name;
     3     private String phoneNumber;
     4 
     5     public String getName() {
     6         return name;
     7     }
     8 
     9     public void setName(String name) {
    10         this.name = name;
    11     }
    12 
    13     public String getPhoneNumber() {
    14         return phoneNumber;
    15     }
    16 
    17     public void setPhoneNumber(String phoneNumber) {
    18         this.phoneNumber = phoneNumber;
    19     }
    20 
    21     public People(String name, String phoneNumber) {
    22         super();
    23         this.name = name;
    24         this.phoneNumber = phoneNumber;
    25     }
    26 
    27     @Override
    28     public String toString() {
    29         return "People [name=" + name + ", phoneNumber=" + phoneNumber + "]";
    30     }
    31 
    32     @Override
    33     public int hashCode() {
    34 
    35         // 判断这个对象的属性的hashCode
    36 
    37         String str = name + phoneNumber;
    38         return str.hashCode();
    39     }
    40 
    41     @Override
    42     public boolean equals(Object obj) {
    43         People p = (People) obj;
    44 
    45         // 分别判断这个对象的属性是否物理相等
    46 
    47         return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);
    48     }
    49 
    50 }

    如果继续使用 一 中的方法去重,可以看到是没有去重的。

     1 public static void main(String[] args) {
     2     List<People> listPeople = new ArrayList<People>();
     3     listPeople.add(new People("张三", "11111"));
     4     listPeople.add(new People("张三",  "22222"));
     5     listPeople.add(new People("李四",  "33333"));
     6     listPeople.add(new People("张三",  "22222"));
     7  
     8     Set<People> setData = new HashSet<People>();
     9     setData.addAll(listPeople);
    10     System.out.println("list:" + listPeople.toString());
    11     System.out.println("set:" + setData.toString());
    12  
    13 }

    可以看到并没有去掉最后一个对象。

    这个时候我们必须在 People 类中重写 equals 和 hashCode 方法

     1 public class People {
     2     private String name;
     3     private String phoneNumber;
     4 
     5     public String getName() {
     6         return name;
     7     }
     8 
     9     public void setName(String name) {
    10         this.name = name;
    11     }
    12 
    13     public String getPhoneNumber() {
    14         return phoneNumber;
    15     }
    16 
    17     public void setPhoneNumber(String phoneNumber) {
    18         this.phoneNumber = phoneNumber;
    19     }
    20 
    21     public People(String name, String phoneNumber) {
    22         super();
    23         this.name = name;
    24         this.phoneNumber = phoneNumber;
    25     }
    26 
    27     @Override
    28     public String toString() {
    29         return "People [name=" + name + ", phoneNumber=" + phoneNumber + "]";
    30     }
    31 
    32     @Override
    33     public int hashCode() {
    34 
    35         // 判断这个对象的属性的hashCode
    36 
    37         String str = name + phoneNumber;
    38         return str.hashCode();
    39     }
    40 
    41     @Override
    42     public boolean equals(Object obj) {
    43         People p = (People) obj;
    44 
    45         // 分别判断这个对象的属性是否物理相等
    46 
    47         return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);
    48     }
    49 
    50 }

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

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

  • 相关阅读:
    安卓:线性布局
    安卓文件的资源访问
    关于安卓的一些初步认识
    haayaGuardV0---3---手机与pc基于p2p通信
    【无中生有】---13---系统发布
    【无中生有】---12---运维与监控
    【无中生有】---11---服务器集群部署
    【无中生有】---7---分布式消息队列
    使用消息队列的 10 个理由
    【无中生有】---10---API接口日志存储设计与实现设计
  • 原文地址:https://www.cnblogs.com/zhanzhuang/p/9883321.html
Copyright © 2020-2023  润新知