阿里云高频面试题及实战答案.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核心与JVM(技术岗一面重点)

1.String、StringBuilder、StringBuffer的区别?

答案:核心差异在可变性和线程安全。String是不可变的,每次拼接都会生成新对象,适合少量字符串操作;StringBuilder可变且非线程安全,没有同步锁,效率最高,日常开发单线程场景(比如字符串拼接、SQL构造)用它;StringBuffer同样可变,但方法加了synchronized,线程安全但效率低,只有多线程共享字符串时才考虑(比如全局配置拼接)。实际项目里,单线程下StringBuilder比StringBuffer快30%左右,尽量优先用。

2.HashMap原理及hash碰撞解决方案?多线程下有什么问题?

答案:HashMap基于数组+链表/红黑树实现,默认初始容量16,负载因子0.75。存储时先通过key的hashCode()计算哈希值,再用扰动函数(JDK1.8是hashCode()^(hashCode()16))减少碰撞,最后按数组长度取模得到索引。

解决hash碰撞:JDK1.8前用链地址法(链表存储冲突元素),1.8后优化为“链表+红黑树”——当链表长度超过8且数组容量≥64时,链表转红黑树,查询效率从O(n)提升到O(logn)。

多线程问题:①扩容时会出现环形链表(JDK1.7及之前),导致死循环;②put操作可能覆盖数据(比如两个线程同时计算出同一索引,后插入的覆盖前一个);③无法保证元素可见性。生产环境多线程用ConcurrentHashMap,1.8里它用CAS+synchronized实现分段锁,比1.7的分段锁效率更高。

3.JVM垃圾收集算法及GCRoots有哪些?

答案:常见垃圾收集算法:①标记-清除(Mark-Sweep):先标记垃圾对象,再统一清除,优点是快,缺点是产生内存碎片;②标记-复制(Mark-Copy):把内存分成两块,只用一块,垃圾回收时复制存活对象到另一块,无碎片但浪费空间,适合新生代(存活对象少);③标记-整理(Mark-Compact):标记后把存活对象向一端移动,再清除垃圾,无碎片也不浪费空间,适合老年代(存活对象多)。

实际用的是分代收集算法:新生代用标记-复制(比如Serial、ParNew、G1),老年代用标记-整理(比如CMS、G1)。

GCRoots:简单说就是“不会被回收的对象引用”,比如虚拟机栈里的局部变量、方法区的类静态变量、常量、本地方法栈的JNI引用、活跃线程对象等。

二、并发编程(技术岗一二面高频)

1.synchronized和Lock的区别?

答案:synchronized是Java原生关键字,Lock是java.util.concurrent包下的接口(常用实现ReentrantLock)。

核心区别:①使用方式:synchronized自动释放锁(出代码块或异常时),Lock需要手动lock()和unlock()(必须放finally里,否则死锁);②功能:Lock支持公平锁/非公平锁(synchronized默认非公平)、可中断锁(lockInterruptibly())、超时获取锁(tryLock()),还能通过Condition实现精准唤醒(synchronized只能notify()/notifyAll()唤醒随机线程);③性能:低并发下两者差不多,高并发时Lock更灵活,性能更优。

实际场景:简单同步用synchronized(比如单例模式双重检查),需要复杂控制(比如超时重试、公平锁)用ReentrantLock。

2.线程池底层原理及核心参数?

答案:线程池核心是“池化技术”,避免频繁创建销毁线程,底层用阻塞队列存储任务,工作线程循环取任务执行。

核心参数有5个:①核心线程数(corePoolSize):长期存活的线程数,比如CPU密集型任务设为CPU核心数+1,IO密集型设为2*CPU核心数;②最大线程数(maximumPoolSize):线程池能容纳的最多线程数;③空闲线程存活时间(keepAliveTime):核心线程外的线程空闲多久后销毁;④时间单位(unit):keepAliveTime的单位(比如秒、毫秒);⑤任务队列(workQueue):存储等待执行的任务,常用LinkedBlockingQueue(无界队列)、ArrayBlockingQueue(有界队列)。

调度丢弃策略:当任务数

文档评论(0)

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

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

1亿VIP精品文档

相关文档