Java测试题
1. 计算机网络传输层有哪些协议?分别适用于什么场景?
- TCP:传输控制协议
- 使用场景:网页浏览(HTTP/HTTPS),文件传输(FTP),电子邮件,远程终端访问(SSH),数据库操作
- UDP:用户数据报协议
- 使用场景:音视频流媒体(直播,视频会议),实时在线游戏,DNS查询,网络电话,简单文件传输协议(TFTP)
2. 多线程的使用场景有哪些?线程开启多少个合适?判断标准有哪些?
- 使用场景:
- 利用多核CPU资源:数据分析,视频/图片编码解码,搜索引擎索引
- 提供响应性/吞吐量(I/O密集型):Web服务器,图形用户界面应用程序,数据库连接池
- 模拟并发行为:游戏开发,聊天软件
- 最佳线程数取决于任务类型和系统资源。核心原则是:尽可能保存CPU处于忙碌状态,同时避免过度的上下文切换和资源竞争。
- 判断标准:任务类型、系统资源、性能指标、上下文切换开销
3. 线程池的提交方式有哪几种?
- execute(Runnable command):提交一个Runnable任务,用于执行不需要返回结果的异步任务。
- submit(Callable<T> task)/submit(Runnable task,T result):提交一个Callable,可以在执行后返回一个结果;或提交一个Rannable任务,并指定一个预存的结果。
4. 锁的实现原理介绍一下?
5. TCP协议中拥塞控制的主要作用是什么?
- 防止网络因为数据过多而瘫痪,同时在所有用户直接公平地共享网络带宽资源。
- 简单来说就是,解决“拥塞崩溃”问题。
6. String类的常用函数有哪些?列举十种。
- equals()判断是否相等、
- replace()替换、
- split()拆分、
- time()取出首位空白、
- length()获取长度、
- append()追加、
- charAt()获取指定位置字符、
- indexOf()获取字符位置、
- toLowCase()/toUpperCase()大小写转换、
- lastundexOd()从后往前查找、
- substring()截取子串、
- concat()连接字符串、
- isEmpty()是否空字符串、
- startsWith()/endWith()是否以字符开头/结尾、
- repeat()重复字符串
7. String和StringBuffer,StringBuilder的区别有哪些?所有类名包含Buffer的类的内部实现原理是什么?有什么优势?
- 区别:String是不可变字符,线程安全;StringBuffer和StringBuilder是可变字符基于,但StringBuffer线程安全,可用于多线程,而StringBuilder线程不安全,用于单线程。
- 基于缓存机制的设计思想。
- 实现原理:使用一个内置的缓冲区(通常是数组)来批量处理数据,减少底层资源的直接交互次数。
- 优势:减少系统调用,I/O操作次数,降低开销,提高响应速度。
8. String字符串的不可变是指哪里不可变?
- String对象一旦被创建,其内容就无法被改变。
9. HTTP协议有哪些字段,列举3个就可以。
- host:指定请求访问的服务器的域名和端口号
- user-agent:发起请求的客户端设备信息
- content-type:展示主体中的数据格式
10. Java异常类有哪些?分别管理什么异常?
- error(错误):程序无法处理的错误
- exception(异常):运行时异常,非运行时异常
11. Java反射获取类信息的方式有哪几种?分别是什么?
- 硬盘阶段:Class.forName("类全名") 例如:Class class = Class.forName("com.qcby.demo.Person");
- 类阶段:类名.class() 例如:Class class = Person.class;
- 对象阶段:对象名.getClass() 例如:Person person = new Person(); Class class = person.getClass();
12. Java代理的主要方法有哪几种?列举代理的使用场景2个。
- 静态代理
- 动态代理:JDK动态代理(基于接口)、Cglib动态代理(基于子类)
- 使用场景:Spring AOP、虚拟代理、保护代理、缓存代理、单元测试
13. equals()方法的作用是什么?重写equals需要注意哪些事项?为什么?
- 作用:判断两个对象是否相等
- 重写注意事项:
- 重写equals需要遵守五大契约:自反、对称、传递、一致、非空性。否则,依赖对象相等性的类会出现无法预测的混乱行为。
- 必须同时重写hashCode()方法,因为规定:如果两个对象equals()为true,它们的哈希码必须相等,否则它们无法在哈希集合中正常工作。
14. Java是按值传递还是按引用传递?什么是引用传递,什么是值传递,哪些语言支持引用传递?
- Java严格是按值传递
- 引用传递:是指将实际参数的内存地址传入函数,通过这个地址修改数据,会影响原始数据。
- 值传递:是指将实际参数值的副本传入函数,修改副本不会影响原始数据。
- 支持引用传递的语言:C++、C#、PHP
- 支持值传递的语言:Java、js、python
15. 描述java的类初始化顺序?如果存在继承,初始化顺序会如何?
- 先静态后实例,最后构造器;同类成员按顺序:静态属性=静态代码块(看书写顺序)>属性=构造代码块(看书写顺序)>构造方法
- 先父类后子类:父类静态>子类静态>父类非静态>父类构造方法>子类非静态>子类构造方法
16. 本地方法栈有什么作用?
- 是为了Java程序调用的本地方法提供内存空间,用于执行本地方法所需的栈操作。
17. 描述Java的双亲委派机制,为什么要用到双亲委派机制?
- 双亲委派机制:是指Java类加载器用来加载类的一种工作机制,它规定了类加载请求应该如何传递。
- 双亲委派机制是一种优雅的类加载协调方案。它通过“先父后子”的层级委托,确保了Java核心类库的绝对安全、避免了类的重复加载、保证基础类的正确行为,并维护了Java运行时环境的稳定性和一致性。它是Java生态体系稳固的基石之一。
18. 重写和重载的区别是什么?
- 重写:子类继承父类,子类重写父类的方法,方法名、参数列表都必须相同。
- 重载:在同一个类中,方法名相同,但参数列表不同。
19. 子类构造方法调用父类构造方法的注意事项有哪些?
- 隐式调用:默认调用父类无参构造;super();
- 显示调用:在子类构造方法中的第一行使用super(参数列表)
- this和super不能同时出现
20. 子类实例初始化是否触发发父类实例初始化?
- 触发
21. instanceof关键字的作用是什么?
- instanceof关键字是一个运行时类型检测运算符。
- 作用:
- 确保向下转型的安全性,防止ClassCastException
- 根据对象的实际类型执行不同的分支逻辑
- 结合模式匹配,使类型检查和转换代码更加简洁明了
22. 基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
- 可能会,取决于转换的方向和类型的大小。
- 注意:类型安全,向上转型-子类转父类,自动,安全;向下转型-父类转子类,显式,可能会抛出异常;必须使用instanceof检查安全。
23. 重入锁有哪些?为什么要有重入锁?
- 重入锁的含义:是指同一个线程可以多次进入由同一个锁保护的代码块。
- 重入锁有那些:
- synchronized关键字(内置锁/隐式锁)public synchronized void outer() {}
- java.util.concurrent.locks.ReentrantLock(显示锁)lock.lock(); // 获取锁
- 为什么?是为了防止线程“自己把自己锁死”。
24. 指令重排序的优点是什么?由什么原因导致的?
- 优先:极大地提升程序执行性能(核心优点)
- 充分利用CPU流水线
- 提高缓存命中率
- 更高效地利用多核资源
- 原因:编译器优化、处理器乱执行、内存系统缓存
25. Arrays.sort()的内部原理介绍一下?
- 根据排序地数据类型和大小,自动选择最高效的排序算法。
26. 堆排序的时间复杂度是多少,空间复杂度是多少?
- 时间复杂度:O(n log n)
- 空间复杂度:O(1)
27. 字符串“asdasjkfkasgfgshaahsfaf”经过哈夫曼编码之后存储比特数是多少?
- 62比特
- 过程:
- 统计字符频率:a出现6次,s 5次,f 4次,g 2次,h 2次,j 1次,k 2次,d 1次
- 构建哈夫曼树:按频率从效到大叶子节点,合并:
- 初始:d(1), j(1), g(2), h(2), k(2), f(4), s(5), a(6)
- 步骤1:合并 d(1) + j(1) → 节点(2) 节点列表:g(2), h(2), k(2), 节点(2), f(4), s(5), a(6)
- 步骤2:合并 g(2) + h(2) → 节点(4) 节点列表:k(2), 节点(2), 节点(4), f(4), s(5), a(6)
- 步骤3:合并 k(2) + 节点(2) → 节点(4) 节点列表:节点(4), 节点(4), f(4), s(5), a(6)
- 步骤4:合并 节点(4) + 节点(4) → 节点(8) 节点列表:f(4), s(5), a(6), 节点(8)
- 步骤5:合并 f(4) + s(5) → 节点(9) 节点列表:a(6), 节点(8), 节点(9)
- 步骤6:合并 a(6) + 节点(8) → 节点(14) 节点列表:节点(9), 节点(14)
- 步骤7:合并 节点(9) + 节点(14) → 根节点(23)
- 分配哈夫曼编码:a-10,s-01,f-00,k-110,g-1110,h-1111,d-11010,j-11011
- 计算总比特数:总比特数=Σ(频率 × 码长)
- a(6) × 2 + s(5) × 2 + f(4) × 2 + k(2) × 3 + g(2) × 4 + h(2) × 4 + d(1) × 5 + j(1) × 5 = 62
28. CPU高速缓存的优点和缺点有哪些?
- 优点:解决CPU与注解之间的速度鸿沟,提示系统性能
- 极高的速度
- 降低平均内存访问时间
- 减少CPU空闲等待,提高吞吐量
- 降低系统总线负载
- 缺点:成本高昂、容量有限、设置复杂、功耗和发热较大、引入步确定性,执行时间波动
29. 线程安全的类有哪些?列举2个以上就可以
- 安全的类:
- java.util.concurrent包下的类:ConcurrentHashMap、CopyOnWriteArrayList/CopyOnWriteArraySet
- java.util包中的包装类:Collections.synchronizedList(List list)、Collections.synchronizedMap(Map map)
- 不可变类:String、Integer、Long、Double等
30. 什么是LRU算法?
- LRU全程是Least Recently Used,它是一种非常典型的缓存淘汰策略。
- 核心思想:如果数据最近被访问过,那么它将来北方网的几率也更高。因此,当缓存空间已满时,我们应该优先淘汰那些最近最少被访问的数据。
31. 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
- Spring Bean容器:就是负责创建、配置、组装和管理Bean对象。
- 不同:
- Bean容器是一个广义概念,IOC容器是其具体实现。
- IOC容器实现了控制反转思想,是Bean容器的核心机制。
32. Spring IOC 如何理解?
- IOC,Inversion of Control,控制反转,将对象的创建权力反转给Spring框架。可以用来降低代码之间的耦合度。
33. Spring DI 如何理解?
- DI,Dependency Injection,依赖注入,是实现IOC的具体方式。在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件中。
34. Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
- 作用域:@Scope
- 延迟加载机制:@Lazy
35. Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
- 机制:反射机制和工厂模式
- 目的:防止资源耗尽,保证数据完整性
- 内存泄漏:是指程序中已分配的内存由于某种原因未被释放,导致系统可用内存逐渐减少,最终可能导致程序崩溃。
36. 描述Spring MVC处理流程及应用优势?
- 处理流程:
- 用户发起请求,web容器接受,匹配到前端控制器DispatcherServlet
- DispatcherServlet请求HandlerMapping,HandlerMapping根据请求的URL,找到对应的Controller和Interceptor并将它们封装成一个HandlerExecutionChain返回
- DispatcherServlet调用HandlerAdapter执行Controller
- DispatcherServlet请求ViewResolver解析视图
- DispatcherServlet将模型数据交给View进行渲染
- DispatcherServlet向用户返回响应
- 应用优势:职责分离清晰、高度可配置和可扩展、注解驱动开发,简洁高效、无缝集成Spring、强大的拦截器机制
37. Spring中的事务处理方式及优缺点?
- 编程式事务:手动控制事务边界,灵活性高;但代码耦合度高。
- 声明式事务:通过配置XML或注解自动管理事务,事务管理和业务代码解耦,简洁;但粒度较粗,通常只能用在方法级别进行控制。
38. MyBatis应用中#与$有什么异同点?
- #:预编译参数占位符,防止SQL注入,安全。
- $:字符串拼接符,直接替换,存在SQL注入风险。
- 同:都用于参数替换。
- 异:#安全,$性能略高但风险大
39. MyBatis应用动态SQL解决了什么问题?
- 解决了SQL语句拼接复杂、条件判断繁琐的问题,使SQL更灵活、可维护性更强,支持<if>、<choose>、<foreach>等标签。
40. shiro框架权限管理时的认证和授权流程描述?
- 认证:用户提交身份信息 → SecurityManager → Realm验证 → 登录成功/失败。
- 授权:用户访问资源 → SecurityManager → Realm获取权限 → 判断是否授权。
41. BeanFactory和ApplicationContext有什么区别?
- BeanFactory:基础IOC容器,延迟加载,功能简单。
- ApplicationContext:高级IOC容器,默认立即加载,支持AOP、事务、国际化等。
42. 请解释Spring Bean的生命周期?
- 实例化Bean → 注入依赖 → Aware 接口回调 → 初始化前处理(BeanPostProcessor) → 调用初始化方法(如@PostConstruct)→ 初始化后处理 → Bean就绪 → 销毁前处理 → 调用销毁方法(如@PreDestroy)
43. Spring Bean的作用域之间有什么区别?
- singleton:单例,默认作用域。
- prototype:每次请求创建新实例。
- request:每次HTTP请求创建一个实例(Web环境)。
- session:每个Session一个实例(Web环境)。
44. 使用Spring框架的好处是什么?·
- 方便解耦,简化开发
- 支持AOP
- 通过注解,方便程序测试
- 方便集成各种优秀框架
- 降低Java EEAPI的使用难度
45. Spring 中用到了那些设计模式?
- 工厂模式
- 单例模式
- 代理模式
- 模板模式
- 观察者模式
- 适配器模式
- 策略模式
- 装饰品模式
46. Spring 如何保证 Controller 并发的安全?
- Spring Controller默认是单例的,通过避免使用实例变量或使用线程安全的数据结构(如ThreadLocal)来保证并发安全。
47. 使用Spring框架的好处是什么?
- 方便解耦,简化开发
- 支持AOP
- 通过注解,方便程序测试
- 方便集成各种优秀框架
- 降低Java EEAPI的使用难度
48. 在 Spring中如何注入一个java集合?
- 注入固定值集合:@Value/@Bean
- 注入固定的复杂对象集合:@Bean
- 收集所有同类型接口的实现类:@Autowired
49. Spring支持的事务管理类型?
- 编程式事务管理
- 声明式事务管理(推荐)
50. Spring框架的事务管理有哪些优点?
- 一致的事务抽象层
- 声明式事务管理
- 灵活性高
- 与Spring生态无缝集成
- 同时支持编程式和声明式事务
- 易于测试
51. Spring MVC的主要组件?
- 前端控制器(DispatcherServlet)
- 处理器映射器(HandlerMapping)
- 处理器(Handler)
- 处理器适配器(HandlAdapter)
- 视图解析器(View Resolver)
- 视图(View)
52. SpringMvc怎么和AJAX相互调用的?
- SpringMVC返回数据给Ajax(后端→前端):使用@ResponseBody和@ResController注解
- SpringMVC接受Ajax发送的数据(前端→后端):使用@RequestBody注解
53. Mybatis 中#和$的区别?
- #:预编译参数占位符,防止SQL注入,安全。
- $:字符串拼接符,直接替换,存在SQL注入风险。
- 同:都用于参数替换。
- 异:#安全,$性能略高但风险大
54. Mybatis 的缓存机制,一级,二级介绍一下?
- 一级:SqlSession级别;与SqlSession共存;默认开启状态;同一个SqlSession内共享。
- 二级:Mapper级别;与整个应用同步,可跨SqlSession;需要手动配置开启;与所有SqlSession共享。
55. SpringMVC与Struts2的区别?
- SpringMVC:基于方法的框架;拦截器机制灵活、解耦;性能更高;与Spring无缝集成。
- Struts2:基于类的框架;拦截器强大、重量;性能较低;需要额外配置进行集成;重度依赖OGNL。
56. Mybatis 的基本工作流程?
- 读取配置文件→ 创建SqlSession对象 → 获取Mapper接口的代理对象 → 执行SQL → 提交事务 → 关闭SqlSession
57. 什么是MyBatis的接口绑定,有什么好处?
- 接口绑定:是指通过接口定义SQL映射,无需实现类。
- 好处:简化开发、提高可维护性、支持动态代理。
58. MyBatis的编程步骤?
- 添加依赖
- 创建核心配置文件:mybatis-config.xml
- 创建实体类
- 创建Mapper接口
- 创建Mapper XML映射文件
- 编写Java代码执行数据库操作
59. JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
- JDBC不足:SQL硬编码、代码冗余、手动映射
- 解决:MyBatis使用连接池、模板化封装、提供自动映射、SQL分离、缓存机制、动态SQL等解决方案。
60. MyBatis的优缺点?
- 优点:SQL灵活、学习成本低、与Spring集成好
- 缺点:SQL需手动编写、数据库迁移成本高
