Set检查是否为重复对象的策略

本文深入探讨了HashSet如何通过调用HashMap实现元素唯一性。详细解释了利用哈希码提高查找效率的方法,避免了大量数据环境下逐条比较带来的性能瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反思:为什么要先通过先检索hashcode是否相等呢?

查看Hashset的底层源代码:它其实是调用HashMap,而HashMap底层是通过数组维护数据,你想想,如果你的数据是1000万条,每次添加了的时候,你都和所有的元素进行比较,那为了维护不重复,你插入的成本得有多高!!!!太可怕了,!!所以通过引入Hashcode,转换一下,把它作为下标,然后在检查一下这里面存的元素是否想等,用equals比较。

### Java检查 List 对象内的属性是否重复值 为了检测 `List` 集合中的对象是否具有重复的特定属性,可以采用多种方法。一种常见的方式是通过流操作来处理这个问题。 下面是一个具体的例子,假设有一个名为 `Person` 的类,其中包含一个字符串类型的字段 `name`: ```java import java.util.*; import java.util.stream.Collectors; class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Person{name='" + name + "'}"; } } ``` 要验证列表中是否存在相同的名字,则可以通过以下方式完成: ```java public class DuplicateChecker { public static boolean hasDuplicate(List<Person> people, Function<? super Person, ?> keyExtractor) { Set<Object> seen = new HashSet<>(); for (var person : people) { Object keyValue = keyExtractor.apply(person); if (!seen.add(keyValue)) { return true; // 如果添加失败说明已经存在相同的key } } return false; } public static void main(String[] args) { var persons = Arrays.asList( new Person("Alice"), new Person("Bob"), new Person("Charlie"), new Person("Alice") // 重复项 ); System.out.println(hasDuplicate(persons, Person::getName)); // 输出true表示有重复 // 使用Stream API简化上述逻辑 boolean duplicatesPresent = persons.stream() .map(Person::getName) .collect(Collectors.toSet()) .size() != persons.size(); System.out.println(duplicatesPresent); // 同样会输出true } } ``` 这段代码展示了两种不同的策略用于发现给定列表中存在的任何重复名称。第一种方法利用了自定义函数 `hasDuplicate()` 来遍历整个列表并尝试向 `HashSet` 添加键;如果遇到无法成功加入的情况就表明遇到了重复条目。第二种方案则更简洁地运用了 Stream 和 Collector 工具来进行同样的工作[^1]。 对于更加复杂的场景或者当需要保留原始顺序时,还可以考虑使用其他集合类型比如 `LinkedHashSet` 或者借助于分组计数等高级特性来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值