Java Hashset不在循环中创建新引用

时间:2019-05-28 13:03:17

标签: java set hashset

我有一个问题,我正在用一种方法对我的Graph(节点集)执行一些操作并检索它。现在,当再次调用该方法而不是获取新的节点集时,它将继续编辑在第一个操作循环中返回的先前的节点集。我猜这是一个参考问题,但找不到解决方案。这是我的示例代码。

public class hello {

    Set<Node> vertices;
    private Set<Node> unChangedvertices;

    public hello(PathMap map) {
        GraphRep graph = new GraphRep(map);  // return list of nodes in hashset
        GraphRep gg = new GraphRep(map);
        vertices = new HashSet<>(graph.getNodes());
        unChangedvertices = new HashSet<>(gg.getNodes());
        List<Set<Node>> tDistancefromAllVerteices = new ArrayList<Set<Node>>();

        for (int i = 0; i <= 3; i++) {
            // calculateShortestPath method will find the shortest route and return resultant graph
            Set<Node> sing = new HashSet<>(calculateShortestPath(new GraphRep(map), i));
            tDistancefromAllVerteices.add(sing);
        }
    }
    public  Set<Node>  calculateShortestPathFromSource(GraphRep graph, Node source) {
      Set<Node> settledNodes = new HashSet<>();
      // this method finds shortest path from source to all Nodes like in Dijkstra. 

      return settledNodes;
   }

}

public class GraphRep
{
  private  Set<Node> nodes = new HashSet<>();

 /**
 * @return the nodes
 */
  public Set<Node> getNodes() {
    return nodes;
  }
// constructor
  public GraphRep(PathMap map){
    // adding vertices as nodes from map
  }
}

在没有循环的情况下效果很好,但是每当在循环中调用方法时,它将编辑在循环的第一个索引中返回的节点集。

我们将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:0)

java中的对象是共享的。如果将节点放入集合中,并更改该节点的内部结构,字段,则集合所需的顺序可能已损坏。

因此,诸如String,Integer,Double,BigDecimal之类的类是不可变的;可以安全地共享。

很显然calculateShortestPath或其他代码更改了某些内容,可能是w.rt。顶点和边缘。