常规面试题,断网十几次了,幸亏面试官很耐心。
1.自我介绍
2.项目经验
项目经历中最值得说的项目
这个项目中遇到最大的困难和解决方案
深入细节询问(10分钟左右)
3.java基础
HashMap
底层实现
为什么要采用数组+链表+红黑树的数据结构
在每个关键字位置上,如果新增了一个value,是头插法还是尾插法(还是源码,感觉有些难,链表的时候应该是尾插法吧,感觉比较方便,但想了下,红黑树也是尾插法,红黑树的插入操作是先插入到叶子结点,再调整)
扩容机制
是否线程安全
线程安全的做法(ConcorrentHashMap)
ConcorrentHashMap如何保证线程安全(与HashTable对比了一下,并说明锁的粒度)
ConcorrentHashMap锁住的是什么(忘了,是锁住关键字对应的红黑树或链表,还是数组的某个区间)
两个value为-1025的Integer对象是否相等(a = -1025, b=-1025,a==b是否为true)
两个value为-125的对象是否相等(a = -125, b=-125,a==b是否为true,这两个解释原因,JVM初始化Integer和Long时,在常量池中预置了[-128,127]这些整数对应的应用,这个范围以外的值都需要重新创建对象,每次new出来的对象引用自然不一样)
保证线程可见性(也就是共享访问的变量如何确保可见性,当然是使用volatile关键字修饰啦)
volatile变量是否线程安全(分情况讨论,指令原子性操作能保证线程安全,多个操作就无法保证)
synchronized关键字如何保证线程安全(又是源码~~~,每个线程进入synchronized代码块,会先尝试获取一下锁,如果获取获取不到,就会进入阻塞队列,所有在阻塞队列中的线程,有资格竞争锁的线程会被迁移到竞争队列中,然后竞争队列的队头线程会被放到Ondeck线程中,也就是有资格竞争所的位置,JVM把竞争所的资格交给了Ondeck线程,但是这样会造成一个问题,就是每个线程在排队之前,都会拥有竞争锁的资格,如果新的线程访问synchronized代码块的时候,就可能比Ondeck线程先行一步抢走了锁,导致Ondeck线程的自旋等待,因此synchronized是一个不公平的锁,但这一种不公平是合理的,也因为JVM不需要把锁直接交给Ondeck线程而仅仅是锁的竞争资格,可以提高它自身的运行效率)
4.操作系统
线程切换和进程切换的区别
进程的通信方式
进程的调度算法
内核态和用户态的区别
5.计算机网络
GET和POST的区别
TCP和UDP的区别
TCP确保传输正确的方法
6.数据结构
列举所认识的排序算法、其稳定性和时间复杂度
红黑树与平衡二叉树的区别
寻找有环的链表中环与非环段的交点(当然是快慢指针啦,为了提速,可以用跳表,每次多跳几步,发现跳过头了,就往回找)
7.ssm框架
spring相比servlet开发的优势在哪里(从bean管理方便角度回答了,ioc和aop,不知道对不对)
bean是否线程安全(当时直接说不会,然后就不问spring的内容了,感觉面试官对我这一块有些失望T_T。温知识:spring并不对bean做线程安全的工作,所以肯定不是线程安全的)
8.redis
项目中redis的用途
redis如何保证从内存写回mysql中的正确性,是否每次更新缓存都写回磁盘,加入库存接近了0,有大量访存,怎么保证写回磁盘的数据是准确的。(以前真没考虑过这个问题,脑子一片空白,现在想一下,应该可以用事务吧,延迟写回不代表数据不准确,可能面试官当时想问如何保证库存量不为0,然后另一个问题是问redis的写回策略,我理解出错了,当时以为不是事务)
9.mysql
数据库的隔离级别,以及mysql默认的数据库隔离级别
索引的实现原理(B+树,不小心脱口而出红黑树,也是致命一击,非叶子结点存储索引,叶子结点存储数据。面试结束之后才想起来当时口误了)
sql注入是什么,如何防范(当时问的是ssm框架怎么做,回答mybatis使用#{}占位符而不是拼接符${})
10.算法题
在一个数组中,时间复杂度O(n)找出左边比右边大的最大值,比如a[] = {1,3,7,5,2,9,8},左边选出7,右边选2,他们差值最大,为5。(算法题没做出来,应该是最致命的吧)
全部评论
(4) 回帖