复习一些八股


HashMap

new之后并不会立即分配数组。第一次put时会初始化数组,其容量变为不小于指定容量的2的幂数。然后根据负载因子确定阈值。

因为容量始终是2的幂次方,所以扩容时,元素要么在原位置,要么在原位置+原长度的位置。

image-20220817211457265

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的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多个收集器线程并行完成的。

image-20220817224432083

Spring注入方法区别

当出现很多注入项的时候,构造器参数可能会变得臃肿,特别是当参数时可选的时候。Setter 方式注入可以让类在之后重新配置和重新注入。

构造器注入:依赖不为空,允许构造函数可以保证一些重要属性在Bean实例化时就设置好

异常

检查时异常(必须捕获或者抛出)、运行时异常、错误。