List去重

悠悠 2022-04-01 03:46 318阅读 0赞

list中数据的去重,通常使用将list转换为set,简单直接,因为set集合的特点就是没有重复的元素。需要考虑一下两种情况:

1.List集合中的数据类型是基本数据类型

可以直接将list集合转换成set,就会自动去除重复的元素。

如下示例:

  1. public class Test {
  2. public static void main(String[] args) {
  3. List list = new ArrayList();
  4. list.add(11);
  5. list.add(12);
  6. list.add(13);
  7. list.add(14);
  8. list.add(15);
  9. list.add(11);
  10. System.out.println(list);
  11. Set set = new HashSet();
  12. List newList = new ArrayList();
  13. set.addAll(list);
  14. newList.addAll(set);
  15. System.out.println(newList);
  16. }
  17. }

2.List集合中存储的数据类型是对象类型

需要在对象的实体类中去重写equals()方法和hashCode()方法

  1. public class People {
  2. private String name;
  3. private String phoneNumber;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public String getPhoneNumber() {
  11. return phoneNumber;
  12. }
  13. public void setPhoneNumber(String phoneNumber) {
  14. this.phoneNumber = phoneNumber;
  15. }
  16. public People(String name, String phoneNumber) {
  17. super();
  18. this.name = name;
  19. this.phoneNumber = phoneNumber;
  20. }
  21. @Override
  22. public String toString() {
  23. return "People{" +
  24. "name='" + name + ''' +
  25. ", phoneNumber='" + phoneNumber + ''' +
  26. '}';
  27. }
  28. @Override
  29. public boolean equals(Object o) {
  30. People p = (People) o;
  31. return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);
  32. }
  33. @Override
  34. public int hashCode() {
  35. String str = name + phoneNumber;
  36. return str.hashCode();
  37. }
  38. }
  39. public static void main(String[] args) {
  40. List<People> listPeople = new ArrayList<People>();
  41. listPeople.add(new People("张三", "11111"));
  42. listPeople.add(new People("张三", "22222"));
  43. listPeople.add(new People("李四", "33333"));
  44. listPeople.add(new People("张三", "22222"));
  45. Set<People> setData = new HashSet<People>();
  46. setData.addAll(listPeople);
  47. System.out.println("list" + listPeople.toString());
  48. System.out.println("set" + setData.toString());
  49. }

最后,我们拿出String中的equals()方法和hashCode()方法源码来加深认识:

equals()

  1. public boolean equals(Object anObject) {
  2. if (this == anObject) {
  3. return true;
  4. }
  5. if (anObject instanceof String) {
  6. String anotherString = (String)anObject;
  7. int n = count;
  8. if (n == anotherString.count) {
  9. char v1[] = value;
  10. char v2[] = anotherString.value;
  11. int i = offset;
  12. int j = anotherString.offset;
  13. while (n-- != 0) {
  14. if (v1[i++] != v2[j++])
  15. return false;
  16. }
  17. return true;
  18. }
  19. }
  20. return false;
  21. }

比较两个对象时,首先先去判断两个对象是否具有相同的地址,如果是同一个对象的引用,则直接放回true;如果地址不一样,则证明不是引用同一个对象,接下来就是挨个去比较两个字符串对象的内容是否一致,完全相等返回true,否则false。

hashCode()

  1. public int hashCode() {
  2. int h = hash;
  3. if (h == 0 && count > 0) {
  4. int off = offset;
  5. char val[] = value;
  6. int len = count;
  7. for (int i = 0; i < len; i++) {
  8. h = 31*h + val[off++];
  9. }
  10. hash = h;
  11. }
  12. return h;
  13. }

hashCode()官方定义:

hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是:

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。

以下情况不是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

发表评论

表情:
评论列表 (有 0 条评论,318人围观)

还没有评论,来说两句吧...

相关阅读

    相关 List

    在日常工作中,需要对 List 进行去重的场景很多。对于我这样一个菜鸟来说,可能能想到的最简单粗暴的方法就是双层循环去重,但是在看到这篇文章之后,果断收藏了。 [https:

    相关 List

    我们知道List允许有相同的元素,那么我们怎么通过方法来让它去重呐, 我们都会想到Set集合,Set集合是不允许有相同的元素的,所以我们可以借助Set集合,把重复的元素去掉

    相关 List

      list中数据的去重,通常使用将list转换为set,简单直接,因为set集合的特点就是没有重复的元素。需要考虑一下两种情况: 1.List集合中的数据类型是基本数据

    相关 List

    思路:   1、先将list转换成HashSet   2、将HashSet再转换成List 源码如下: List<A> list = new ArrayList