Java初级工程师面试题及答案(贴合真实面试场景).docxVIP

Java初级工程师面试题及答案(贴合真实面试场景).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

Java初级工程师面试题及答案(贴合真实面试场景)

一、Java基础语法

问题:int和Integer的区别是什么?实际开发中什么时候用Integer?

答案:int是基本数据类型,占4个字节,默认值0,直接存储数值;Integer是int的包装类,属于引用类型,默认值null,存储对象引用。实际开发中用Integer的场景:①集合框架中(比如List),因为集合只能存引用类型;②需要表示null值时(比如数据库查询结果可能为空的数值字段);③调用需要对象参数的方法时(比如某些API的参数要求是Object类型)。

问题:String、StringBuffer、StringBuilder的区别?日常开发中字符串拼接用哪个?

答案:核心区别在可变性和线程安全:String是不可变的(底层char数组被final修饰),每次拼接都会生成新对象;StringBuffer是可变的,且线程安全(方法加了synchronized),效率稍低;StringBuilder是可变的,线程不安全,但效率最高。日常开发中,单线程环境下字符串拼接优先用StringBuilder(比如循环里拼接字符串);如果是多线程场景(比如并发处理字符串),用StringBuffer;简单的字符串赋值或少量拼接(比如a+b),JVM会优化为String,直接用即可。

问题:switch语句在JDK7之后支持哪些数据类型?case后面可以跟什么?

答案:JDK7之前switch只支持byte、short、int、char(包括对应的包装类)和枚举;JDK7及之后新增了String类型支持。case后面必须跟常量表达式,比如具体的数字、字符串字面量、枚举常量,不能是变量或动态计算的表达式(比如casea+1:是不合法的)。另外,case没有break的话会发生穿透现象,执行后续case的代码,直到遇到break或switch结束。

二、集合框架

问题:ArrayList和LinkedList的区别?什么时候选ArrayList,什么时候选LinkedList?

答案:底层实现不同:ArrayList基于动态数组,LinkedList基于双向链表。核心区别在操作效率:①查找(get(index)):ArrayList是O(1),直接通过索引访问;LinkedList是O(n),需要从头/尾遍历,效率低;②增删(add/remove在中间位置):LinkedList是O(1),只需修改链表指针;ArrayList是O(n),需要移动后续元素;③内存占用:ArrayList需要预留一定容量(避免频繁扩容),LinkedList每个节点要存储前后指针,内存开销更大。实际选择:查询多、增删少用ArrayList;增删多、查询少(比如队列、栈场景)用LinkedList。

问题:HashMap的底层实现(JDK8)?为什么线程不安全?

答案:JDK8中HashMap底层是“数组+链表+红黑树”的结构:数组是哈希桶,每个元素是链表(解决哈希冲突),当链表长度超过8且数组容量≥64时,会转为红黑树(提高查询效率)。线程不安全的原因:①扩容时的死循环(JDK7中,多线程同时扩容会导致链表成环,JDK8已修复,但仍不安全);②数据覆盖:多线程同时put时,可能出现两个线程计算出相同哈希值,后插入的元素覆盖先插入的;③get操作可能拿到过期数据:没有volatile修饰,线程间数据可见性无法保证。如果需要线程安全的Map,可用ConcurrentHashMap(推荐,效率比Hashtable高)或Hashtable(方法加synchronized,效率低)。

三、多线程

问题:线程的创建方式有哪些?实际开发中常用哪种?

答案:常见的创建方式有3种:①继承Thread类,重写run()方法;②实现Runnable接口,重写run()方法,再传入Thread对象;③实现Callable接口,重写call()方法(支持返回值和异常抛出),配合FutureTask使用。实际开发中优先用“实现Runnable/Callable”,原因:①Java单继承,继承Thread后无法再继承其他类,灵活性差;②Runnable/Callable更符合“职责单一”原则,将线程任务与线程对象分离;③Callable支持返回值,适合需要获取任务执行结果的场景(比如异步计算)。另外,现在也常用线程池(Exec

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档