我不确定我是否正在使用正确的术语,但我很好奇它是如何确定在Java中填充时Java的大小增加多少?我尝试过搜索,但我并没有真正想出任何有用的东西。
所以,如果我有类似的东西
List l = new ArrayList(1);
l.add("1");
l.add("2");
它如何确定增加列表大小的程度?它总是一个设定值,如果是这样,那个值是多少?如果它不同,我也会对BitSet的这些信息感兴趣。
谢谢,让我知道我是否应该澄清任何问题。
答案 0 :(得分:7)
它调用ensureCapacity
:
/**
* Increases the capacity of this <tt>ArrayList</tt> instance, if
* necessary, to ensure that it can hold at least the number of elements
* specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3) / 2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
您可以看到newCapacity
是(oldCapacity * 3) / 2 + 1
答案 1 :(得分:2)
ArrayList的源代码包含一些线索:
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return <tt>true</tt> (as specified by {@link Collection#add})
*/
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
/**
* Increases the capacity of this <tt>ArrayList</tt> instance, if
* necessary, to ensure that it can hold at least the number of elements
* specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
这一行:int newCapacity = (oldCapacity * 3)/2 + 1;
显示ArrayList更改的数量。
答案 2 :(得分:2)
ArrayList包含一个对象数组,这些对象在确保元素可以在数组中增长的大小时会增长。
在ArrayList.ensureCapacity()
内。
如果需要,增加此ArrayList实例的容量 确保它至少可以容纳 由...指定的元素数 最小容量参数。
add(E e)
来电ensureCapacity()
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
答案 3 :(得分:2)
答案 4 :(得分:1)
通常容量加倍(或乘以常数)。这可确保插入新元素所需的时间大致为 O(n)(与 n 的大小无关)。
答案 5 :(得分:1)
这取决于您使用的JDK实现。我找到了following algorithm(在Apache Harmony中使用):
int increment = size / 2;
if (required > increment) {
increment = required;
}
if (increment < 12) {
increment = 12;
}
意味着尺寸增加了旧尺寸的一半,最小尺寸为12。
但正如我所说,这是特定于实现的,因此所有JVM都可以按照自己的方式处理这个问题。
答案 6 :(得分:0)
ArrayList容量根据需要增加。当您在其上设置容量时,您正在设置初始容量 - 您正在为构造函数提供猜测,以便集合可以具有良好的初始大小。 ArrayList!= Array。
答案 7 :(得分:0)
Java中的ArrayList永远不会满,当它已满时它的大小会增长,需要在其中添加更多数据。
如果你想询问低级实现,我假设ArrayList可以使用数组来包含数据。然后,我认为当ArrayList保存的数组已满时,ArrayList会创建一个双倍大小的新数组,并将旧数组中的所有元素复制到新数组中。但这是我的假设,你需要阅读java doc