在看jdk里的collection framework这部分,小结一下:
- if (numElements >= initialCapacity) {
- initialCapacity = numElements;
- initialCapacity |= (initialCapacity >>> 1);
- initialCapacity |= (initialCapacity >>> 2);
- initialCapacity |= (initialCapacity >>> 4);
- initialCapacity |= (initialCapacity >>> 8);
- initialCapacity |= (initialCapacity >>> 16);
- initialCapacity++;
- if (initialCapacity < 0) // Too many elements, must back off
- initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
- }
10,删除掉的对象一定要设置为null,让GC去做剩余的清理工作
11,对double和float,一定要调用Double.doubleToLongBits和Float.floatToIntBits来做处理
12,Arrays.java里的排序算法,当数组长度小于7,则用插入排序,否则用快速排序和归并排序
13, Collections.java里的排序,都是先把集合转为数组,然后对数组进行排序,最后将排序后的数组元素放回集合中
14, 一般设计锁的时候可以考虑用单独的锁对象,或者是当前类,或者是this对象
15,null转变为Null值对象
16,用反射来生成新数组 if (a.length < n) { a = (T[])java.lang.reflect.Array .newInstance(a.getClass().getComponentType(), n);
17,为了防止更改参数中的对象,一般参数都声明为final,然后在函数内部还可以用clone方法做一个拷贝,对拷贝进行操作。
18,HashMap的内部实现是一个桶数组,每个桶是一个Entry链表。调用get函数来获取一个元素时,首先对key的hash值进行hash运算,然后利用得到的hash值对桶数组进行索引,得到其所在的桶,然后从这个桶的首元素开始遍历比较
19,HashMap和Hashtable的区别就是,它不是线程安全的,而且允许null键和null值
20,HashSet的底层实现是一个HashMap