ArrayList
1.数组实现:
1 2 3 4 5 |
|
为什么不写成 private transient E[] elementData;??
默认大小
1 2 3 |
|
扩容策略
在add操作中会进行扩容. 扩容策略是:新的大小是原始容量的1.5倍,如果还是不足,就参数指定的大小:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Arrays
排序
包含了一些操作数组的方法,如排序搜索等; 基本类型的数据排序采用快速排序,其中对于long,int,byte等整形直接调用sort1,float和double调用sort2. 一段有趣的代码,通过这个可以知道NaN和-0.0特殊性.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
quicksort流程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
对象数组的排序采用mergesort:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
二分搜索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
double和float,对于==的处理,采用的是Double.doubleToLongBits值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
数组判等equals
其中对double和float元素的判等用Double.doubleToLongBits(Float.floatToIntBits)
数组填充fill
数组拷贝copyOf,copyOfRange
调用System.arraycopy这个native方法
数组hashCode
数组转List方法asList
参数为可变长度数组
数组toString
LinkedList
双向循环链表 注意其中取第i个元素,并不是我们通常想的那样从头开始往下便利,而是根据i偏向于头部还是偏向于尾部来决定从头开始往后找还是从尾开始往前找:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Vector
数组实现
是一种RandomAccess,数组实现:
1 2 3 4 5 6 7 |
|
java public Vector() { this(10); }
1 2 |
|
java private void ensureCapacityHelper(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object[] oldData = elementData; int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2); if (newCapacity < minCapacity) { newCapacity = minCapacity; } elementData = Arrays.copyOf(elementData, newCapacity); } }
1 2 3 4 |
|
java
public class Stack