版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java初级工程师经典面试题及答案解析(2025版)1.单选题(每题2分,共20分)1.1下列关于Java基本类型的描述,正确的是A.boolean在内存中固定占1字节B.long类型能表示的最大值是2^631C.float的默认值是0.0dD.char可以存储一个UTF8编码的汉字答案:B解析:long占64位,最大值2^631;boolean大小由JVM决定;float默认0.0f;char存UTF16码元,单个汉字需一个码元即可,但UTF8是变长字节序列,与char无关。1.2下列代码输出结果是```javainta=5;intb=a+++++a+a;System.out.println(b);```A.16B.17C.18D.19答案:C解析:a++取5,a变6;++a取7,a变7;a取7,a变6;和为5+7+7=18。1.3关于HashMap与ConcurrentHashMap,错误的是A.JDK8中ConcurrentHashMap采用synchronized+CASB.HashMap在JDK8中链表转红黑树阈值为8C.ConcurrentHashMap的size()方法在JDK7使用分段锁累加D.HashMap允许nullkey且线程安全答案:D解析:HashMap非线程安全,且允许一个nullkey;D描述完全错误。1.4下列关于异常的说法正确的是A.RuntimeException必须被catch或声明B.Error可以被程序处理并恢复C.trywithresources能自动关闭实现AutoCloseable的类D.finally块在System.exit(0)后仍会执行答案:C解析:RuntimeException无需强制处理;Error不建议捕获;finally在System.exit(0)后不会执行;C正确。1.5下列关于泛型的描述,正确的是A.List<String>与List<Object>是协变关系B.List<?>可调用add(null)C.泛型信息在运行期通过反射可完全获取D.通配符下界List<?superNumber>可安全读取Number答案:B解析:List<?>引用不可add除null外任何类型;泛型擦除后运行期无法获取完整参数化类型;下界通配符只能写入,读取Object。1.6下列哪个类最适合实现不可变对象A.StringBuilderB.java.util.DateC.java.time.LocalDateD.ArrayList答案:C解析:LocalDate字段全final且无修改方法;StringBuilder、ArrayList可变;Date字段可改。1.7关于JVM内存区域,错误的是A.虚拟机栈为线程私有B.方法区在JDK8后由元空间实现C.堆中仅存对象实例与数组D.本地方法栈为字节码执行服务答案:D解析:本地方法栈服务Native方法;字节码执行由虚拟机栈完成。1.8下列关于SpringBean生命周期的顺序,正确的是A.实例化→属性赋值→Aware→BeanPostBefore→初始化→BeanPostAfter→销毁B.实例化→Aware→属性赋值→初始化→BeanPostBefore→BeanPostAfter→销毁C.属性赋值→实例化→Aware→初始化→销毁D.实例化→初始化→属性赋值→Aware→销毁答案:A解析:Spring官方顺序:实例化→populate→Aware→BeanPostBefore→initmethod→BeanPostAfter→注册销毁回调。1.9下列SQL在MySQL5.7中可正确执行的是A.selectfromuserlimit10offset0B.selectfromuserlimit10,0C.selectfromuserlimit0,10D.selectfromuserlimit10offset10,20答案:C解析:MySQL语法为limitoffset,size或limitsizeoffsetoffset;C正确。1.10关于Redis数据结构,错误的是A.List底层双向链表+压缩列表B.Set底层intset+hashtableC.ZSet底层压缩列表+跳表D.Hash底层仅hashtable答案:D解析:Hash在元素少且小时用ziplist,否则用hashtable。2.多选题(每题3分,共15分)2.1下列哪些属于Java内存模型中的happensbefore原则A.程序次序规则B.监视器锁规则C.volatile变量规则D.线程中断规则答案:ABC解析:JMM规定8条happensbefore,含程序次序、锁、volatile、传递、线程启动/终止等;中断规则不在其中。2.2关于Spring事务传播行为,哪些说法正确A.REQUIRED:当前无事务则新建,有则加入B.REQUIRES_NEW:挂起当前事务,新建独立事务C.NESTED:必须运行在嵌套事务中,底层依赖JTAD.SUPPORTS:当前无事务则以非事务方式运行答案:ABD解析:NESTED底层依赖savepoint,非JTA;A、B、D正确。2.3下列哪些设计模式在JDK源码中有直接体现A.装饰器模式(BufferedInputStream)B.观察者模式(Observable)C.工厂方法(Collection.iterator)D.享元模式(Integer.valueOf)答案:ABCD解析:BufferedInputStream装饰;Observable观察者;iterator工厂;Integer缓存128~127享元。2.4关于MySQL索引,哪些说法正确A.联合索引(a,b,c)可满足wherea=1andc>0的索引下推B.覆盖索引可避免回表C.唯一索引允许多个NULL值D.全文索引只能用于InnoDB答案:ABC解析:MyISAM也支持全文索引;A、B、C正确。2.5下列哪些属于线程安全的Map实现A.HashtableB.Collections.synchronizedMapC.ConcurrentHashMapD.HashMap答案:ABC解析:HashMap非线程安全;其余均通过同步或分段锁保证安全。3.填空题(每空2分,共20分)3.1在Java中,实现深拷贝的三种常见方式:________、________、________。答案:实现Cloneable并重写clone、序列化/反序列化、拷贝构造函数/工厂方法。3.2synchronized关键字在JDK6之后引入的锁升级顺序:________→________→________。答案:无锁、偏向锁、轻量级锁、重量级锁(答前三即可)。3.3SpringBoot启动类上用于开启自动配置的注解全称:________。答案:@EnableAutoConfiguration。3.4MySQL中,查看慢查询日志是否开启的命令:________。答案:showvariableslike'slow_query_log%'。3.5Redis中,将键key的过期时间设置为60秒的命令:________。答案:expirekey60。3.6JVM参数中,设置堆最大值为2G:________。答案:Xmx2g。3.7Java8中,将集合list转为Map的收集器写法:________。答案:Collectors.toMap(k>k,v>v)。3.8在Git中,将暂存区文件回退到工作区的命令:________。答案:gitresetHEAD<file>。3.9Linux中,查看端口8080被哪个进程占用的命令:________。答案:lsofi:8080或netstattunlp|grep8080。3.10在Dockerfile中,指定基础镜像的指令:________。答案:FROM。4.判断题(每题1分,共10分)4.1Java中,String对象一旦创建就不可变。(√)4.2在try块中写return,finally块将不会执行。(×)4.3SpringMVC中,@RestController等价于@Controller+@ResponseBody。(√)4.4MySQL的InnoDB支持全文索引始于5.6版本。(√)4.5Redis的RDB持久化方式默认开启。(√)4.6Java中,volatile能保证复合操作的原子性。(×)4.7使用线程池时,corePoolSize=0表示线程池不会创建任何线程。(×)4.8在Linux中,软连接可以跨文件系统。(√)4.9Git的rebase操作会改变提交历史,多人协作时应谨慎使用。(√)4.10JUnit5中,@BeforeEach方法会在每个测试方法前执行一次。(√)5.简答题(每题6分,共30分)5.1描述Java中类加载的双亲委派模型,并说明如何打破该模型。答案:双亲委派模型要求加载请求先由父类加载器尝试加载,依次向上,只有父加载器无法加载时才由子加载器加载。优点:避免重复加载,保证核心类安全。打破方式:1.重写loadClass()方法,改变委派逻辑(如Tomcat的WebAppClassLoader);2.使用线程上下文类加载器(JDBC、JNDI场景);3.自定义ClassLoader并重写findClass(),在loadClass()中不调用super.loadClass()。代码示例:```javapublicclassCustomLoaderextendsClassLoader{protectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{if(name.startsWith("java."))returnsuper.loadClass(name,resolve);Class<?>c=findLoadedClass(name);if(c==null)c=findClass(name);if(resolve)resolveClass(c);returnc;}}```5.2解释MySQL的MVCC实现原理,并说明可重复读隔离级别下如何避免幻读。答案:MVCC通过为每行记录添加隐藏字段(trx_id、roll_pointer、row_id)与ReadView实现。1.每开启事务生成一致性视图ReadView,包含活跃事务ID列表、最小/最大事务ID;2.查询时比较行trx_id与ReadView,若行trx_id小于最小ID或等于当前事务ID则可见;若大于最大ID或在列表中则不可见,需回滚指针找历史版本;3.可重复读在事务首次查询时生成ReadView,后续复用,保证同一事务多次读取结果一致;4.避免幻读:通过nextkeylock(行锁+gap锁)锁定索引区间,阻止其他事务插入新记录;InnoDB对范围查询加gap锁,从而避免幻读。5.3描述Redis缓存穿透、击穿、雪崩的区别及对应解决方案。答案:1.穿透:查询不存在数据,缓存与数据库均无,导致请求直达DB。方案:布隆过滤器拦截;空值缓存并设短TTL。2.击穿:热点key过期瞬间,大量并发击穿DB。方案:互斥锁(setnx);热点key永不过期,异步刷新;随机退避。3.雪崩:大量key同时失效,DB压力激增。方案:过期时间加随机值;多级缓存(本地+Redis);限流降级;集群部署提高高可用。5.4说明SpringBean循环依赖的解决机制,并指出哪些情况无法解决。答案:Spring通过三级缓存解决setter循环依赖:1.singletonObjects:完整Bean;2.earlySingletonObjects:早期引用,已实例化但未填充属性;3.singletonFactories:ObjectFactory,可生成AOP代理。流程:实例化A后将其ObjectFactory放入三级缓存;填充属性时发现需要B;创建B,B又需要A,从三级缓存获取A的早期引用完成注入;B初始化后注入A,A再完成初始化。无法解决的情况:1.构造器注入循环依赖;2.prototype作用域循环依赖;3.自定义scope循环依赖。解决方案:改用setter注入;使用@Lazy延迟加载;重构设计。5.5描述一次完整的HTTP请求从浏览器地址栏到服务器返回HTML的详细过程,包括DNS、TCP、TLS、HTTP、Nginx、Tomcat。答案:1.DNS:浏览器检查缓存→系统缓存→路由器缓存→本地DNS服务器→递归查询根→顶级→权威服务器,获取IP;2.TCP:三次握手,SYN→SYN+ACK→ACK,建立连接;3.TLS:ClientHello(支持的TLS版本、加密套件、随机数)→ServerHello(选定版本、套件、证书、随机数)→服务器证书验证→密钥交换(ECDHE)→生成会话密钥→Finished消息,完成握手;4.HTTP:浏览器发送GET/index.htmlHTTP/2,带Host、UserAgent、Cookie等;5.Nginx:接收请求,根据server_name匹配虚拟主机;location/转发至upstreamtomcat集群;启用HTTP/2、Gzip、缓存;6.Tomcat:Coyote连接器接收HTTP,解析为Request对象;Mapper找到对应Host、Context、Wrapper;Filter链执行(字符编码、权限、日志);Servlet.service()处理;SpringMVCDispatcherServlet根据@RequestMapping匹配Handler;HandlerAdapter调用Controller;返回ModelAndView;ViewResolver解析JSP;HTML写入Response;7.反向路径:Tomcat→Nginx→TLS加密→TCP分段→IP路由→浏览器解析HTML→构建DOM→CSSOM→渲染树→绘制页面。6.编程题(共25分)6.1手写线程安全的单例模式(懒汉+双重检查+volatile),并解释每一步。(10分)答案:```javapublicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){//第一次检查,避免同步开销synchronized(Singleton.class){if(instance==null){//第二次检查,确保只创建一次instance=newSingleton();//volatile禁止指令重排}}}returninstance;}}```解析:1.volatile防止newSingleton指令重排导致其他线程拿到半初始化对象;2.双重检查减少同步粒度,提升性能;3.构造函数私有防止反射可再使用枚举单例防反射攻击。6.2实现一个基于数组的阻塞队列MyBlockingQueue,支持put与take方法,容量固定,线程安全。(15分)答案:```javapublicclassMyBlockingQueue<E>{privatefinalE[]items;privateinttakeIndex,putIndex,count;privatefinalReentrantLocklock=newReentrantLock();privatefinalConditionnotEmpty=lock.newCondition();privatefinalConditionnotFull=lock.newCondition();@SuppressWarnings("unchecked")publicMyBlockingQueue(intcapacity){if(capacity<=0)thrownewIllegalArgumentException();items=(E[])newObject[capacity];}publicvoidput(Ee)throwsInterruptedException{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电信大业务合同范本
- 私下签协议还写合同
- 个人房屋租赁合同5
- 无乳糖营养包培训
- 疱疹常见症状及护理方法解析
- 自我介绍新人入职
- 老年人社区营养保障体系建设
- 2025-2026学年安徽省江淮名校高一上学期10月阶段联考地理试题(A卷)
- 白内障症状分析及护理技巧
- 儿科常见疾病健康宣教
- 建材五金行业招商策划
- DL-T 2561-2022 立式水轮发电机状态检修评估技术导则
- 培训班授课教师课时费用领取表
- 财政投资项目评审服务投标方案(技术方案)
- 重庆东能新材料有限公司10 万吨-年非光气法生产聚碳酸酯项目(一期 6 万吨-年碳酸二甲酯项目)环境影响报告书
- 职业道德-国家职业资格培训教程课件
- (人防)车位使用权转让协议书
- 皮肤软组织骨恶性肿瘤演示文稿
- GB/T 26396-2011洗涤用品安全技术规范
- 物理化学简明教程(印永嘉)复合反应动力学468211522
- 分镜头脚本表格 -示例
评论
0/150
提交评论