Java核心基础+网络+IO面试题(完整版)
目录
- [1. 重载与重写](#1. 重载与重写)
- [2. 接口与抽象类](#2. 接口与抽象类)
- [3. 权限修饰符](#3. 权限修饰符)
- [4. 深拷贝与浅拷贝](#4. 深拷贝与浅拷贝)
- [5. 强软弱虚引用](#5. 强软弱虚引用)
- [6. super和this](#6. super和this)
- [7. sleep和wait](#7. sleep和wait)
- [8. 自动拆装箱与int/Integer](#8. 自动拆装箱与int/Integer)
- [9. ==和equals区别](#9. ==和equals区别)
- [10. String相关](#10. String相关)
- [11. final、finally、finalize](#11. final、finally、finalize)
- [12. Object类常用方法](#12. Object类常用方法)
- [13. 线程状态/生命周期](#13. 线程状态/生命周期)
- [14. Java IO流](#14. Java IO流)
- [15. BIO、NIO、AIO](#15. BIO、NIO、AIO)
- [16. Java反射](#16. Java反射)
- [17. GET和POST](#17. GET和POST)
- [18. Cookie和Session](#18. Cookie和Session)
- [19. HTTP和HTTPS](#19. HTTP和HTTPS)
- [20. HTTP1.0和HTTP1.1](#20. HTTP1.0和HTTP1.1)
- [21. TCP和UDP](#21. TCP和UDP)
- [22. 浏览器输入URL到页面展示全过程](#22. 浏览器输入URL到页面展示全过程)
1. 重载与重写
| 对比项 | 重载(Overload) | 重写(Override) |
|---|---|---|
| 发生位置 | 本类内部 | 父类与子类之间 |
| 方法名 | 必须相同 | 必须相同 |
| 返回值 | 无要求 | 必须相同 |
| 参数列表 | 必须不同(个数/类型/顺序) | 必须完全相同 |
| 访问权限 | 无限制 | 不能低于父类被重写方法的权限 |
| 特殊说明 | 构造方法可以重载 | 构造方法不能被重写 |
2. 接口与抽象类
| 对比维度 | 抽象类(abstract class) | 接口(interface) |
|---|---|---|
| 使用方式 | 被子类继承(extends) | 被类实现(implements) |
| 继承特性 | 类只能单继承抽象类 | 接口可以多继承接口 |
| 构造器 | 可以有构造方法 | 不能有构造方法 |
| 修饰符 | 抽象方法:public/protected/default | 方法默认:public |
| 成员变量 | 可以定义普通成员变量 | 只能声明常量(public static final) |
3. 权限修饰符
| 修饰符 | 访问范围 |
|---|---|
| public | 全局可用,任意位置 |
| protected | 同一个包内 + 不同包的子类 |
| default | 同一个包内可用 |
| private | 仅当前类内部可用 |
4. 深拷贝与浅拷贝
浅拷贝
- 仅拷贝对象的基本数据类型值
- 仅拷贝引用类型的地址,不复制引用指向的对象
- 拷贝后的对象与原对象共享引用类型属性
深拷贝
- 拷贝基本数据类型值
- 完整复制引用类型指向的对象,创建新实例
- 拷贝后的对象与原对象完全独立,互不影响
5. 强软弱虚引用
强引用
- 定义:最常用引用,
Object obj = new Object(); - 回收规则:只要强引用存在,永不回收,内存不足直接OOM
软引用(SoftReference)
- 回收规则:内存充足不回收,内存不足时回收
- 应用场景:内存敏感型缓存(避免OOM)
弱引用(WeakReference)
- 回收规则:GC一旦运行就回收,无视内存大小
- 应用场景:解决内存泄漏(ThreadLocal核心实现)
虚引用(PhantomReference)
- 必须配合**引用队列(ReferenceQueue)**使用
- 回收规则:随时可能被回收
- 应用场景:对象回收前资源清理(直接内存释放)
6. super和this
| 对比项 | this | super |
|---|---|---|
| 指代对象 | 当前类本身 | 父类对象 |
| 调用内容 | 本类构造方法、成员变量、成员方法 | 父类构造方法、成员变量、成员方法 |
| 构造调用 | 调用本类构造,必须放在第一行 | 调用父类构造,必须放在第一行 |
| 核心作用 | 区分同名成员变量,调用重载构造 | 访问父类隐藏成员,初始化父类 |
7. sleep和wait
| 对比项 | sleep() | wait() |
|---|---|---|
| 所属类 | Thread类 | Object类 |
| CPU资源 | 释放CPU | 释放CPU |
| 锁资源 | 不释放锁 | 释放锁 |
| 唤醒方式 | 时间到自动唤醒 | wait()需notify/notifyAll唤醒 |
| 使用环境 | 任意位置 | 必须在synchronized同步代码中 |
| 异常 | 运行时无强制异常 | 未加锁会抛IllegalMonitorStateException |
8. 自动拆装箱与int/Integer
定义
- 装箱:基本类型 → 包装类对象(int → Integer)
- 拆箱:包装类对象 → 基本类型(Integer → int)
作用
Java集合(List/Map)只能存储对象,自动装箱方便基本类型存入集合
Integer缓存机制
- 缓存范围:-128 ~ 127
- 范围内:直接复用缓存对象,
==比较为true - 范围外:创建新对象,
==比较为false,必须用equals()
9. ==和equals区别
==
- 基本数据类型:比较值是否相等
- 引用数据类型:比较内存地址是否相同
equals()
- 未重写:等价于
==,比较地址 - 重写后:比较对象内容/属性(String、Integer均已重写)
- 来源:Object类方法,默认实现为
==
10. String相关
String能否被继承
- 不能 ,String类被
final修饰,final类不可被继承 - 原因:保证安全性、防止被重写植入恶意代码、保证字符串不可变性
String a = "abc" 和 new String("abc") 区别
String a = "abc":先检查字符串常量池,存在则直接复用,不存在则创建并存入常量池new String("abc"):直接在堆内存创建新对象
常量池作用
- 缓存字符串,避免重复创建,节省内存空间
- 创建字符串时JVM先检查常量池,存在则复用
- 可通过
intern()方法将堆字符串放入常量池
StringBuffer 和 StringBuilder
| 对比项 | StringBuffer | StringBuilder |
|---|---|---|
| 线程安全 | 安全(synchronized修饰) | 不安全 |
| 效率 | 较低 | 较高 |
| 适用场景 | 多线程环境 | 单线程环境 |
为什么需要StringBuilder
- String是不可变对象,每次修改都会创建新对象,消耗内存
- StringBuilder是可变对象,直接在原对象修改,性能更高
11. final、finally、finalize
final(修饰符)
- 修饰类:类不能被继承
- 修饰变量:变量为常量,不可修改
- 修饰方法:方法不能被子类重写
finally(异常处理)
- 搭配
try...catch使用 - 代码块无论是否发生异常,一定执行
- 用于释放资源(IO、连接关闭)
finalize(对象回收)
- Object类中的方法
- 垃圾回收器销毁对象前调用
- 用于对象回收前的资源清理
12. Object类常用方法
clone():创建并返回对象副本equals(Object):判断对象是否相等finalize():对象回收前调用getClass():返回对象运行时类hashCode():返回对象哈希码toString():返回对象字符串表示notify()/notifyAll():唤醒等待线程
13. 线程状态/生命周期
- 新建状态(New):创建线程对象,未启动
- 就绪状态(Runnable) :调用
start(),等待CPU调度 - 运行状态(Running) :获取CPU,执行
run()方法 - 阻塞状态(Blocked)
- 等待阻塞:
wait() - 同步阻塞:等待synchronized锁
- 其他阻塞:
sleep()、join()、IO等待
- 等待阻塞:
- 死亡状态(Dead):执行完毕或异常退出
14. Java IO流
两大分类
- 字节流 :操作二进制数据,万能流
- 输入:
InputStream - 输出:
OutputStream
- 输入:
- 字符流 :操作文本数据
- 输入:
Reader - 输出:
Writer
- 输入:
15. BIO、NIO、AIO
BIO(阻塞式IO)
- 同步阻塞,一个连接对应一个线程
- 并发能力低,资源消耗大
NIO(非阻塞IO)
- 同步非阻塞,Selector多路复用
- 一个线程管理多个连接
- 核心组件:Buffer(缓冲区)、Channel(通道)、Selector
AIO(异步IO)
- 异步非阻塞,事件回调机制
- IO完成后自动触发回调,无需等待
- 适用于高并发、高吞吐场景
16. Java反射
反射定义
程序运行时,获取类的属性、方法、构造器,并调用任意对象的方法
Class.forName() vs ClassLoader.loadClass()
| 方法 | 区别 |
|---|---|
| Class.forName() | 加载类 + 执行静态代码块 |
| ClassLoader.loadClass() | 仅加载类,不执行静态代码块 |
| 适用场景 | JDBC驱动加载 |
17. GET和POST
| 对比项 | GET | POST |
|---|---|---|
| 作用 | 获取数据 | 提交数据 |
| 参数位置 | URL地址栏可见 | 请求体中传输 |
| 安全性 | 低(参数暴露) | 相对安全 |
| 数据长度 | 有限制(URL长度限制) | 理论无限制 |
| 缓存 | 会被浏览器缓存 | 默认不缓存 |
| 幂等性 | 幂等 | 非幂等 |
18. Cookie和Session
Cookie
- 存储在客户端浏览器
- 保存少量用户标识信息
- 每次请求自动携带对应Cookie
Session
- 存储在服务器端
- 保存用户会话完整信息
- 依赖Cookie传递SessionID
- 用户跳转页面,数据全程保留
19. HTTP和HTTPS
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 安全性 | 明文传输,不安全 | 加密传输,安全 |
| 证书 | 无 | 需要CA权威证书 |
| 协议 | 应用层协议 | HTTP + SSL/TLS加密层 |
20. HTTP1.0和HTTP1.1
| 对比项 | HTTP1.0 | HTTP1.1 |
|---|---|---|
| 连接方式 | 短连接,请求完断开 | 长连接,TCP连接复用 |
| 请求方式 | GET/POST/HEAD | 支持PUT/DELETE/OPTIONS等 |
| 性能 | 连接开销大 | 减少握手开销,性能更高 |
21. TCP和UDP
区别
| 对比项 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输(确认/重传) | 不可靠 |
| 传输方式 | 字节流 | 数据报文 |
| 适用场景 | 文件、邮件、网页 | 视频、语音、直播 |
TCP三次握手(建立连接)
- 客户端发送SYN → 服务端,请求连接
- 服务端返回SYN+ACK → 客户端,同意连接
- 客户端发送ACK → 服务端,连接建立
TCP四次挥手(断开连接)
- 客户端发送FIN → 服务端,请求断开
- 服务端返回ACK → 客户端,收到请求
- 服务端发送FIN → 客户端,准备就绪
- 客户端返回ACK → 服务端,断开完成
22. 浏览器输入URL到页面展示全过程
- 浏览器输入URL
- DNS解析:域名 → IP地址
- 客户端随机端口发起TCP三次握手
- 浏览器发送HTTP GET请求
- 服务器处理请求,返回HTTP响应
- 浏览器接收响应,渲染HTML页面
- 页面加载完成,展示内容