1.抽象类与接口区别
语法:
- 抽象类用abstract定义;接口用interface定义
- 抽象类被子类继承extends(不可用final修饰);接口被类实现implements
- 抽象类的属性访问无限制,方法不可用private修饰;接口中的方法只能用public修饰,变量用public static final
语义:
是什么用抽象类(名词),能做什么用接口(动词)
2.hashcode与equals使用
hashcode用于获取对象的唯一的散列码(整数int)
equals用于比较对象的地址
hashmap是一对一对由key-value组成的数据,hashmap底层是哈希表结构(数组+链表/红黑树),若单一链表的长度大于8个,数组长度大于64个则自动将链表转换为红黑树存储;反之会将红黑树转换为链表存储;
Entry[]数组,Entry对象由hashcode、key、value、下一节点指针组成
put(key,value)原理
- key,value封装为node节点
- 根据key值生成hashcode
- 根据哈希算法算出hashcode在数组中的存放位置(下标),若下标没有数据,则直接将该node节点放在该位置;若下标有链表,则对key与链表的key节点进行比较,若与链表的key都不同,则将该节点放在链表末尾;否则数据value覆盖
get(key)原理
- 根据key值生成hashcode
- 根据哈希算法计算出数组的下标,定位到数组位置,若下标没有数据,则返回null;若下标有链表,则拿着key与链表的key节点一一比较,若与链表的key都不同,则返回null;若与链表的某一节点的key值相同,则返回其value值
哈希表结构如图所示:
3.Java代理方式
动态代理分为 jdk代理和cglib代理,详情可见 jdk代理 及 cglib代理
jdk代理
代理对象通过实现目标类接口利用反射机制来获取其对应的所有方法,并通过invocationHandler的invoke方法进行调用原生方法及方法增强
cglib代理
代理对象通过继承目标类重写其方法,并通过methodInterceptor的intercept方法进行调用原生方法及方法增强
4.==与equals区别
equals是方法,==是运算符,都是判断是否相等
==:比较的对象若是基本数据类型,则判断数值;若是引用数据类型,则判断对象的地址
equals():判断两个对象的内容是否相等,不可用于基本数据类型变量的比较
5.异常处理机制
异常有抛出异常 throw(方法内部,抛出异常对象)、throws(方法声明);捕获异常try-catch-finally
常见异常
编译异常:ClassNotFoundException、SQLException、IOException
运行异常:NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException
系统错误:OutOfMerroyError
6. 重载与重写
重载与重写都体现了多态性,重载体现了编译多态性,重写是运行时多态性
重载发生在一个类中,只是参数不同
重写发生在父类与子类,只是内容不同