构造函数没有初始化字段?阴影?

时间:2015-03-27 03:48:48

标签: java

我正在尝试创建一个邻接列表,为此我需要创建一个链表的arraylist。当我这样做时,cityList的大小不会改变为构造函数中传递的大小。我觉得这可能是由于阴影,但我不确定阴影是如何工作的,或者是否发生了什么:

import java.util.*;

public class AdjList{

    public ArrayList<EdgeList> cityList;

    public AdjList(int size){
        this.cityList = new ArrayList<EdgeList>(size+1);
    }   

    public void add(int vertex, int edge, int distance, float price){
        cityList.get(vertex).add(edge, distance, price);
    }
}

在我要做的主要课程中:

AdjList flights = new AdjList(numCities);

2 个答案:

答案 0 :(得分:2)

使用new ArrayList<EdgeList>(size+1);创建列表时,size+1是列表的初始容量,而不是其大小。在将元素添加到列表之前,大小将保持为0。

使用以下内容将EdgeList元素添加到列表中:

cityList.get(vertex).add(edge, distance, price);

没有意义,因为它会强制您使用0实例将列表的所有元素从索引vertex初始化为EdgeList。否则cityList.get(vertex)会抛出异常。

如果您希望能够通过顶点访问元素,那么Map<Integer,EdgeList>可能是更好的结构:

this.cityList = new HashMap<Integer,EdgeList>();
...
EdgeList el = new EdgeList();
cityList.put(vertex,el);
el.add(edge, distance, price);

答案 1 :(得分:1)

来自API

ArrayList(int initialCapacity)
Constructs an empty list with the specified initial capacity.

您的代码指定的容量不是大小。将元素添加到列表后,大小将增加。