Java高频面试题及手写版答案.docxVIP

  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基础高频题(含代码实操)

1.说说HashMap和HashTable的核心区别(至少3点)

答案:

线程安全:HashTable是线程安全的(方法加了synchronized),HashMap线程不安全;但HashTable效率低,实际开发中更常用ConcurrentHashMap(分段锁/CAS优化)替代。

空值支持:HashMap允许key和value为null(key只能有一个null),HashTable不允许key/value为null(会抛NullPointerException)。

底层实现:JDK1.8后HashMap是“数组+链表+红黑树”(链表长度≥8转红黑树),HashTable始终是“数组+链表”。

初始容量与扩容:HashMap初始容量16,扩容为2倍;HashTable初始容量11,扩容为2n+1。

2.手写单例模式(饿汉式+懒汉式双重校验锁)

答案:

//饿汉式(线程安全,类加载时初始化,适合占用内存小的对象)

publicclassSingletonHungry{

//私有静态实例(直接初始化)

privatestaticfinalSingletonHungryINSTANCE=newSingletonHungry();

//私有构造器(禁止外部实例化)

privateSingletonHungry(){}

//公有获取方法

publicstaticSingletonHungrygetInstance(){

returnINSTANCE;

}

}

//懒汉式(双重校验锁,线程安全,延迟加载)

publicclassSingletonLazy{

//volatile禁止指令重排(避免半初始化对象被获取)

privatestaticvolatileSingletonLazyINSTANCE;

privateSingletonLazy(){}

publicstaticSingletonLazygetInstance(){

//第一次校验(避免频繁加锁)

if(INSTANCE==null){

synchronized(SingletonLazy.class){

//第二次校验(防止多线程并发创建)

if(INSTANCE==null){

INSTANCE=newSingletonLazy();//3步:分配内存→初始化→赋值,volatile禁止重排

}

}

}

returnINSTANCE;

}

}

3.解释Java的多态实现原理,以及向上转型和向下转型的区别

答案:

多态原理:基于“继承+重写+父类引用指向子类对象”,底层通过方法表实现。当调用重写方法时,JVM会根据对象的实际类型(而非引用类型)去查找方法表,执行对应子类的实现。

向上转型(自动转换):子类对象→父类引用,例如Animaldog=newDog();,安全但只能调用父类定义的方法(若子类重写则执行子类逻辑)。

向下转型(强制转换):父类引用→子类对象,例如Dogdog=(Dog)animal;,需先通过instanceof判断(避免ClassCastException),目的是调用子类特有的方法。

二、进阶核心题(JVM+并发)

1.JVM内存模型(运行时数据区),以及OOM异常可能发生在哪些区域

答案:

运行时数据区(JDK8+):

程序计数器:线程私有,存储当前线程执行的字节码行号,无OOM(唯一不会抛OOM的区域)。

虚拟机栈:线程私有,存储方法栈帧(局部变量表、操作数栈等),栈深度过大抛StackOverflowError,栈扩容失败抛OutOfMemoryError。

本地方法栈:线程私有,为Native方法服务,同样可能抛StackOverflowError/OOM。

堆:线程共享,存储对象实例和数组,是OOM最常发生的区域(例如对象过多无法回收,-Xmx设太小)。

方法区(元空间,JDK8替代永久代):线程共享,存储类信息、常量、静态

文档评论(0)

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

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

1亿VIP精品文档

相关文档