复习一些八股
HashMap
new之后并不会立即分配数组。第一次put时会初始化数组,其容量变为不小于指定容量的2的幂数。然后根据负载因子确定阈值。
因为容量始终是2的幂次方,所以扩容时,元素要么在原位置,要么在原位置+原长度的位置。

HashMap
使用链表法避免哈希冲突(相同hash值),当链表长度大于TREEIFY_THRESHOLD
(默认为8)时,将链表转换为红黑树。当小于等于UNTREEIFY_THRESHOLD
(默认为6)时,又会退化回链表以达到性能均衡。
ConcurrentHashMap
对于扩容时转移过的节点写操作协助扩容,读操作转而查找。
动态代理
public interface A {
public void sayHi();
}
public class B implements A {
@override
public void sayHi() {
System.out.println("Hi");
}
}
public class DynamicProxy implements InvocationHandler {
@override
public Object invoke(Object proxy,Method method,Object[] args) {
// proxy可以提供接连调用这类的操作。
this.before();
Object result = method.invoke(obj,args);
this.after();
return result;
}
private Object obj;
public DynamicProxy(Object obj) {
this.obj = obj;
}
public void before() {
}
public void after() {
}
}
public class Test {
public static void main(String[] args) {
A b = new B();
A proxy = (A)Proxy.newProxyInstance(Test.getClass().getClassLoader(),b.getClass().getInterface(),new DynamicProxy(b));
proxy.sayHi();
}
}
统计不同部门男女人数
SELECT
SUM(CASE WHEN sex='MALE' THEN 1 ELSE 0 END)MALE,
SUM(CASE WHEN sex='FEMALE' THEN 1 ELSE 0 END)FEMALE,
department
FROM t
GROUP BY department;
G1
G1的筛选回收是Stop The World的
。在筛选回收阶段首先会对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多个收集器线程并行完成的。

Spring注入方法区别
当出现很多注入项的时候,构造器参数可能会变得臃肿,特别是当参数时可选的时候。Setter 方式注入可以让类在之后重新配置和重新注入。
构造器注入:依赖不为空,允许构造函数可以保证一些重要属性在Bean实例化时就设置好
异常
检查时异常(必须捕获或者抛出)、运行时异常、错误。