一个很常有且简单的问题,去除List<Entity>中的重复值,整理一下:
package com.list; public class Person { /** * 居民身份证 */ private Long personId; /** * 姓名 */ private String name; /** * 年龄 */ private int age; public Long getPersonId() { return personId; } public void setPersonId(Long personId) { this.personId = personId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [personId=" + personId + ", name=" + name + ", age=" + age + "]"; } @Override public int hashCode() { return personId != null ? personId.hashCode():0; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person p = (Person)obj; if( getPersonId().equals(p.getPersonId()) && getName().equals(p.getName()) && getAge() == p.getAge()) return true; return false; } }
方法equals是比较两个对象的内存地址是否一样,这很好解释,感觉根据面向对象的原则,没有两个完全一模一样的对象存在,不过为了在编码中实现各种业务需求,有时必须重写equals的方法
重写hashcode,equals的原则:
1)能不重写equals和hashcode的情况下,尽量避免hashcode和equals的重写
2)重写equals必须重写hashcode
3)重写完hashcode方法后,避免改变参与计算hashcode的那些Entity的属性的值,否则会发生一些意外的事情,例如list.remove,hashset中的一些方法的异常
测试代码如下:
package com.list; import java.util.ArrayList; import java.util.List; import org.junit.Before; public class Test { private List<Person> persons = null; private Person p1,p2,p3; @Before public void before(){ persons = new ArrayList<Person>(); p1 = new Person(); p1.setPersonId(123456L); p1.setName("zhangsan"); p1.setAge(11); p2 = new Person(); p2.setPersonId(123456L); p2.setName("zhangsan"); p2.setAge(11); p3 = new Person(); p3.setPersonId(123457L); p3.setName("lisi"); p3.setAge(12); persons.add(p1); persons.add(p2); persons.add(p3); } @org.junit.Test public void test(){ List<Person> personList = new ArrayList<Person>(); if(null != persons){ for(Person p:persons) if( !personList.contains(p) ){ personList.add(p); } } System.out.println(personList.size()); } }
对大多是的list的操作中,例如list.contains操作中,先比较hashcode如果相等,再比较equals的方法
全是一些小知识,理解的不对,请指出,共同成长~
相关推荐
在Java编程中,处理数据集合时,我们常常会遇到去除重复元素的需求。这可能是为了保持数据的唯一性,或者为了优化存储和计算效率。本文将详细介绍如何在Java中去除重复元素,主要关注数组和列表这两种常见数据结构。...
Set 是一个不能包含重复元素的集合,SortedSet 是一个按照升序排列元素的 Set。List 是一个有序的集合,可以包含重复的元素,并提供了按索引访问的方式。Map 是一个包含了 key-value 对的集合,SortedMap 是一个按照...
`List<T>`是.NET框架提供的一个泛型类,它实现了`IList<T>`、`ICollection<T>`和`IEnumerable<T>`接口,提供了动态数组的功能,允许我们方便地添加、删除和查找元素。对于查找重复元素,我们通常会遍历列表,比较每...
在Java中,去除单链表中的重复元素可以通过使用哈希集合(HashSet)来实现,该集合用于存储已经遍历过的元素。在遍历链表的过程中,我们将每个元素与集合中的元素进行比较,如果发现重复,则删除链表中的该元素。 ...
在处理数据时,我们有时需要去除集合中的重复元素。这里我们将详细讨论如何在`List`集合中去除重复对象的实现,特别是针对对象类型的集合。 首先,我们要明确一点:在Java中,当我们说两个对象是重复的,通常是指...
由于HashSet不允许重复,如果有重复元素,它们在转换过程中会被自动去除。接着,我们比较list的大小和转换后的HashSet的大小。如果两者大小不同,说明原始list中存在重复元素,`isRepeat`变量将被设置为`true`。 ...
如果你希望实现一个无序且不允许重复元素的集合,那么`Set`接口可能是更好的选择。 2. **定义属性和行为**:根据业务需求,定义集合类所需的属性,如容量、是否同步等。然后,实现接口中声明的方法,如`add()`、`...
Set接口下的集合类如HashSet不存储重复元素,可以方便地去除列表中的重复项。将List转换为Set,然后再转换回List即可: ```java List<PenBean> uniquePenBeanList = new ArrayList(new HashSet(penBeanList)); ``` ...
- **概述**:Set是一种不允许重复元素的集合,主要用于去除重复数据。 - **常用方法**: - `add(E e)`:向集合添加一个元素。 - `remove(Object o)`:从集合中移除指定元素。 - `contains(Object o)`:检查集合...
6. **输出**:程序的输出首先显示原始列表,然后显示删除重复元素后的列表,展示了removeDuplicates方法的功能。 这个例子展示了如何利用ArrayList的特性有效地删除顺序表中的重复元素。值得注意的是,虽然这种方法...
然而,在某些情况下,我们可能希望创建一个不允许添加重复元素的List。在这种场景下,Python提供了多种策略来实现这个功能。 首先,我们可以使用Python的内置数据结构`set`。Set类似于List,但不包含重复元素,并且...
方法三:删除重复元素,并保持顺序 该方法使用 HashSet 和 Iterator 来删除重复数据,并保持列表的顺序。首先创建一个 HashSet,然后遍历列表,检查每个元素是否在 HashSet 中,如果不在,则添加到 HashSet 和新列表...
本文将深入探讨Java集合类的汇总,包括List、Set和Map这三大核心接口及其实现类。 首先,让我们从List接口开始。List是一种有序的集合,允许有重复元素,并且支持通过索引来访问元素。ArrayList和LinkedList是List...
集合是存储一组元素的数据结构,而List是一种有序的集合,允许重复元素,并且可以通过索引访问。 1. **新增集合**: 当我们需要找出两个List之间的差异,即在第二个List中新增的元素时,可以使用`ArrayList`或`...
在编程领域,尤其是在Java开发中,我们经常遇到需要处理数据集合,例如列表(List),去除其中的重复元素。"去掉list中的重复对象"这个话题是一个常见的需求,特别是在处理业务数据时,确保数据的唯一性至关重要。这...
List接口继承自Collection接口,它定义了一种有序的、允许重复元素的集合。本篇我们将深入探讨List集合,包括其特点、常用实现类、操作方法以及与数组的对比。 List接口的特点: 1. 有序性:List中的元素是有顺序的...
- `HashSet`:不允许重复元素,不保证元素顺序,使用哈希表实现,插入和查找速度较快。 - `LinkedHashSet`:与HashSet类似,但保留了插入的顺序,遍历性能更好。 3. **HashMap和TreeMap**: - `HashMap`:键值对...
`HashSet<T>`是一个不允许重复元素的集合,它基于哈希表实现,提供了高效的元素添加、删除和查找操作。与`List<T>`不同,`HashSet<T>`没有顺序概念,因此不适合需要按特定顺序访问元素的场景。 ### 结论 在C#中...
* int lastIndexOf(Object o):List中如果存在多个重复元素,indexOf()方法返回第一个匹配元素的index,lastIndexOf(o)是返回最后一个匹配元素的index * ListIterator listIterator():返回列表中元素的列表迭代器 *...
对于集合类的迭代,每个集合类都应该提供一个迭代器(Iterator)实例,通过迭代器可以遍历集合中的所有元素,而且能够安全地在遍历过程中删除元素。 整个集合框架非常庞大,本文仅就部分概念和类进行了详细说明,...