Java ArrayList 怎么去重
使用 java stream api 的 distinct() 方法配合 collect(collectors.tolist()) 是最简洁的去重方式,它依赖元素的 equals() 和 hashcode() 方法。如果希望保持原有顺序且仅处理对象类型,推荐使用此方法;若需去重后保留特定逻辑(如按某字段),可结合 collectors.tomap() 实现。

如何基于自定义字段去重并保持顺序
当需要基于对象的某个特定字段(如 ID)去重时,可以使用 Collectors.toMap() 将列表转换为 Map,利用 Key 的唯一性去重,再通过 LinkedHashMap 保持插入顺序,最后提取 Values 转回 List。这种方法比 distinct() 更灵活,适用于复杂对象。

去重后的结果是否包含原始对象引用
Stream 去重操作返回的是新 List,其中的元素引用与原 List 中的相同。这意味着修改去重后 List 中对象的属性会影响原对象,但 List 本身的容量和结构是独立的。若原 List 被修改(如添加/删除元素),不会影响去重后的 List,反之亦然。
立即学习“Java免费学习笔记(深入)”;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 示例输入:包含重复项的 ArrayList
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "A", "C", "B"));
// 方法1:基础去重(依赖 equals/hashCode)
List<String> distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
System.out.println("基础去重: " + distinctList);
// 示例输入:自定义对象列表
List<Person> people = Arrays.asList(
new Person(1, "Alice"),
new Person(2, "Bob"),
new Person(1, "Alice Duplicate") // ID 重复
);
// 方法2:基于 ID 去重,保持顺序
List<Person> uniquePeople = people.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(Person::getId, p -> p, (existing, replacement) -> existing, LinkedHashMap::new),
map -> new ArrayList<>(map.values())
));
System.out.println("基于ID去重: " + uniquePeople);
}
}
class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() { return id; }
public String getName() { return name; }
@Override
public String toString() {
return "Person{id=" + id + ", name='" + name + "'";
}
}预期输出:
基础去重: [A, B, C]
基于ID去重: [Person{id=1, name='Alice'}, Person{id=2, name='Bob'}]


















