ArrayList <string>未设置最小容量</string>

时间:2011-07-13 22:25:41

标签: java string for-loop arraylist

private static ArrayList<String> places(ArrayList<Road> roads) {
    ArrayList<String> places = new ArrayList<String>(10); // tried setting minimum capacity
    places.ensureCapacity(10); // tried setting minimum capacity

    for (int i = 0; i < roads.size(); i++) {
        String from = roads.get(i).getFrom();
        String to = roads.get(i).getTo();

        for (int j = 0; j < places.size(); j++) { // this is where things go wrong, it doesn't iterate because the "j < places.size()" condition isn't met
            if ((places.get(i).equals(from))==false) {
                places.add(from);
            }
            if ((places.get(i).equals(to))==false) {
                places.add(to);
            }
        }
    }

    return places;
}

不知道为什么但是places-ArrayList没有设置初始容量,导致无法在以后必须迭代的地方(处理j变量的for循环)。 / p>

4 个答案:

答案 0 :(得分:4)

最小容量与尺寸不同。设置容量只是列表的一个提示,它应该至少有这么多的存储空间以避免不必要的数组副本,但不影响大小,所以即使你有n个元素的容量,size()可以更少,并且调用get(n-1)可能会产生IndexOutOfBoundsException

要创建一个用null填充的大小为n的列表,请尝试

List<String> myList = new ArrayList<String>(n);
for (int i = 0; i < n; ++i) { myList.add(null); }

答案 1 :(得分:2)

capacity属性只是为类提供了内部缓冲区维度的大小。它没有向列表添加任何值(顺便说一句,这些值会被添加?)所以列表仍然是空的。

容量的唯一影响是允许类在执行后期避免调整其缓冲区大小(以及相关的性能损失)。但这不是一个硬性限制。您可以像使用任何其他列表一样随意添加或添加更多元素。

答案 2 :(得分:0)

使用foreach

for(Road road : roads)
{
    String from = road.getFrom();
    String to = roads.getTo();
    for(Places place: places)
    {
        if(!place.equals(from)) places.add(from);
        if(!place.equals(to))   places.add(to);
    }
}

答案 3 :(得分:0)

ArrayList.ensureCapacity()分配足够的内存以容纳给定数量的条目。它实际上并没有将任何内容放入ArrayList

ArrayList.size()计算实际条目的数量,而非当前容量。

在致电places.size()以实际将任何内容放入places.add()之前,您的循环会查看places。在循环开始时调用places.size()时,它会正确返回0,因为此时您尚未将任何内容放入places

另一点。您有一个名为places的方法,在该方法中还有一个名为places的局部变量。这是混乱的一个秘诀。您应该为其中一个使用不同的名称。