当前位置: 首页 > news >正文

Java测试题(上)

1. 传输层协议及使用场景
  • TCP:面向连接、可靠传输、保证数据顺序与完整性,适用于对数据准确性要求高的场景,如文件传输、Web请求(HTTP/HTTPS)。

  • UDP:无连接、低延迟、不保证顺序与可靠性,适用于实时性要求高、可容忍少量丢包的场景,如实时音视频、DNS查询、游戏数据同步。


2. 多线程使用场景与线程数估算
  • 使用场景

    • 高并发请求处理

    • 定时任务与异步任务处理

    • 计算密集型任务的并行计算

    • IO密集型任务的重叠执行

    • 生产者-消费者模型

  • 线程数估算

    • CPU密集型任务:线程数 = CPU核心数 + 1

    • IO密集型任务:线程数 = CPU核心数 × (1 + 平均IO等待时间 / CPU计算时间)

  • 判断标准

    • CPU利用率低于50%时,可适当增加线程数

    • CPU利用率高于90%时,应减少线程数或优化代码

    • 任务队列持续积压导致延迟上升时,需扩容线程池

    • 线程数不得超过操作系统限制(如Linux默认每进程1024线程)


3. 线程池的提交方式
方法返回值说明
execute(Runnable command)void提交Runnable任务,无返回值
submit(Callable<T> task)Future<T>提交Callable任务,返回Future对象
submit(Runnable task)Future<?>提交Runnable任务,返回Future对象
submit(Runnable task, T result)Future<T>提交Runnable任务并指定返回结果

4. 锁的实现原理
  • 硬件层面:通过CPU原子指令(如CAS、LL/SC)保证操作的原子性。

  • 操作系统层面:利用互斥量(mutex)或自旋锁(spinlock)实现线程的阻塞与唤醒。

  • JVM层面

    • synchronized基于对象头的Mark Word和Monitor实现

    • ReentrantLock基于AQS(AbstractQueuedSynchronizer)队列管理线程竞争

  • 锁升级机制:偏向锁 → 轻量级锁 → 重量级锁,逐级升级以优化性能

  • 优化策略:锁消除、锁粗化、读写分离

  • 分布式锁:Redis、ZooKeeper实现跨进程锁,需解决一致性问题


5. TCP拥塞控制的主要作用

通过慢开始、拥塞避免、快重传、快恢复等算法,防止网络中数据量过大导致网络拥塞崩溃,动态调整发送窗口大小,保证网络稳定性与传输效率。


6. String常用函数(列举10个)
  • charAt(int index)

  • contains(CharSequence s)

  • endsWith(String suffix)

  • equals(String another)

  • length()

  • replace(char oldChar, char newChar)

  • substring(int beginIndex, int endIndex)

  • split(String regex)

  • valueOf(int i)

  • concat(String str)


7. String、StringBuffer与StringBuilder的区别
特性StringStringBufferStringBuilder
可变性不可变可变可变
线程安全安全(不可变天然安全)安全(方法同步)不安全
使用场景字符串常量、作为Map的key多线程环境下字符串拼接单线程环境下字符串拼接
  • 内部实现原理:三者底层均为char[],StringBuffer与StringBuilder在容量不足时进行动态扩容(默认扩容为原容量的2倍+2)。

  • 优势:StringBuffer与StringBuilder通过动态扩容减少频繁创建新对象的开销,提高效率。


8. String字符串的不可变具体指什么?
  • 内容不可变:字符串对象创建后,其内容(字符数组)不可修改。

  • 内存地址不可变:字符串对象在内存中的地址不可变,任何修改操作都会创建新的字符串对象。


9. HTTP协议常见字段(列举3个)
  • Content-Type:指定请求或响应的媒体类型,告诉服务器或客户端如何解析数据。

  • User-Agent:标识客户端软件信息,服务器可根据此字段返回适配内容。

  • Cookie:由服务器设置,客户端后续请求自动携带,用于维持会话状态。


10. Java异常体系
  • 受检异常(Checked Exception):编译器强制要求处理,如IOExceptionSQLException

  • 非受检异常(Unchecked Exception):运行时异常,编译器不强制处理,如NullPointerExceptionArrayIndexOutOfBoundsException

  • 错误(Error):严重系统级问题,程序通常无法恢复,如OutOfMemoryErrorStackOverflowError


11. Java反射获取类信息的三种方式
  • Class.forName("全限定类名")

  • 类名.class

  • 对象.getClass()


12. Java代理方式及使用场景
  • 静态代理:代理类在编译期确定,手动编写代理类。

  • 动态代理:运行时动态生成代理类,如JDK动态代理、CGLIB代理。

  • 使用场景

    • AOP(面向切面编程):日志、事务、权限控制

    • RPC(远程过程调用):客户端代理远程服务接口


13. equals()方法的作用及重写注意事项
  • 作用:默认实现比较两个对象的引用是否指向同一内存地址,重写后通常用于比较对象的内容是否相等。

  • 重写注意事项

    • 必须同时重写hashCode()方法,保证相等的对象具有相同的哈希码

    • 满足自反性、对称性、传递性、一致性

    • 重写后需确保equals()hashCode()逻辑一致,避免在哈希集合中出现逻辑错误


14. Java参数传递方式
  • Java采用值传递

    • 基本类型:传递值的副本,修改副本不影响原值

    • 引用类型:传递引用的副本(指向对象的地址),修改副本指向的对象内容会影响原对象,但修改副本本身(指向新对象)不影响原引用

  • 引用传递:方法调用时传递的是变量的原始引用(别名),修改参数直接影响原变量(Java不支持)

  • 支持引用传递的语言:C++(通过引用符号&)、C#(通过ref/out关键字)


15. Java类初始化顺序(含继承)
  • 单个类初始化顺序

    1. 静态变量和静态代码块(按书写顺序)

    2. 实例变量和实例代码块(按书写顺序)

    3. 构造器

  • 存在继承时的初始化顺序

    1. 父类静态变量和静态代码块

    2. 子类静态变量和静态代码块

    3. 父类实例变量和实例代码块

    4. 父类构造器

    5. 子类实例变量和实例代码块

    6. 子类构造器


16. 本地方法栈的作用

用于支持native方法的执行,保存native方法的局部变量、参数、返回值,并管理native方法的调用过程。


17. Java双亲委派机制
  • 机制描述

    1. 类加载器收到加载请求时,先不自行加载,而是委托给父加载器

    2. 父加载器检查是否已加载该类,若已加载则直接返回

    3. 若未加载,继续向上委托,直到顶层启动类加载器

    4. 若顶层加载器无法加载,子加载器才尝试自行加载

  • 目的:避免类的重复加载,保证核心类库的安全性(防止核心类被篡改)


18. 重写与重载的区别

表格

复制

区别维度重写(Override)重载(Overload)
发生范围子类与父类之间同一个类内部
方法签名方法名、参数列表相同方法名相同,参数列表不同
返回类型可协变可不同
访问权限不能严于父类无限制

19. 子类构造方法调用父类构造方法的注意事项
  • 子类构造方法中调用父类构造方法时,必须位于第一行,使用super()super(参数)显式调用

  • 若未显式调用,编译器默认调用父类无参构造器;若父类没有无参构造器,编译报错


20. 子类实例初始化是否会触发父类实例初始化?

会。子类实例化前,必须先完成父类的实例初始化(包括实例变量、实例代码块、构造器)。


21. instanceof关键字的作用

用于判断对象是否为指定类或其子类的实例,或是否实现了指定接口,返回boolean值。


22. 强制类型转换注意事项
  • 基本类型强制转换

    • 大范围类型转小范围类型(如double转int)可能丢失精度或溢出

  • 引用类型强制转换

    • 只能将父类引用转换为子类引用(向下转型),且实际对象必须是子类实例,否则抛出ClassCastException

    • 转换前建议使用instanceof进行类型检查


23. Java中的重入锁
  • 常见重入锁

    • synchronized关键字(隐式重入锁)

    • ReentrantLock类(显式重入锁)

  • 重入锁的意义:允许同一个线程多次获取同一把锁,避免嵌套同步代码块时发生死锁,提高代码灵活性和可读性


24. 指令重排序的优点与原因
  • 优点

    • 提高CPU指令并行度

    • 隐藏内存访问延迟

    • 优化缓存利用率

  • 原因

    • 编译器优化(指令重排)

    • CPU乱序执行(流水线技术)

    • 内存层级缓存延迟


25. Arrays.sort()内部原理
  • 基本类型数组:使用双轴快速排序(Dual-Pivot Quicksort)

  • 对象类型数组:使用TimSort(归并排序与插入排序的混合优化算法,稳定排序)


26. 堆排序复杂度
  • 时间复杂度:O(n log n)

  • 空间复杂度:O(1)(原地排序)


27. 字符串“asdasjkfkasgfgshaahsfaf”哈夫曼编码后的比特数

经过哈夫曼编码后,该字符串存储所需比特数为 56位


28. CPU高速缓存的优缺点
  • 优点

    • 访问延迟低(纳秒级)

    • 提高并发性能

    • 减少CPU空闲等待

    • 降低内存带宽压力

  • 缺点

    • 容量有限

    • 缓存一致性协议(如MESI)可能引入延迟

    • 缓存未命中时性能下降明显


29. Java线程安全类举例
  • StringBuffer:线程安全的可变字符串

  • ConcurrentHashMap:线程安全的哈希表

  • Vector:线程安全的动态数组(已过时,推荐使用ArrayList+同步包装类)


30. LRU算法描述

Least Recently Used(最近最少使用)缓存淘汰策略:

  • 新访问的数据移动到缓存头部

  • 重复访问的数据也移动到头部

  • 缓存满时淘汰尾部最久未使用的数据

30. Spring Bean 容器 vs. Spring IoC 容器

Q:二者到底有什么区别?

维度Spring Bean 容器Spring IoC 容器
本质运行时实体,真正干活的容器设计思想,一种理念
职责负责 Bean 的创建、依赖注入、生命周期管理(初始化、销毁、作用域等)定义“谁控制谁”——由框架而非程序员控制对象创建与依赖
举例ApplicationContextBeanFactory 的具体实现类“控制反转”思想本身
关系是 IoC 思想的具体实现是 Bean 容器背后的指导思想

IoC 通过反转控制权,降低组件之间的耦合度,提高可维护性与可测试性。


31. 如何理解 Spring IoC(控制反转)?

一句话定义
把“对象创建、依赖查找、生命周期管理”的掌控权从业务代码 反转 给 Spring 框架,开发者只关心业务逻辑,不关心对象如何实例化、如何装配。

三个关键点

  1. 谁控制谁:框架控制应用程序所需对象的生命周期。

  2. 为何反转:传统方式由程序主动 new 对象,IoC 改为由容器被动注入(DI)。

  3. 带来的好处

    • 降低耦合:业务类只依赖接口而非实现

    • 提高可测试性:便于 Mock 与单元测试

    • 统一配置:通过 XML、注解或 JavaConfig 集中管理

 

http://www.dtcms.com/a/298821.html

相关文章:

  • Effective C++ 条款02:尽量以 const, enum, inline 替换 #define
  • I/O 控制方式
  • docker部署的ragflow服务迁移 数据卷迁移
  • 内存优化:从堆分配到零拷贝的终极重构
  • Web前端:JavaScript 随机点名系统案例详解
  • 肺癌预测模型实战案例
  • C51:用DS1302时钟读取和设置时间
  • 静电释放检测误报率↓79%:陌讯多模态融合算法实战解析
  • 算法:数组part02: 209. 长度最小的子数组 + 59.螺旋矩阵II + 代码随想录补充58.区间和 + 44. 开发商购买土地
  • 2025年ASOC SCI2区TOP,无人机集群路径规划与任务分配的组合优化在多障碍战场环境中的应用,深度解析+性能实测
  • 汽车功能安全 -- TC3xx Error Pin监控机制
  • Post-Training on PAI (5): PAI-EasyDistill, PAI 自研大模型蒸馏框架
  • JAVA知识点(二):数据库
  • rk3588跑通速腾雷达RS16的ros点云读取
  • 装修进度管理系统功能对比:主流工具9选
  • Apipost:离线可用+AI全栈覆盖,国产API开发协作工具新标杆
  • HTTP响应状态码详解
  • 通过Deepseek找工作
  • java-方法的综合练习
  • 屏幕适配--像素篇
  • 100条常用SQL语句大全
  • Linux系统编程——进程
  • 两个MCU互联采集数据
  • kubesphere安装使用
  • 手写数组洗牌算法
  • Vue2 element cascader级联选择器懒加载编辑时回显数据
  • 【VLAs篇】06:从动作词元化视角谈VLA模型的综述
  • 异常(全)
  • which soffice soffice not found
  • Wordpress主题配置