打字猴:1.700443316e+09
1700443316 编写高质量代码:改善Java程序的151个建议 [:1700438134]
1700443317 编写高质量代码:改善Java程序的151个建议 建议63:在明确的场景下,为集合指定初始容量
1700443318
1700443319 我们经常使用ArrayList、Vector、HashMap等集合,一般都是直接用new跟上类名声明出一个集合来,然后使用add、remove等方法进行操作,而且因为它是自动管理长度的,所以不用我们特别费心超长的问题,这确实是一个非常好的优点,但也有我们必须要注意的事项。
1700443320
1700443321 下面以ArrayList为例深入了解一下Java是如何实现长度的动态管理的,先从add方法的阅读开始,代码如下。
1700443322
1700443323 public boolean add(E e){
1700443324
1700443325 //扩展长度
1700443326
1700443327 ensureCapacity(size+1);
1700443328
1700443329 //追加元素
1700443330
1700443331 elementData[size++]=e;
1700443332
1700443333 return true;
1700443334
1700443335 }
1700443336
1700443337 我们知道ArrayList是一个大小可变的数组,但它在底层使用的是数组存储(也就是elementData变量),而且数组是定长的,要实现动态长度必然要进行长度的扩展,ensureCapacity方法提供了此功能,代码如下:
1700443338
1700443339 public void ensureCapacity(int minCapacity){
1700443340
1700443341 //修改计数器
1700443342
1700443343 modCount++;
1700443344
1700443345 //上次(原始)定义的数组长度
1700443346
1700443347 int oldCapacity=elementData.length;
1700443348
1700443349 //当前需要的长度超过了数组长度
1700443350
1700443351 if(minCapacity>oldCapacity){
1700443352
1700443353 Object oldData[]=elementData;
1700443354
1700443355 //计算新数组长度
1700443356
1700443357 int newCapacity=(oldCapacity*3)/2+1;
1700443358
1700443359 if(newCapacity<minCapacity)
1700443360
1700443361 newCapacity=minCapacity;
1700443362
1700443363 //数组拷贝,生成新数组
1700443364
1700443365 elementData=Arrays.copyOf(elementData, newCapacity);
[ 上一页 ]  [ :1.700443316e+09 ]  [ 下一页 ]