Java中剔除相同数据的几种方法

使用HashSet
HashSet是Java中一个非常有用的集合类,它基于哈希表实现,具有很好的性能,当我们将一个对象添加到HashSet中时,HashSet会自动检查该对象是否已存在,如果存在,则不会添加,从而实现了去除重复数据的功能。
基本用法
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("apple"); // 重复添加,HashSet会自动忽略
for (String fruit : set) {
System.out.println(fruit);
}
}
}
原理分析
HashSet通过计算对象的hashCode()值来确定其在哈希表中的位置,当添加一个新元素时,HashSet会先计算其hashCode()值,然后查找哈希表中是否已存在具有相同hashCode()值的元素,如果存在,则认为添加失败;如果不存在,则将新元素添加到哈希表中。
使用LinkedHashSet
LinkedHashSet是HashSet的子类,它不仅具有HashSet的特性,还能保持元素的插入顺序,如果需要去除重复数据,同时保持原有顺序,可以使用LinkedHashSet。
基本用法

import java.util.LinkedHashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("apple");
set.add("banana");
set.add("apple"); // 重复添加,LinkedHashSet会自动忽略
for (String fruit : set) {
System.out.println(fruit);
}
}
}
原理分析
LinkedHashSet内部维护了一个双向链表,用于记录元素的插入顺序,当添加一个新元素时,LinkedHashSet会先计算其hashCode()值,然后查找哈希表中是否已存在具有相同hashCode()值的元素,如果存在,则认为添加失败;如果不存在,则将新元素添加到哈希表中,并将其插入到双向链表的末尾。
使用Arrays.sort()
对于数组类型的集合,可以使用Arrays.sort()方法进行排序,然后通过遍历数组来实现去除重复数据的功能。
基本用法
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] fruits = {"apple", "banana", "apple", "orange"};
Arrays.sort(fruits); // 排序
for (String fruit : fruits) {
if (fruit.equals(fruits[0])) {
System.out.println(fruit);
}
}
}
}
原理分析
Arrays.sort()方法使用快速排序算法对数组进行排序,排序后,相同的数据会相邻排列,通过遍历排序后的数组,我们可以比较相邻元素是否相同,从而实现去除重复数据的功能。
使用自定义方法

如果需要处理自定义对象,可以使用自定义方法来去除重复数据。
基本用法
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 18));
students.add(new Student("Jerry", 20));
students.add(new Student("Tom", 18)); // 重复添加
List<Student> uniqueStudents = new ArrayList<>();
for (Student student : students) {
if (!uniqueStudents.contains(student)) {
uniqueStudents.add(student);
}
}
for (Student student : uniqueStudents) {
System.out.println(student.getName() + ", " + student.getAge());
}
}
}
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && name.equals(student.name);
}
@Override
public int hashCode() {
return 31 * name.hashCode() + age;
}
}
原理分析
自定义方法中,我们首先创建了一个Student类,并重写了equals()和hashCode()方法,equals()方法用于比较两个Student对象是否相等,hashCode()方法用于生成Student对象的哈希码,在主方法中,我们创建了一个Student列表,并添加了重复的数据,我们遍历列表,使用contains()方法检查是否已存在相同的Student对象,如果不存在,则将其添加到新的列表中。
在Java中,有多种方法可以用来剔除相同数据,根据实际需求,可以选择合适的方法来实现这一功能,本文介绍了使用HashSet、LinkedHashSet、Arrays.sort()和自定义方法四种方法来去除重复数据,并分析了各自的原理,希望对您有所帮助。