如何去除St对象数组中的重复元素并生成新数组?
数组去重重复对象的解决方案
首先必须明确:要判断两个St对象是否重复,你需要在St类中正确重写equals()和hashCode()方法——默认的Object.equals只会比较对象的内存地址,即使两个对象的id和name完全一致,也会被当成不同对象。
步骤1:重写St类的equals和hashCode
根据你的业务规则(id和name都相同则视为重复),重写方法如下:
import java.util.Objects; class St { private int id; private String name; // 构造方法 public St(int id, String name) { this.id = id; this.name = name; } // getter/setter(按需添加) public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 重写equals:判断id和name是否都相等 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; St st = (St) o; return id == st.id && Objects.equals(name, st.name); } // 重写hashCode:和equals逻辑保持一致,用id和name生成哈希值 @Override public int hashCode() { return Objects.hash(id, name); } // 可选:重写toString方便打印查看 @Override public String toString() { return "St{id=" + id + ", name='" + name + "'}"; } }
步骤2:实现去重逻辑
方法一:用HashSet快速去重(推荐,代码简洁)
HashSet会自动过滤重复元素,依赖你刚才重写的equals和hashCode:
import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class Main { public static void main(String[] args) { St[] students = {new St(1, "a"), new St(1, "a"), new St(2, "b")}; // 将数组转成HashSet去重 Set<St> uniqueStudentSet = new HashSet<>(Arrays.asList(students)); // 再将Set转回数组 St[] uniqueStudents = uniqueStudentSet.toArray(new St[0]); // 打印去重后的结果 for (St st : uniqueStudents) { System.out.println(st); } } }
方法二:手动遍历去重(无需额外集合类的场景)
用一个临时列表存储已出现的元素,遍历原数组时判断是否已存在:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { St[] students = {new St(1, "a"), new St(1, "a"), new St(2, "b")}; List<St> uniqueStudentList = new ArrayList<>(); for (St st : students) { // 利用contains判断是否已存在(依赖equals方法) if (!uniqueStudentList.contains(st)) { uniqueStudentList.add(st); } } // 转成数组 St[] uniqueStudents = uniqueStudentList.toArray(new St[0]); // 打印结果 for (St st : uniqueStudents) { System.out.println(st); } } }
你原有代码的问题说明
- 重复比较效率低:双层嵌套循环会重复对比元素(比如第0个和第1个,第1个和第0个都会触发判断),时间复杂度为O(n²),数据量大时性能很差。
- 未实现去重逻辑:你的代码只是打印重复项,没有将不重复的元素收集成新数组。
- 依赖equals的正确性:如果没重写St类的equals,即使对象内容相同,
objects[i].name.equals(objects[j].name)只能判断name相同,但无法保证id也相同,而且默认equals会认为是不同对象。
内容的提问来源于stack exchange,提问作者AishaWho
相关产品推荐
相关产品推荐

