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版本的改动,抽象类与接口发生变化