Java面试-01-Java核心基础

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类常用方法

  1. clone():创建并返回对象副本
  2. equals(Object):判断对象是否相等
  3. finalize():对象回收前调用
  4. getClass():返回对象运行时类
  5. hashCode():返回对象哈希码
  6. toString():返回对象字符串表示
  7. notify()/notifyAll():唤醒等待线程

13. 线程状态/生命周期

  1. 新建状态(New):创建线程对象,未启动
  2. 就绪状态(Runnable) :调用start(),等待CPU调度
  3. 运行状态(Running) :获取CPU,执行run()方法
  4. 阻塞状态(Blocked)
    • 等待阻塞:wait()
    • 同步阻塞:等待synchronized锁
    • 其他阻塞:sleep()join()、IO等待
  5. 死亡状态(Dead):执行完毕或异常退出

14. Java IO流

两大分类

  1. 字节流 :操作二进制数据,万能流
    • 输入:InputStream
    • 输出:OutputStream
  2. 字符流 :操作文本数据
    • 输入: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

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三次握手(建立连接)

  1. 客户端发送SYN → 服务端,请求连接
  2. 服务端返回SYN+ACK → 客户端,同意连接
  3. 客户端发送ACK → 服务端,连接建立

TCP四次挥手(断开连接)

  1. 客户端发送FIN → 服务端,请求断开
  2. 服务端返回ACK → 客户端,收到请求
  3. 服务端发送FIN → 客户端,准备就绪
  4. 客户端返回ACK → 服务端,断开完成

22. 浏览器输入URL到页面展示全过程

  1. 浏览器输入URL
  2. DNS解析:域名 → IP地址
  3. 客户端随机端口发起TCP三次握手
  4. 浏览器发送HTTP GET请求
  5. 服务器处理请求,返回HTTP响应
  6. 浏览器接收响应,渲染HTML页面
  7. 页面加载完成,展示内容