Java岗笔试示例题

📅 2026/7/2 17:56:29
Java岗笔试示例题
Java核心与并发编程选择题关于 Java 中的 String 类以下说法正确的是​A. String 是可变对象修改字符串内容不会创建新对象B. String s “abc” 和 String s new String(“abc”) 在内存中创建的对象数量相同C. String 类被 final 修饰不能被继承D. 推荐使用 String 拼接大量字符串性能最好答案C解析​String 是不可变对象A错“abc” 会先在字符串常量池创建对象而 new String(“abc”) 会在堆和常量池各创建一个或复用常量池对象数量不同B错拼接大量字符串应使用 StringBuilder 或 StringBufferD错。要掌握字符串的内存分配主要涉及两个区域字符串常量池和Java堆内存。使用new关键字JVM会强制在普通内存中创建一个新的String对象所以new String(“abc”)是创建了两个对象在多线程环境下以下哪个关键字可以保证变量的可见性和禁止指令重排序A staticB volatileC transientD synchronized答案B​​​​解析​​volatile 关键字的核心作用是保证共享变量的可见性并禁止 JVM 进行指令重排序但​​不保证原子性​​。synchronized 虽然也能保证可见性但它是通过锁机制实现的而 volatile 是轻量级的。使用synchronized保证线程同步关于 HashMap 的底层数据结构以下描述错误的是​​A. JDK 1.7 中底层是数组 链表B. JDK 1.8 中底层是数组 链表 红黑树C. 当链表长度超过 8 时链表一定会立即转换为红黑树D. HashMap 是非线程安全的​​答案C​​​​解析​​在 JDK 1.8 中链表转红黑树需要同时满足两个条件**链表长度大于等于 8 ​​且​​ 数组长度大于等于 64。**如果数组长度不足 64会优先进行数组扩容而不是转红黑树。Spring框架与JVM选择题在 Spring 框架中Transactional 注解默认的事务传播行为是​​A. REQUIREDB. REQUIRES_NEWC. NESTEDD. SUPPORTS​​答案A​​​​解析​​Spring 事务默认传播行为是 REQUIRED即如果当前存在事务则加入该事务如果当前没有事务则创建一个新事务。这是最常用也最符合大多数业务场景的传播机制。了解Spring 事务深入理解Spring事务了解数据库中事务是数据库操作的基本单元其四个特性ACID特性。Spring 事务的核心是声明式事务管理它通过 AOP面向切面编程实现开发者无需手动编写事务控制代码如begin、commit、rollback只需通过注解或 XML 配置即可完成事务管理。事务管理的两种方式编程式事务声明式事务通过Transactional注解或 XML 配置声明事务规则由 Spring 自动管理事务代码简洁是日常开发的首选方式。spring事务的核心属性传播行为默认为REQUIRED隔离级别基于数据库的隔离级别实现默认为DEFAULT以下哪种 GC 算法主要解决内存碎片问题​​A. 复制算法B. 标记 - 清除算法C. 标记 - 整理算法D. 分代收集算法​​答案C​​​​解析​​标记 - 清除算法会产生大量不连续的内存碎片复制算法主要用于新生代而标记 - 整理算法在标记并清除死亡对象后会将存活对象向一端移动从而解决内存碎片问题常用于老年代。数据库与SQL专项题在 SQL 中若要查询某表中某列值为 NULL 的记录以下写法正确的是​​A. WHERE col NULLB. WHERE col IS NULLC. WHERE col ! NULLD. WHERE col NOT NULL​答案B​​​​解析​​在 SQL 标准中NULL 代表未知不能使用等号进行比较必须使用 IS NULL 或 IS NOT NULL 来判断。关于数据库事务的隔离级别以下哪个级别可以解决“不可重复读”问题​​A. Read Uncommitted读未提交B. Read Committed读已提交C. Repeatable Read可重复读D. Serializable串行化​​答案C​​​​解析​​Read Committed 解决了脏读但存在不可重复读Repeatable Read 通过锁定读取的行或 MVCC 机制保证了在同一事务中多次读取同一数据结果一致解决了不可重复读问题MySQL 默认隔离级别。​​以下 SQL 语句的执行结果是​​SELECT COUNT(*) FROM employees WHERE salary 5000;A. 查询 salary 大于 5000 的记录数包含 salary 为 NULL 的记录B. 查询 salary 大于 5000 的记录数不包含 salary 为 NULL 的记录C. 查询所有记录数D. 语法错误​​答案B​​​​解析​​WHERE 条件 salary 5000 会过滤掉不满足条件的行而 NULL 值与任何数值比较包括大于结果都为 UNKNOWN即 false因此 NULL 值会被排除在结果集之外。在 SQL 中LEFT JOIN 和 RIGHT JOIN 的主要区别是​​A. LEFT JOIN 返回左表所有记录RIGHT JOIN 返回右表所有记录B. LEFT JOIN 返回右表所有记录RIGHT JOIN 返回左表所有记录C. 两者返回的结果集总是相同的D. LEFT JOIN 只能用于内连接​​答案A​​​​解析​​LEFT JOIN左连接会返回左表的所有记录即使右表中没有匹配的记录右表对应字段为 NULLRIGHT JOIN右连接则相反返回右表的所有记录。​​若要查询每个部门中薪资最高的员工信息以下哪种 SQL 思路最合适​​A. 使用简单的 GROUP BY 部门分组B. 使用子查询或窗口函数如 ROW_NUMBER()C. 使用 LEFT JOIN 连接两次员工表D. 使用 UNION 合并所有员工记录答案B​​​​解析​​简单的 GROUP BY 只能对分组列或聚合函数如 MAX(salary)进行查询无法直接获取该员工的其他详细信息如姓名。通常需要使用子查询先找出各部门最高薪资再关联员工表或者使用窗口函数 ROW_NUMBER() PARTITION BY 部门 ORDER BY 薪资 DESC 来取排名第一的记录。sql示例假设一张员工表employees查询示例SELECTdepartment_id,employee_name,salaryFROM(SELECTdepartment_id,employee_name,salary,-- 按部门分组并按薪资降序进行排名ROW_NUMBER()OVER(PARTITIONBYdepartment_idORDERBYsalaryDESC)ASrnFROMemployees)ASranked_employeesWHERErn1;SQL题考察考察基础查询、多表关联、分组聚合以及窗口函数等核心能力基础查询与条件筛选​​题目 1​​有一张员工表 employees字段id, name, salary, dept_id, hire_date。请查询薪资大于 8000 且入职时间在 2023 年之后的员工姓名和薪资按薪资从高到低排序。SELECTname,salaryFROMemployeesWHEREsalary8000ANDhire_date2023-12-31ORDERBYsalaryDESC;考查 WHERE 多条件筛选AND、日期比较以及 ORDER BY 降序排列。题目2查询员工表中名字以“张”开头且薪资在5000到10000之间的员工信息。SELECT*FROMemployeesWHEREnameLIKE张%ANDsalaryBETWEEN5000AND10000;考点解析​​考查模糊查询 LIKE 的通配符用法以及 BETWEEN…AND 的范围筛选。多表关联查询​​题目 3​​有一张部门表 departments字段dept_id, dept_name。请查询所有员工的姓名、所属部门名称包含那些暂时没有分配部门的员工部门名称显示为 NULL。SELECTe.name,d.dept_nameFROMemployees eLEFTJOINdepartments dONe.dept_idd.dept_id;​​考点解析​​考查 LEFT JOIN 的使用场景即保留左表员工表所有记录右表无匹配时显示 NULL。​​题目 4​​查询“技术部”所有员工的姓名和薪资SELECTe.name,e.salaryFROMemployees eINNERJOINdepartments dONe.dept_idd.dept_idWHEREd.dept_id技术部;​​考点解析​​考查 INNER JOIN 内连接只返回两表中关联字段匹配成功的记录。分组与聚合统计​​题目 5​​查询每个部门的平均薪资并筛选出平均薪资大于 7000 的部门。直接使用聚合函数求平均按照GROUP BY分组并使用HAVING子句对聚合结果筛选SELECTdept_id,AGV(salary)ASavg_salaryFROMemployeesGROUPBYdept_idHAVINGAVG(salary)7000;考点解析​​考查 GROUP BY 分组以及 HAVING 子句对聚合结果进行筛选注意不能用 WHERE 筛选聚合函数结果。​​题目 6​​统计每个部门的人数并按人数从多到少排序。SELECTdept_id,COUNT(*)ASemp_countFROMemployeesGROUPBYdept_idORDERBYemp_countDESC;​​考点解析​​考查聚合函数 COUNT(*) 的使用以及分组后的排序。进阶窗口函数与子查询​​题目 7​​查询每个部门薪资排名前三的员工姓名、部门ID和薪资。假设薪资不重复若重复可考虑使用 DENSE_RANK()显然需要使用子查询然后获取前三排名SELECTname,dept_id,salaryFROM(SELECTname,dept_id,salary,ROW_NUMBER()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASrankFROMemployees)tWHEREt.rank3;考点解析​​考查窗口函数 ROW_NUMBER() 或 RANK()配合 PARTITION BY 进行分组排名这是银行科技岗笔试中区分度较高的考点。题目 8​​查询薪资高于公司所有员工平均薪资的员工姓名和薪资。​​参考 SQL​​SELECTname,salaryFROMemployeesWHEREsalary(SELECTAVG(salary)FROMemployees);​​考点解析​​考查子查询的使用先通过子查询计算出全局平均值再在外层进行筛选。