java - HashSet<User>修改,而user只有最终值 'equals/hashcode'

标签 java multithreading hashset

我读了一些关于 HashSets 的文档性能,但我仍然一无所获。

我有一个可变的 User类,其中有一个唯一的、t 安全的最终字段:

public User {

    // magical thread-safe, immutable int
    private final int userID;
    // some mutable stuff

    public User(int userID){
        this.userID = userID;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;

        return Objects.equals(userID, user.userID);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userID);
    }
}

我有一个线程安全的不可变字段 - userID。

现在,我创建一个 HashSet<User> users容器,这里开始我的问题。

我经常迭代这个集合,找到 User通过他的昵称、ID 或其他一些变量,有时我会更改它们的值(可变值,而不是字符串),但 userID 始终保持不变。

在这种情况下迭代和修改可变对象是否会影响 HashSet 表现?如果我有hashcode()其中只包含一个不可变的值 - 应该没问题,对吧?

非常感谢您的帮助!

编辑

将 AtomicInteger 更改为 int - 不需要原子性,它已经是 t 安全的

最佳答案

只要修改的字段不是 hashCode/equals 的一部分,这就不成问题。

关于java - HashSet<User>修改,而user只有最终值 'equals/hashcode',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40717804/

相关文章:

java - 使用 struts2 操作处理许多并发的 AJAX 请求

java - 制作一个 Hashmap,其键是字符串,值是 HashSets

java - 枚举类型的空指针访问警告

java - 如何诱导或帮助Java编译器优化代码?

android - 与 AsyncTask 线程通信?处理程序不工作?

python - 如何在另一个线程中设置 qasync 事件循环?

c++ - unordered_set<reference_wrapper<Ty>> 有效吗?

rust - 在不分配新 String 的情况下检查 HashSet<Rc<String>> 中是否包含字符串切片

java - 钱能买到的最好的工具

java - 使用具有自己的安全框架的 axis2 ramaprt 模块