Java 静态ConcurrentHashMap副本中的值对象是否会引用与原始值对象相同的值对象?

Java 静态ConcurrentHashMap副本中的值对象是否会引用与原始值对象相同的值对象?,java,static,synchronized,concurrenthashmap,Java,Static,Synchronized,Concurrenthashmap,我有一个由两部分组成的问题 Iterator itr = servers.entrySet().iterator(); Map.Entry pair; while(itr.hasNext()) { pair = (Map.Entry)itr.next(); Server s= (Server) pair.getValue(); ... 我有: 私有静态

我有一个由两部分组成的问题

Iterator itr = servers.entrySet().iterator();
            Map.Entry pair;
            while(itr.hasNext()) {
                pair = (Map.Entry)itr.next();
                Server s= (Server) pair.getValue();
                ...
我有:
私有静态ConcurrentHashMap服务器=null
我后来填充了它。在方法
getAllServers
中,我执行以下操作:

public static synchronized ConcurrentHashMap<Integer, Server> getAllServers() {
    ConcurrentHashMap<Integer, Server> toReturn = new ConcurrentHashMap<>();
    for(Integer i = 0; i < servers.size(); i ++ ) {
        Server s = servers.get(i);
        if(s.isAlive()) {
            s.incrementConns();
            toReturn.put(i, s);
        }
    }
    return toReturn;
}
Iterator itr = servers.entrySet().iterator();
            Map.Entry pair;
            while(itr.hasNext()) {
                pair = (Map.Entry)itr.next();
                Server s= (Server) pair.getValue();
                ...

但是我没有看到任何错误,因为我知道
服务器
将包含ID从0开始的
整数
服务器。当我在for循环中迭代它们时,顺序对我来说并不重要。

是和是。就这段代码而言,甚至可能无法复制
Server
对象。这与
ConcurrentHashMap
无关,与Java中引用的工作方式有关。

是和是。就这段代码而言,甚至可能无法复制
Server
对象。这与
ConcurrentHashMap
无关,与Java中引用的工作方式有关

Iterator itr = servers.entrySet().iterator();
            Map.Entry pair;
            while(itr.hasNext()) {
                pair = (Map.Entry)itr.next();
                Server s= (Server) pair.getValue();
                ...
  • 服务器
    仅保存对
    服务器
    对象的引用:您对基础对象所做的任何修改都将反映在
    服务器
  • 是的
  • 请注意,如果代码没有正确同步,您可能会在代码中看到过时和/或不一致的
    Server
    对象,但这是另一个问题

    Iterator itr = servers.entrySet().iterator();
                Map.Entry pair;
                while(itr.hasNext()) {
                    pair = (Map.Entry)itr.next();
                    Server s= (Server) pair.getValue();
                    ...
    
  • 服务器
    仅保存对
    服务器
    对象的引用:您对基础对象所做的任何修改都将反映在
    服务器
  • 是的

  • 请注意,如果代码没有正确同步,您可能会在代码中看到过时和/或不一致的
    Server
    对象,但这是另一个问题。

    Read to start<代码>ConcurrentHashMap
    并不重要。您需要理解对象引用。对于初学者来说,您的循环非常脆弱;不能保证您的密钥是一组连续的数字,如果有,则
    列表将更有意义。有没有理由不在
    服务器上迭代。entrySet()
    ?另外,您谈论的是“值对象”,但是
    s.incrementConns()
    听起来像一个变种人。是的,是的,还有Yes@chrylis:用于服务器对象的键是类中的整数参数,该参数在静态ServerCreator类中构造对象时分配给对象。顺序无关紧要,只要迭代遍历映射的所有值,这些值都是服务器对象。是的,
    incrementConns()
    是一个修改对象另一个参数的变数-在同一个循环中使用变数是不是一个坏主意?迭代器不会遍历所有值,除非它们在映射长度减去1的过程中始终正好为0。读取开始<代码>ConcurrentHashMap
    并不重要。您需要理解对象引用。对于初学者来说,您的循环非常脆弱;不能保证您的密钥是一组连续的数字,如果有,则
    列表将更有意义。有没有理由不在
    服务器上迭代。entrySet()
    ?另外,您谈论的是“值对象”,但是
    s.incrementConns()
    听起来像一个变种人。是的,是的,还有Yes@chrylis:用于服务器对象的键是类中的整数参数,该参数在静态ServerCreator类中构造对象时分配给对象。顺序无关紧要,只要迭代遍历映射的所有值,这些值都是服务器对象。是的,
    incrementConns()
    是一个修改对象另一个参数的变量-在同一个循环中使用变量是一个坏主意吗?迭代器不会遍历所有的值,除非它们在映射长度减去1的过程中始终正好为0。
    Iterator itr = servers.entrySet().iterator();
                Map.Entry pair;
                while(itr.hasNext()) {
                    pair = (Map.Entry)itr.next();
                    Server s= (Server) pair.getValue();
                    ...