Java面试高频题及答案(贴近实战版).docx

Java面试高频题及答案(贴近实战版).docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Java面试高频题及答案(贴近实战版)

一、Java基础

问:面向对象三大特性是什么?分别说说实际用法

答:封装、继承、多态。

封装:把属性和方法藏在类里,对外暴露必要接口,比如实体类用private修饰字段,提供get/set,避免外部直接修改数据;

继承:子类拿父类的通用属性/方法,减少重复代码,比如所有DAO层接口继承BaseDAO,复用CRUD方法;

多态:同一行为不同实现,比如Service层定义UserService接口,写UserServiceImpl1(MySQL实现)和UserServiceImpl2(Mongo实现),调用时按场景切换。

问:String、StringBuilder、StringBuffer的区别?实际项目用哪个多?

答:核心是可变性和线程安全:

String不可变(底层char数组final),拼接会产生新对象,适合字符串不常变的场景(比如定义常量);

StringBuilder可变,线程不安全,单线程下字符串拼接用它(比如循环拼接SQL语句),效率比String高;

StringBuffer可变,线程安全(方法加synchronized),多线程拼接用,但实际项目里多线程拼接场景少,所以平时用StringBuilder更多。

问:接口和抽象类的区别?什么时候用接口,什么时候用抽象类?

答:3个核心区别:

抽象类能有普通方法+抽象方法,接口JDK8后能有默认方法,但本质是“行为契约”;

类只能单继承抽象类,却能多实现接口;

抽象类有构造方法(给子类用),接口没有。

用法:如果是“is-a”关系(比如DogisaAnimal),用抽象类;如果是“has-a”行为(比如Doghas跑、叫的行为),用接口。比如项目里,“支付”是接口(支付宝、微信都实现它),“基础支付类”是抽象类(封装支付通用逻辑,比如验签)。

二、集合框架

问:ArrayList和LinkedList区别?实际开发怎么选?

答:底层结构决定差异:

ArrayList是动态数组,查改快(通过索引定位),增删慢(尤其是中间位置,要移元素);

LinkedList是双向链表,增删快(改指针),查改慢(要遍历)。

选法:查改多、增删少(比如展示列表数据)用ArrayList;增删多、查改少(比如实现队列、栈)用LinkedList。另外注意:ArrayList线程不安全,多线程下要么加锁,要么用CopyOnWriteArrayList。

问:HashMapJDK1.7和1.8的区别?为什么1.8用红黑树?

答:核心变化3点:

结构:1.7是“数组+链表”,1.8是“数组+链表/红黑树”;

哈希冲突解决:1.7用头插法(多线程会链表环),1.8用尾插法;

扩容:1.7扩容时重新计算哈希,1.8用“原哈希值旧容量”判断是否移位置。

用红黑树是因为链表太长(默认阈值8)时,查询时间从O(n)变成O(logn),解决查询慢的问题。

问:ConcurrentHashMap为什么线程安全?1.7和1.8有啥不一样?

答:1.7用“分段锁(Segment)”,每个Segment是个小HashMap,锁只锁一段,提高并发;1.8去掉Segment,用“CAS+synchronized”,锁数组的每个元素(链表头/红黑树根),粒度更细,效率更高。实际项目里,多线程存键值对优先用它,比Hashtable(全表锁)快多了。

三、JVM

问:JVM内存模型分哪几块?OOM一般出在哪些区域?

答:运行时数据区分5块:

程序计数器:存当前执行指令地址,不会OOM;

虚拟机栈:存方法栈帧(局部变量、操作数栈),栈溢出(比如递归没出口)或栈内存不够会OOM;

本地方法栈:跟虚拟机栈类似,给native方法用,也会OOM;

堆:存对象实例,最容易OOM(比如不断new对象没回收,比如ArrayList存百万级数据没清理);

方法区:存类信息、常量、静态变量,JDK8后叫元空间(用本地内存),如果频繁加载类(比如动态代理没控制)会OOM。

问:垃圾回收(GC)怎么判断对象该回收?常用GC算法有哪些?

答:判断存活用“可达性分析”:从GCRoots(比如栈里的局部变量、静态变量)出发,能找到的对象存活,找不到的标记为可回收。

常用算法:

复制算法:把堆分成两块,存活对象复制到另一块,清空原块,适合新生代(对象存活率低),比如Serial、ParNew收集器;

标记-清除:先标记可回收对象,再直接删,会有内存碎片

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档