

java源码:
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;
假设list初始化默认为10
当第第10个被赋值时list是不会增长长度的,因为此时不需要开辟新的内存
当第11个时将执行会新开辟内存 (if (minCapacity > oldCapacity) 为真 )
因为包含第11个,所以新增后数组长度则为 10 + 10/2 + 1
但是实际上未赋值的为5
也就是说每次开辟新内存时 都需要多开辟1为当前赋值用
这里明显是50%+1.
but此题不一样
ArrayList的构造函数总共有三个:
(1)ArrayList()构造一个初始容量为 10 的空列表。
(2)ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
(3)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。 调用的是第三个构造函数,直接初始化为大小为20的list,没有扩容,所以选择A ArrayList list=new ArrayList(); 这种是默认创建大小为10的数组,每次扩容大小为1.5倍 ArrayList list=new ArrayList(20); 这种是指定数组大小的创建,没有扩充。
--------------------------------------------------------------------------------------------------------------------------

桥接模式是结构型模式,关注点在依赖关系的维护。对于jdbc技术来说,它解耦了业务与数据库通信协议这两个纬度之间的关系,所以这两个纬度之间的关系就需要一个桥,即Driver,至于DriverManager把这个关系接到哪里就是运行时的事情了。
微观上,从connection的创建来看,它更像一个抽象工厂模式,特定的Driver创建对应的connection。
宏观上,从业务代码与connection的关系来看,关键点在于一个sql怎么转化为对应的通信协议,就属于桥接
--------------------------------------------------------------------------------------------------------------------------

效率:System.arraycopy > clone > System.copyOf > for循环
--------------------------------------------------------------------------------------------------------------------------
jdk版本的改动,抽象类与接口发生变化

