HashSet删除重复元素

应用场景:经常遇到网络请求回来的数据是一个list形式的列表,这个List<T>的数据类型是自己定义的数据类型,这里面包含了重复元素,而重复元素的判断重复的标准往往是自己定义数据类型的某个成员变量来区分,比如,返回的是设备信息,则会有一个对应的设备ID字段,如果是人物信息,返回注册手机号等等。如果通过for循环等手段不仅耗时,还需要同步返回的数据列表。是一个非常令人头疼的问题。高效的解决这个问题途径就是hashset,具体原理暂时先不分析,直接给出应用demo。

比如这是一个返回的设备信息Bean类,和网络返回数据json数据相对应。

public class Devices {

    private final static int HashCode = 60;
    /**
     * 设备id
     **/
    private String did;
    /**
     * 设备名称
     **/
    private String dname;
}

网络请求返回的是一个LIst数组,这时候不要用LIst来转换网络请求结果,直接通过HashSet来转换,而实际上仅通过将数据转换成HashSet数据类型,并不能将重复数据彻底清除,因为hashset还不知道定义为“重复”的标准是什么。因此在上面Devices中添加以下代码:


 @Override
    public int hashCode() {
        return HashCode;
    }

    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Devices)) {
            return false;
        }
        //对传入对象上转型为Devices对象
        Devices mDev = (Devices) obj;
        //判断两个对象设备id一致认为是一个设备
        return this.did.equals(mDev.getDid());
    }

这样返回的数据就可以清除其中重复数据,而不用自己手动删除。关于HashSet的原理,后续研究,总之,这个方法简单快键,非常实用,特此记录。


### Java 中使用 HashSet 除数组中的重复元素Java 中,`HashSet` 是一种集合类,它不允许存储复的元素。通过将数组转换为 `HashSet`,可以自动移除其中的复项[^1]。 以下是基于提供的示例代码实现的一个完整解决方案: #### 实现代码 ```java import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class ObjectArrayDeduplication { public static void main(String[] args) { // 定义一个包含重复元素的数组 Integer[] numbers = {1, 2, 2, 3, 4, 4, 5}; // 使用 HashSet 对数组进行操作 Set<Integer> set = new HashSet<>(Arrays.asList(numbers)); // 将后的 HashSet 转换回数组形式 Integer[] uniqueNumbers = set.toArray(new Integer[0]); // 输出结果 System.out.println(Arrays.toString(uniqueNumbers)); } } ``` 上述代码展示了如何利用 `HashSet` 的特性来除数组中的重复元素。具体过程如下: - 首先定义了一个整型数组 `numbers`,该数组包含了若干复值。 - 利用 `Arrays.asList()` 方法将数组转化为列表,并将其作为参数传递给 `HashSet` 构造函数,从而创建一个新的无重复元素的集合对象[^1]。 - 接着调用了 `toArray()` 方法把 `HashSet` 转换成原始类型的数组以便后续处理或展示。 需要注意的是,在某些情况下如果自定义对象被放入到 `HashSet` 当中,则需要确保这些对象正确实现了 `hashCode()` 和 `equals(Object obj)` 方法,因为这两个方法决定了两个实例是否被认为是相等以及它们应该存放在哈希表中的哪个位置[^2]。 #### 自定义对象注意事项 当尝试对由用户定义的对象组成的数组执行相同的操作时,必须注意以下几点: - 如果仅覆盖其中一个而未同步调整另一个的话可能会导致意外行为——即使逻辑上认为应该是相同的条目也可能无法识别出来并保留下来。 例如下面这个测试案例说明了这一点: ```java @Test public void test01(){ HashSet<SetModel> set=new HashSet<>(); set.add(new SetModel("aaa")); set.add(new SetModel("bbb")); CollectionUtils.printList(set); } //输出结果将是: /* SetModel(name=aaa) SetModel(name=bbb) */ ``` 这里假设 `SetModel` 类已经适当覆写了它的 `hashCode/equals` 函数使得名字字段完全匹配即视为同一实体;否则即便名称属性看起来一样但实际上还是会被当作不同的成员加入容器之中[^2]。 ### 性能考量 虽然此方式简单易懂但对于大数据量场景下可能存在性能瓶颈问题,尤其是涉及到频繁增删改查动作的时候更应慎考虑其他替代方案比如采用 LinkedHashSet 来保持插入顺序或者TreeSet来进行自然排序的同时完成唯一化需求等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ezview_uniview

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值