一、Java基础核心
1. 面向对象三大特性
1)封装
隐藏内部实现,只暴露接口,提高安全性。
2)继承
子类可以复用父类代码,提高代码复用性。
3)多态
父类引用指向子类对象,编译看左边,运行看右边。
2. 重载与重写
重载(Overload)
发生在同一个类中,方法名相同,参数不同。
重写(Override)
发生在父子类中,方法名、参数必须相同,返回值类型兼容,访问权限不能更严格。
3. String相关
String、StringBuilder、StringBuffer区别:
String
不可变对象,线程安全,性能较低。
StringBuilder
可变对象,线程不安全,性能高。
StringBuffer
可变对象,线程安全,性能中等。
为什么String不可变:
底层是final修饰的字符数组,保证了字符串的安全性和可复用性(字符串常量池)。
二、集合框架
1. List、Set、Map区别
List
有序,可以重复。
Set
无序,不可重复。
Map
键值对结构,key唯一。
2. HashMap底层原理
在JDK1.8中,HashMap结构为:
数组 + 链表 + 红黑树
执行流程:
1)根据key计算hash值
2)定位数组下标
3)发生哈希冲突时形成链表
4)链表长度达到8时转换为红黑树,提高查询效率
3. HashMap为什么线程不安全
多线程情况下可能出现:
1)数据覆盖
2)链表形成环(JDK1.7)
解决方案:
使用ConcurrentHashMap代替。
4. ArrayList与LinkedList
ArrayList
底层是数组,查询快,插入慢。
LinkedList
底层是双向链表,插入快,查询慢。
三、并发编程
1. 线程创建方式
1)继承Thread类
2)实现Runnable接口(推荐)
3)实现Callable接口(支持返回值)
2. synchronized与Lock
synchronized
使用简单,自动释放锁。
Lock(如ReentrantLock)
更灵活,可以手动加锁和释放锁,支持公平锁。
3. 线程池核心参数
线程池核心类是ThreadPoolExecutor,主要参数:
corePoolSize
核心线程数
maximumPoolSize
最大线程数
workQueue
任务队列
keepAliveTime
线程空闲时间
handler
拒绝策略
4. 线程池执行流程
1)线程数小于核心线程数,直接创建线程执行任务
2)否则进入阻塞队列
3)队列满了且线程数未达到最大值,创建新线程
4)超过最大线程数,执行拒绝策略
四、JVM
1. JVM内存结构
主要包括:
1)程序计数器
2)虚拟机栈
3)本地方法栈
4)堆
5)方法区
2. 堆与栈的区别
栈
存储方法调用和局部变量,线程私有。
堆
存储对象实例,线程共享。
3. 垃圾回收机制
常见算法:
1)标记清除
2)复制算法
3)标记整理
常见垃圾收集器:
1)Serial
2)Parallel
3)CMS
4)G1
五、Spring相关
1. Spring核心
IOC(控制反转)
对象由容器管理,而不是手动创建。
AOP(面向切面编程)
在不修改代码的情况下增强功能,如日志、事务。
2. Spring事务
事务四大特性:
1)原子性
2)一致性
3)隔离性
4)持久性
常见隔离级别:
1)读未提交
2)读已提交
3)可重复读
4)串行化
3. SpringMVC执行流程
1)客户端发送请求
2)DispatcherServlet接收请求
3)HandlerMapping匹配处理器
4)HandlerAdapter执行方法
5)返回ModelAndView
6)视图解析并返回结果
六、MyBatis
1. MyBatis工作流程
1)读取配置文件
2)创建SqlSessionFactory
3)获取SqlSession
4)执行SQL
5)返回结果
2. MyBatis与Hibernate区别
MyBatis
需要手写SQL,灵活性高。
Hibernate
自动生成SQL,开发效率高,但灵活性较低。
七、计算机网络
1. HTTP与HTTPS
HTTP
明文传输,不安全。
HTTPS
基于SSL加密,安全性高。
2. TCP三次握手
1)客户端发送SYN
2)服务端返回SYN + ACK
3)客户端发送ACK
建立连接完成。
3. 四次挥手
1)客户端发送FIN
2)服务端ACK
3)服务端发送FIN
4)客户端ACK
连接关闭。
八、总结
Java面试核心考察内容主要包括:
1)基础语法与面向对象
2)集合框架(尤其是HashMap)
3)并发编程与线程池
4)JVM内存与垃圾回收
5)Spring与MyBatis框架
6)计算机网络基础