我正在阅读ArrayList实现,并且无法理解此方法中的一件事:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白这个oldData数组用于什么:
Object oldData[] = elementData;
Run Code Online (Sandbox Code Playgroud)
对我来说,似乎这个局部变量里面的ensureCapacity方法绝对没有意义.
是的,那条线完全是多余的,并且没有重构就离开了.
看起来这个方法得到了解决,Java 7 version整个方法被重构了增加支持数组的逻辑.
Authers创建了另一个调用的方法,grow()并从第7版移动了逻辑.
public void ensureCapacity(int minCapacity) {
191 int minExpand = (elementData != EMPTY_ELEMENTDATA)
192 // any size if real element table
193 ? 0
194 // larger than default for empty table. It's already supposed to be
195 // at default size.
196 : DEFAULT_CAPACITY;
197
198 if (minCapacity > minExpand) {
199 ensureExplicitCapacity(minCapacity);
200 }
201 }
202
203 private void ensureCapacityInternal(int minCapacity) {
204 if (elementData == EMPTY_ELEMENTDATA) {
205 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
206 }
207
208 ensureExplicitCapacity(minCapacity);
209 }
210
211 private void ensureExplicitCapacity(int minCapacity) {
212 modCount++;
213
214 // overflow-conscious code
215 if (minCapacity - elementData.length > 0)
216 grow(minCapacity);
217 }
private void grow(int minCapacity) {
234 // overflow-conscious code
235 int oldCapacity = elementData.length;
236 int newCapacity = oldCapacity + (oldCapacity >> 1);
237 if (newCapacity - minCapacity < 0)
238 newCapacity = minCapacity;
239 if (newCapacity - MAX_ARRAY_SIZE > 0)
240 newCapacity = hugeCapacity(minCapacity);
241 // minCapacity is usually close to size, so this is a win:
242 elementData = Arrays.copyOf(elementData, newCapacity);
243 }
244
245 private static int More ...hugeCapacity(int minCapacity) {
246 if (minCapacity < 0) // overflow
247 throw new OutOfMemoryError();
248 return (minCapacity > MAX_ARRAY_SIZE) ?
249 Integer.MAX_VALUE :
250 MAX_ARRAY_SIZE;
251 }
Run Code Online (Sandbox Code Playgroud)