29-面经整理

​​​​​​​小米日常实习面经

hashMap的结构,负载因子为什么是0.75

java8以前:数组+链表,java8以后:数组+链表+红黑树:在链表节点数超过8的时候转换为红黑树,在红黑树节点数小于6的时候转换为链表

负载因子和扩容机制有关,比如容器的容量为16,负载因子为0.75,那么在容量达到12的时候就会进行扩容操作;HashMap是一个数据结构,既然是数据结构最主要的就是节省时间和空间,负载因子的存在也是为此服务的;考虑两种极端情况,0.75是空间与时间权衡后的结果

  • 如果负载因子是1.0的时候,意味着只有数组的值全部被填充了才会发生扩容,此时Hash冲突已经避免不了了,当出现大量hash冲突的时候,底层的红黑树会变得异常复杂,对于查询效率极其不利,负载因子过大,时间效率降低了
  • 当负载因子为0.5时,意味着在数组元素达到一半的时候就会开启扩容,既然填充的元素少了,hash冲突也会变少,底层红黑树结构也变简单了,可是这样一位着储存1m的数据,现在需要2m的空间,负载因子太小,空间利用率降低了

Volatile的作用和原理

保证可见性,禁止指令重排,不保证原子性,可以理解为轻量级的Synchronized

回答volatile的时候可以扯到JMM内存模型,JMM描述的是一组规则或者规范,他要求保证可见性,原子性和有序性;它关于同步的规定是

  • 线程解锁前,必须把共享变量刷新回主内存
  • 线程加锁前,必须读取主内存的最新值到自己的工作内存
  • 加锁和解锁是同一把锁
  • 可见性:当一个线程在本地内存更改了数据并且把变量写回主内存的时候要通知其他线程,现在这个变量已经更改了
  • volatile不保证原子性,它一般需要配合CAS(包装原子类)来使用
  • 禁止指令重排:计算机为了提高性能,通常会对指令进行重排,但是在多线程情况下,会导致一些意想不到的情况发生

对于volatile修饰的变量,当对其进行操作的时候,jvm会将这个缓存中的变量回写到系统的主内存中,并且通知其他的线程,让他们也刷新相关的缓存

数据库的隔离级别,幻读举一个例子

事务的特性:ACID->(原子,一致,隔离,持久),其中隔离衍生出的就是数据库的隔离级别:

  • 读未提交:存在脏读问题,并发最高,一致性最差
  • 读已提交:存在不可重复读问题,在高并发场景下几乎不会使用以上两种隔离级别
  • 重复读:存在幻读问题,mysql的默认隔离级别
  • 串行化:解决了所有的问题,效率低下

幻读例子:

select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读

innodb是如何解决幻读的

当前读: 加锁的select等语句,在可重复读的事务隔离级别下,数据库会锁住本条记录以及索引区间,比如select * from table where id>3锁住的就是id=3这条记录以及id>3这个区间范围,避免范围间的插入记录以及其索引区间

普通读:手段是MVCC,记录创建版本号和删除版本号,在事务启动的时候,都有一个唯一的递增版本号,每开启一个新的事务,事务的版本号就会递增,基于此它修改了增删改查的逻辑:

  • 查找:读取创建版本小于等于当前事务版本号,并且删除版本为空或者大于当前版本号的记录,即保证读取之前记录是存在的
  • 删:将当前事务的版本号保存至行的删除版本号
  • 改:插入行,以当前事务的版本号作为新行的创建版本号,同时将原记录行的删除版本号设置为当前事务版本号
  • 增:将当前事务的版本号保存至行的创建版本号

 GC算法有哪些,判断GCROOTS的原则是什么

引用计数法(循环引用问题):被引用+1,引用失效-1,为0的对象不可以被使用,java没用到

标记清除法(碎片化问题):把活动的对象做标记,清除没有做标记的对象

复制算法:内存分成两块,一块用完的时候,还活着的对象就丢到另一块上面,然后把已经使用过的内存一次清理掉

标记整理算法:与标记清除差不多,后续步骤是让所有存活的对象移动到一端,然后直接清除端边界以外的内存

可达性分析:所谓的可达性就是通过一系列称为“GC Roots”的对象为起点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是GC Roots到这个对象不可达)时,则说明此对象是不可用的。

GCRoots的判断原则:

1、栈(栈帧中的本地变量表)中引用的对象。

2、方法区中的静态成员。

3、方法区中的常量引用的对象(全局变量)。

4、本地方法栈中JNI(一般说的Native方法)引用的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java面经-百度准入职老哥整理.pdf》是一份关于百度准入职面试的Java面经整理。这份面经是由百度准入职的老哥整理而成,其中记录了一些面试时可能会遇到的问题以及解答方法。 这份面经对于准备参加百度准入职面试的人来说非常有价值。首先,它列出了一些常见的面试问题,涵盖了Java语言的各个方面,包括基础知识、数据结构与算法、设计模式、多线程、网络编程等等。通过仔细研究和复习这些问题的答案,可以帮助面试者全面了解Java语言的特性和应用。 其次,这份面经还提供了问题的解答思路和方法,帮助面试者理清思路,正确回答问题。这对于很多面试者来说特别有帮助,因为在面试时有时会遇到一些棘手的问题,有了这份面经的指导,面试者可以更好地掌握应对策略。 不过需要注意的是,面经作为一份参考资料,不能完全依赖于它来准备面试。面试官可能会问一些不在面经中列出的问题,因此考生还是需要自己对Java语言有充分的了解,并能够熟练运用。同时,面试官还会关注考生的沟通能力、解决问题的能力以及对新技术的学习和掌握能力。 总体来说,《java面经-百度准入职老哥整理.pdf》是一份非常宝贵的资料,可以帮助面试者对Java面试中可能会遇到的问题有更深入的了解,提供了解答思路和方法。但记住,面试准备还需要多方面的知识积累和实践经验的积累,才能在面试中展现自己的优势。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值