set与list在元素查找效率上的根本区别在于底层数据结构和查找机制:1. arraylist基于动态数组,查找需遍历每个元素进行equals比较,时间复杂度为o(n);2. hashset基于哈希表,通过hashcode定位桶位置,再在桶内进行少量比较,平均时间复杂度为o(1),因此在大数据量下set的查找效率远高于list。
Java集合框架中,
Set
HashSet
要高效地判断一个元素是否已存在于集合中,使用
Set
contains()
Set
contains()
以
HashSet
hashCode()
equals()
contains(Object o)
HashSet
o
equals()
ArrayList
立即学习“Java免费学习笔记(深入)”;
import java.util.HashSet; import java.util.Set; public class SetExistenceCheck { public static void main(String[] args) { Set<String> uniqueNames = new HashSet<>(); // 添加元素 uniqueNames.add("Alice"); uniqueNames.add("Bob"); uniqueNames.add("Charlie"); uniqueNames.add("Alice"); // 再次添加,但Set中只会有一个"Alice" System.out.println("集合中的元素: " + uniqueNames); // 输出可能无序,但元素唯一 // 判断元素是否存在 boolean containsBob = uniqueNames.contains("Bob"); System.out.println("集合中是否包含 'Bob'?: " + containsBob); // true boolean containsDavid = uniqueNames.contains("David"); System.out.println("集合中是否包含 'David'?: " + containsDavid); // false // 实际应用场景:快速去重并判断 String newName = "Bob"; if (uniqueNames.contains(newName)) { System.out.println(newName + " 已经存在,无需添加。"); } else { uniqueNames.add(newName); System.out.println(newName + " 已添加。"); } } }
这段代码清晰地展示了
Set
很多人初学Java集合时,可能都会习惯性地用
List
list.contains()
Set
核心差异在于它们底层的数据结构和查找机制。
ArrayList
contains()
equals()
N
N
而
HashSet
HashSet
hashCode()
HashSet
equals()
List
ArrayList
HashSet
Java 提供了几种
Set
HashSet
Set
HashSet
LinkedHashSet
LinkedHashSet
HashSet
LinkedHashSet
HashSet
LinkedHashSet
TreeSet
TreeSet
Comparable
Comparator
HashSet
TreeSet
TreeSet
TreeSet
HashSet
当你开始在
Set
hashCode()
equals()
Set
HashSet
hashCode()
equals()
hashCode()
equals()
HashSet
Set
contains()
contains(B)
Set
contains()
false
hashCode()
equals()
正确的做法是:
equals()
hashCode()
equals()
hashCode()
举个例子:
class User { private String id; private String name; public User(String id, String name) { this.id = id; this.name = name; } // 假设我们认为只要id相同,就是同一个User @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return id.equals(user.id); // 核心:基于id判断相等 } @Override public int hashCode() { return id.hashCode(); // 核心:hashCode也基于id生成 } @Override public String toString() { return "User{id='" + id + "', name='" + name + "'}"; } } // 测试 public class CustomObjectSetTest { public static void main(String[] args) { Set<User> users = new HashSet<>(); users.add(new User("001", "Alice")); users.add(new User("002", "Bob")); users.add(new User("001", "Alice Smith")); // id相同,但name不同 System.out.println("Set中的用户数量: " + users.size()); // 期望是2,因为"001"是重复的 System.out.println("Set中的用户: " + users); User userToFind = new User("002", "Robert"); // id相同,name不同 boolean found = users.contains(userToFind); System.out.println("是否找到ID为002的用户?: " + found); // 期望是true } }
如果没有重写
hashCode()
equals()
User
Object
users.add(new User("001", "Alice Smith"))
Set
这是一个非常经典的坑,我记得刚开始写Java代码的时候,没少在这上面栽跟头。明明看着内容一样的对象,
Set
contains()
hashCode()
equals()
以上就是Java集合框架如何使用Set判断元素是否存在_Java集合框架元素查找的高效方法指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号