Java基础

1. ==equals()的区别

  • ==比较两个对象的引用是否指向同一个内存地址(基本数据类型比较值)
  • equals()是Object类的方法,默认实现与==相同,但通常被重写用于比较对象的内容

2. StringStringBuilderStringBuffer的区别

  • String:不可变字符序列,线程安全
  • StringBuilder:可变字符序列,非线程安全,性能高
  • StringBuffer:可变字符序列,线程安全(方法加synchronized),性能稍低

3. final关键字的作用

  • final变量:常量,只能赋值一次
  • final方法:不能被子类重写
  • final类:不能被继承

4. 面向对象的三大特性

  • 封装:隐藏内部实现,提供公共访问方式
  • 继承:子类继承父类特征和行为
  • 多态:同一操作作用于不同对象,产生不同结果

5. 抽象类和接口的区别

特性 抽象类 接口
方法 可以有具体方法 Java8前只能是抽象方法
变量 无限制 默认public static final
实现 单继承 多实现
构造器 可以有 不能有
设计目的 代码复用 定义规范

6. 重载(Overload)和重写(Override)的区别

  • 重载:同一类中,方法名相同但参数不同(类型、数量、顺序)
  • 重写:子类中,方法名、参数列表与父类相同,覆盖父类实现

7. ArrayList和LinkedList的区别

特性 ArrayList LinkedList
底层 动态数组 双向链表
随机访问 O(1) O(n)
插入删除 O(n) O(1)
空间 预留空间 每个元素额外空间

8. HashMap的工作原理

  • 基于哈希表实现,使用数组+链表+红黑树(JDK8)
  • 通过key的hashCode计算数组下标
  • 解决哈希冲突:链表法,当链表长度>8时转为红黑树
  • 扩容机制:默认负载因子0.75,扩容为原容量2倍

9. 创建线程的几种方式

  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口(可返回结果)
  • 使用线程池(Executor框架)

10. volatile关键字的作用

  • 保证变量的可见性:一个线程修改后立即对其他线程可见
  • 禁止指令重排序:防止JVM优化导致执行顺序改变
  • 不保证原子性(如i++操作仍需同步)

JVM

1. Java内存区域划分

  • 程序计数器:线程私有,当前线程执行的字节码行号
  • 虚拟机栈:线程私有,存储栈帧(局部变量表、操作数栈等)
  • 本地方法栈:为Native方法服务
  • 堆:线程共享,存放对象实例
  • 方法区:线程共享,存储类信息、常量、静态变量等

2. 垃圾回收算法有哪些

  • 标记-清除:标记无用对象后清除,会产生内存碎片
  • 复制算法:将内存分为两块,存活对象复制到另一块
  • 标记-整理:标记后让存活对象向一端移动
  • 分代收集:新生代(复制算法)、老年代(标记-清除/整理)

3. 类加载过程

  1. 加载:获取类的二进制字节流
  2. 验证:确保Class文件符合规范
  3. 准备:为静态变量分配内存并设置默认值
  4. 解析:将符号引用转为直接引用
  5. 初始化:执行类构造器<clinit>()方法