在根据SonarQube建议更改一些代码时,我会在下面的行中了解:
- 容量自动增加Vector默认为其数组的大小加倍。当您将一个元素插入ArrayList时,它 将阵列大小增加50%。
醇>
现在我想知道是否需要用ArrayList替换Vector,可能会导致代码无法正常执行。
请记住现有的Vector没有做任何安全的工作。
问题:
ArrayList是否足以像vector一样调整大小?
在除同步之外的任何条件下用ArrayList替换Vector是否安全?
是否有任何确切的Vector替换(不期望线程安全)
请随时更新问题或提出任何问题。
答案 0 :(得分:2)
Vector
和ArrayList
之间的差异是这样的:
Vector
已同步,而ArrayList
未同步。所以,Vector是线程安全的。 Vector
因为线程安全而很慢。相比之下ArrayList
很快,因为它是非同步的。默认情况下,Vector
的数量增加一倍。当您将一个元素插入ArrayList
时,它会将其数组大小增加50%。
ArrayList:
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); // 50%
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
载体:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity); // default 100%
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
ArrayList未定义增量大小。 Vector定义增量大小。
/**
* The amount by which the capacity of the vector is automatically
* incremented when its size becomes greater than its capacity. If
* the capacity increment is less than or equal to zero, the capacity
* of the vector is doubled each time it needs to grow.
*
* @serial
*/
protected int capacityIncrement;
基于以上内容:
ArrayList
无法像Vector
一样调整大小。ArrayList
不是线程安全的。它不能直接在多个线程中用Vector
替换ArrayList
。 它主要可以在单个线程中用Vector
替换ArrayList
。因为声明Vector
和ArrayList
:
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
答案 1 :(得分:0)
我没有看到问题。 Vector和ArrayList的确切性能指标并不相同,但对于大多数实际目的而言,这并不重要。 ArrayList将在需要时扩展,并且比Vector更频繁(如果您事先没有告诉它所需的容量)。来吧。
如有问题:1。是2.是3.否