`

list去重

    博客分类:
  • list
 
阅读更多

List数据去重在开发中是十分常见的场景,下面为大家介绍一个简单的方法:利用Set去重,但根据存储元素的不同,可以分为以下两类:

 

1. List中存储的是基本数据类型

下面看一段示例代码:

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d", "a", "b"));
        System.out.println(list);// 输出结果:[a, b, c, d, a, b]
        Set<String> set = new HashSet<>(list);
        List<String> newList = new ArrayList<>(set);
        System.out.println(newList);// 输出结果:[a, b, c, d]
    }
}
————————————————
原文链接:https://blog.csdn.net/weixin_40328662/article/details/99843102

 

 

2. List中存储的是对象类型

示例代码:

 

public class Test {
    public static void main(String[] args) {
        List<People> peopleList = new ArrayList<>();
        peopleList.add(new People("Joey", "001"));
        peopleList.add(new People("Joey", "001"));
        peopleList.add(new People("Johnny", "002"));
        peopleList.add(new People("Route", "003"));
        peopleList.add(new People("Vans", "004"));
        Set<People> peopleSet = new HashSet<>(peopleList);
        System.out.println(peopleSet);
    }
}
 
public class People {
 
    private String name;
    private String addrNum;
 
    // 省略无参、有参构造器,get、set方法,toString方法
 
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || this.getClass() != obj.getClass()) {
            return false;
        }
        People people = (People) obj;
        return Objects.equals(name, people.name)
                && Objects.equals(addrNum, people.addrNum);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(name, addrNum);
    }
}
————————————————

原文链接:https://blog.csdn.net/weixin_40328662/article/details/99843102

 

 

如果List中存储的是对象类型,要想利用Set去重,就必须重写存储对象的equals()和hashCode()方法,为什么呢?

 

原因其实很简单,如下所示,HashSet的实现其实是HashMap,而HashMap中,通过key区分不同元素,key的比较顺序第一步就是计算对象的hashCode,看是否存在,第二步查找对应hashCode位置的对象是否与当前对象相等。这就需要用到hashCode()与equals()方法,equals()方法的默认实现是 ==,对于对象而言,比较的是内存中的地址。上述示例中,其实我们想要的效果是name与addrNum相等即视为同一个对象,但new的操作在堆中都是开辟新的内存空间,故两个对象的地址不一致,所以,我们必须覆写这两个方法

 

/**

 * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has

 * default initial capacity (16) and load factor (0.75).

 */

public HashSet() {

    map = new HashMap<>();

}

 

/**

 * Object类中equlas的默认实现

 */

public boolean equals(Object obj) {

    return (this == obj);

}

 

是不是非常简单,但可能有朋友会问,String并不属于基本数据类型,为什么也可以直接利用Set去重?其实,String类也重写了equals()和hashCode()方法,感兴趣的朋友可以去查看相关源码

 

总结:

利用HashSet去重,本质是利用了HashMap去重原理,Map/Set的key为自定义对象时,必须重写hashCode和equals

 

遵循如下规则(来自阿里巴巴Java开发手册):

 

1. 只要重写equals,就必须重写hashCode

 

2. 因为set存储的是不重复的对象,依据hashCode和equals进行判断,所以set存储的对象必须重写这两个方法

 

3. 如果自定义对象作为Map的键,那么必须重写hashCode和equals

————————————————

原文链接:https://blog.csdn.net/weixin_40328662/article/details/99843102

 

 

 

 

 

 

分享到:
评论

相关推荐

    list去重.txt

    在java的list中由于经常存在重复的元素,需要去重,这个时候要用到list去重,将一些不必要展现出来的元素展现出来

    Java中对List去重 Stream去重的解决方法

    Java中List去重和Stream去重的解决方法 List去重是Java中的一种常见操作,对于List中的重复元素进行去重,从而使得List中的元素变得独一无二。 Java中提供了多种方法来实现List去重,下面我们将对其中的一些方法...

    简述Java List去重五种方法

    Java List去重五种方法 Java List去重是Java编程中的一种常见操作,用于从List中删除重复的元素。在本文中,我们将介绍五种不同的方法来实现Java List去重。这些方法包括使用Java 8的Stream API、双重for循环、Set...

    java中List对象列表实现去重或取出及排序的方法

    Java中List对象列表实现去重或取出及排序的方法 在Java中,对List对象列表实现去重或取出及排序是一种常见的操作。下面将详细介绍相关的方法和实现。 1. 实体类重写equals和hashCode方法 在Java中,想要去重List...

    Java数组去重 集合List去重的常用方法总结

    ### Java数组去重与List集合去重的常用方法总结 #### 一、Java数组去重方法 在实际的开发工作中,经常会遇到需要处理数组中重复元素的问题。下面将详细介绍两种常用的数组去重方法。 ##### 方法一:For双循环法 ...

    java list去重操作实现方式

    然而,在处理List时,有时我们需要确保列表中的元素不含有重复项,这时就需要进行去重操作。本文将详细介绍两种Java中对List进行去重的方法,分别是不带类型参数的写法和带类型参数的写法,并通过示例代码进行演示。...

    Java实现对两个List快速去重并排序操作示例

    一、List去重操作 在Java中,我们可以使用HashSet来实现List的去重操作。HashSet是一种不允许重复元素的集合,因此我们可以将List中的元素添加到HashSet中,然后将HashSet转换回List,以达到去重的目的。 例如,...

    python中对list去重的多种方法

    问题就是对一个list中的新闻id进行去重,去重之后要保证顺序不变。 直观方法 最简单的思路就是: 复制代码 代码如下: ids = [1,2,3,3,4,2,3,4,5,6,1] news_ids = [] for id in ids:  if id not in news_ids:  news...

    java学习笔记--第二天(list去重问题)

    在Java学习过程中,第二天的主题可能涉及了数据结构和集合框架中的一个重要概念——列表(List)的去重问题。这里我们主要探讨如何在Java中处理List的重复元素,以及可能涉及到的相关技术。 首先,让我们理解列表去重...

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    1:contains判断去重(有序) 此方法的优点的:理解起来比较简单,并且最终得到的集合也是有序的,这里的有序指的是新集合的排列顺序和原集合的顺序是一致的;但缺点是实现代码有点多,不够简洁优雅。 2:迭代器去重...

    java list根据对象的某个属性的值去重

    java list根据对象的某个属性的值去重,java list根据对象的某个属性的值去重java list根据对象的某个属性的值去重

    C++ 基于容器的输入排序文件输出

    使用了list vector 容器试验输入,并进行排序去重以及输出到文件

    如何实现java8 list按照元素的某个字段去重

    在Java编程中,有时我们需要处理列表(List)数据结构,并且在处理过程中,可能需要根据元素的特定字段去重。Java 8引入了Stream API,它提供了强大的数据处理能力,包括去重操作。本篇文章将详细讲解如何使用Java 8...

    python去重,一个由dict组成的list的去重示例

    ### Python去重——一个由dict组成的list的去重方法 在Python编程中,经常会遇到需要对数据进行处理的情况,特别是当涉及到数据清洗时,去除重复数据是一项非常重要的任务。本篇文章将详细介绍如何对一个由字典...

    List 集合去重的3种方法.docx

    在Java编程中,处理列表(List)集合的去重是一个常见的任务,特别是在处理大量数据时。上述描述中提到了在实际开发中遇到的问题,即如何在一个没有主键的集合对象中,根据特定条件(如业务需求)筛选出不重复的元素...

    python列表list保留顺序去重的实例

    在Python编程中,列表(List)是最常用的数据结构之一,它允许存储任意类型的对象,并且提供了丰富的操作方法。然而,在处理包含重复元素的列表时,我们有时需要保留元素的原始顺序并去除重复项。这就是所谓的“保留...

    数组重复元素去除

    数组重复元素去除,简单方法实现,代码粗糙,刚刚入门,见笑了

    C#对多个集合和数组的操作方法(合并,去重,判断)

    List&lt;int&gt; listA = new List&lt;int&gt; {1,2,3,5,7,9}; List&lt;int&gt; listB = new List&lt;int&gt; {13,4,17,29,2}; listA.AddRange(listB ); 把集合A.B合并 List&lt;int&gt; Result = listA.Union(listB).ToList(); //剔除重复项 List...

    list的排序和去重

    list的排序和去重等的方便操作,此文档为自己写代码的下载,会比较难懂,请大家耐心查看啊

Global site tag (gtag.js) - Google Analytics