interface A {}
interface B {}
interface C extends A, B {}
类不支持多重继承,是为了避免菱形继承后,一个接口有多个实现,不能决定使用哪个实现。
2. Object的equals和hashcode方法
equals为true时,hashcode必定相等
hashcode相等,equals不一定为true
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
3. 通过反射获取对象属性的值
String value = (String) new PropertyDescriptor(field.getName(), targetObj.getClass())
.getReadMethod().invoke(targetObj);
4. Protected方法/成员 跨包继承
When a protected member is inherited across package it becomes private member of inherited class.
When a protected member is inherited within the same package it becomes default member of inherited class.
如果要访问protected的方法,必须override成public的方法。
5. HashMap的key,value均可为null。Hashtable的key,value均不可为null。
HashSet的顺序不能保证指不能保证load的顺序,一般遍历的顺序与插入的顺序不一致。
新建一个HashSet后,无论遍历几次,遍历的顺序都一样。因为Hashset的遍历顺序是根据存在hashtable中的hashcode来遍历的。
对String这种hashcode生成有规律的,甚至可以预估HashSet遍历的顺序。
6. ArrayList默认初始化容量为10,默认扩容为原来的1.5倍。
Vector默认初始化容量为10,默认扩容为原来的2倍。Vector还有一个域capacityIncrement,如果大于0,每次增长capacityIncrement,如果小于等于0,增长为原来的2倍。
AbstractList中有一个域modCount,用来记录List被结构性更改的次数,用于fail-fast遍历。如果expectedModCount和modCount不等,会抛出ConcurrentModificationException。当ensureCapacityInternal被调用,List size被更改是,modCount会加1。即使是list.addAll(new ArrayList());,modCount也会加1。
The number of times this list has been structurally modified. Structural modifications are those that change the size of the list, or otherwise perturb it in such a fashion that iterations in progress may yield incorrect results.
7. HashMap默认初始化容量为16。
Hashtable默认初始化容量为11。
8. HashMap添加Entry时:
(1) int hash = hash(key); // 根据key生成hashcode
(2) int i = indexFor(hash, table.length); // 根据key的hashcode和hashtable的长度,生成hashtable的index
(2.1) static int indexFor(int h, int length) { return h & (length-1); } // 这就是为什么HashMap的size一定要是2的幂次的原因
9. 创建线程的4种方式:
(1) class MyThread extends Thread, new MyThread()
(2) class MyRunnable extends Runnable, new Thread(new MyRunnable())
(3) new Thread(new Runnable() {public void run() {//blabla}})
(4) new Thread() {public void run() {//blabla}}