2021届Java开发求职-------面试实战之百度实习

介绍

转自牛客网:

1. 有看过HashMap源码吗?

hashmap还是比较常见,目前看到的每个面经都考这个

2. JDK1.7中HashMap的put()方法全过程。

注意hash值相等的话形成链表是用头插法插入的

3. JDK1.8有那些变化。

jdk1.8新增红黑树改善hash碰撞带来的链表过长而导致的查询效率问题,并且扩容时是用尾插法

4. JDK1.7当中HashMap中线程不安全问题有那些?原因分别是什么?

(1)在put的时候,因为该方法不是同步的,假如有两个线程A,B它们的put的key的hash值相同,不论是从头插入还是从尾插入,假如A获取了插入位置为x,但是还未插入,此时B也计算出待插入位置为x,则不论AB插入的先后顺序肯定有一个会丢失

(2)在扩容的时候,jdk1.8之前是采用头插法,当两个线程同时检测到hashmap需要扩容,在进行同时扩容的时候有可能会造成链表的循环,主要原因就是,采用头插法,新链表与旧链表的顺序是反的,在1.8后采用尾插法就不会出现这种问题,同时1.8的链表长度如果大于8就会转变成红黑树。

5. JDK1.8之后如何链地址法,链表长度是多少的时候会转换成红黑树。

链表树化需要满足两个条件:

1.链表长度大于等于 TREEIFY_THRESHOLD 初始值为8
2.桶数组容量大于等于 MIN_TREEIFY_CAPACITY 初始值为64

6. 节点个数是多少的时候,红黑树会退回链表。

6

7. 为什么会选择8作为链表转红黑树的阈值。

计算出来的:通过源码我们得知HashMap源码作者通过泊松分布算出,当桶中结点个数为8时,出现的几率是亿分之6的,因此常见的情况是桶中个数小于8的情况,此时链表的查询性能和红黑树相差不多,因为转化为树还需要时间和空间,所以此时没有转化成树的必要

8. HashMap与HashTable有什么区别?

HashTable 使用 synchronized 来进行同步,线程安全。
HashMap 可以插入键为 null 的 Entry。
HashMap 的迭代器是 fail-fast 迭代器。
HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的

9. 有没有了解过ConcurrentHashMap?

10. JDK1.8之后ConcurrentHashMap如何保证线程安全性?(CAS+synchronized),这里还顺便问了synchronized和可重入锁的区别。

1、不采用segment而采用node,锁住node来实现减小锁粒度。
2、设计了MOVED状态 当resize的中过程中 线程2还在put数据,线程2会帮助resize。
3、使用3个CAS操作来确保node的一些操作的原子性,这种方式代替了锁。
4、sizeCtl的不同值来代表不同含义,起到了控制的作用。
采用synchronized而不是ReentrantLock

11. 说到synchronized,说些synchronized加在static关键字前和普通方法前的区别?

线程八锁问题,可看我的文章:线程八锁

12. 看你熟悉单例,说下单例懒汉式和饿汉式的区别?(手写)

https://blog.csdn.net/bupttulongming/article/details/103218282

13. 懒汉式下如何保证线程安全?

synchronized修饰 get方法

14. 创建线程安全的单例有那些实现方法?

饿汉式,类加载的时候就创建实例

15. 说一下JVM的内存模型?(每一个模块都说)

公有的堆区方法区,私有的程序计数器,本地方法栈,虚拟机栈

16. 熟不熟悉垃圾回收算法?

GC算法主要有复制算法,标记清除算法,标记整理算法,适用于不同情况

17. 如何判定一个对象是否应该回收。

目前,Java 虚拟机判断垃圾对象使用的是:GC Root Tracing 算法。其大概的过程是这样:从 GC Root 出发,所有可达的对象都是存活的对象,而所有不可达的对象都是垃圾。

Gc-root:
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象

18. 除了垃圾回收,还有那些工作会造成CPU负载过高(其实这里给出的是一个场景,就是让描述一下除了垃圾回收之外,还有那些工作会让线上CPU占用到百分之90-100,并且给出排查过程。)。

代码中复杂计算,用top指令查看占用CPU高的进程,CPU问题排查流程

19. 说一下CMS垃圾回收器和G1收集器的特点,和收集过程。
  • CMS 收集器全称为 Concurrent Mark Sweep,意为标记清除算法,其是一个使用多线程并行回收的垃圾收集器。获取最短回收停顿时间为目标

基于标记-清除算法实现。并发收集、低停顿。
适用于注重服务的响应速度,希望系统停顿时间最短的使用环境
主要工作步骤有:初始标记、并发标记、预清理、重新标记、并发清除和并发充值。其中初始标记和重新标记是独占系统资源的,而其他阶段则可以和用户线程一起执行。

  • G1收集器是整堆收集器

并行并发 :G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World停顿时间。部分收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让Java程序继续运行。
分代收集:G1能够独自管理整个Java堆,使用了分区算法,从而使得 Eden 区、From 区、Survivor 区和老年代等各块内存不必连续
空间整合 :G1运作期间不会产生空间碎片,收集后能提供规整的可用内存。

G1收集器分为四个工作步骤:

新生代 GC
并发标记周期:在这个阶段,所有将要被回收的区域会被 G1 记录在一个称之为 Collection Set 的集合中。
混合收集:混合回收阶段会首先针对 Collection Set 中的内存进行回收,因为这些垃圾比例较高
Full GC:当在回收阶段遇到内存不足时,G1 会停止垃圾回收并进行一次 Full GC,从而腾出更多空间进行垃圾回收

20. String a = “abc”;和String b = new String(“abc”);是不是一样的?为什么?他们对应的内存空间分别是什么?

不一样,前者会去字符串常量池找有没有abc这个对象,如果有赋值引用;利用new来创建字符串时,无论字符串常量池中是否有与当前值相同的对象引用,都会在堆中新开辟一块内存,创建一个新的对象。如果算上栈的引用str

21. 说一下JVM创建对象的过程。

找了篇博客JVM对象创建过程

22. 说一下byte a = 127; byte b = 127; a+=b和a = a+b的区别分别会出现什么问题。

+=操作符会进行隐式自动类型转换

23. 是否熟悉mysql?说一下mysql的隔离级别和对应的问题。

本人的文章:关于mysql隔离级别和事务

24. 什么是MVCC,主要是为了做什么?

这篇文章:MVCC介绍

25. 说一下Spring的IOC和AOP在项目里是怎么用的。

IOC比较多,依赖倒转;AOP可能是日志,安全这些部分

26. AOP的两种实现方式,并且说一下哪一个效率更高一些,为什么。

cglib和jdk动态代理,,在1.6和1.7的时候,JDK动态代理的速度要比CGLib动态代理的速度要慢,但是并没有教科书上的10倍差距,在JDK1.8的时候,JDK动态代理的速度已经比CGLib动态代理的速度快很多了

27. 说一些Spring的事务传播机制。

本人文章有:https://blog.csdn.net/bupttulongming/article/details/101195079


总结

这份面经还是挺有难度的,MVCC,G1和CMS收集过程感觉之前没复习过,挺细的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值