Java八股文
一、java基础篇
1.接口和抽象类的区别
- 相似点
- 接口和抽象类都不能被实例化
- 实现接口或者抽象类的子类都必须实现这些抽象方法
- 不同点
- 抽象类可以包含普通方法和代码块, 接口里只能包含抽象方法, 静态方法和默认方法
- 抽象类可以有构造方法, 而接口没有
- 抽象类中的成员变量可以是各种类型, 接口中的成员变量只能是public static final类型, 并且必须辅助
2.重载和重写的区别
- 重载发生在同一个类中, 方法名相同、参数列表、返回类型、权限修饰符可以不同.
- 重写发生在子类中, 方法名、参数列表、返回类型都相同, 权限修饰符要大于父类方法, 声明异常范围要小于父类方法, 但是final和private修饰的方法不可重写
3.==和equals的区别
- ==比较基本类型时, 比较的是值, ==比较引用类型时, 比较的是内存地址
- equals是Object类的方法, 本质上与==一样, 但是有些类重写了equals方法, 比如String的equals被重写后, 比较的是字符值, 另外重写了equals后, 也必须重写hashcode方法
4.异常处理机制
- 使用try catch finaly捕获异常, finaly中的代码一定会执行, 捕获异常后程序会继续执行
- 使用throws声明该方法可能会抛出的异常类型, 出现异常后, 程序终止
5.HashMap原理
HashMap在JDK1.8之后是基于数组+链表+红黑树来实现的, 特点是key不能重复, 可以为null, 线程不安全
一、HashMap存取原理
- 计算key的hash值, 然后进行二次hash, 根据二次hash结果找到对应的索引位置
- 如果这个位置有值, 先进去equals比较, 如果结果为true则取代这个元素, 如果结果为false, 就使用高低位平移法将节点插入链表
二、HashMap的扩容机制
当添加某个元素后,数组的总的添加元素数大于了 数组长度 * 0.75(默认,也可自己设定),数组长度扩容为两倍。(如开始创建HashMap集合后,数组长度为16,临界值为16 * 0.75 = 12,当加入元素后元素个数超过12,数组长度扩容为32,临界值变为24)