问:能不能讲一下Java集合,List、Set、Map

答:Set不允许存在相同的元素,而List可以存在;Map则是采用hash的方式进行存储,有K和V对元素进行记录。

问:Group by的实现原理是什么。

答:松散索引,紧凑索引,临时文件(文件排序);

问:数据库联合索引的原则是什么一回事

答:最左匹配的原则吧,例如a,b,c是当前的索引,那么在查询a和a,b也会使用到索引;

问:能不能说一下IOC

答:IOC指的是依赖倒转,意思是不再由程序员来管理对象的创建和销毁,转而由Spring框架来管理对象的销毁和创建,编程时只需要考虑调用该对象,或者修改该对象的值。

问:Java GC收集算法说一下

答:收集算法有标记清除、标记整理、复制算法、分代回收算法;标记清除指的是对内存中的对象进行标记然后依次清除;标记整理则进一步,将标记的对象清理后,再对内存进行碎片收集。复制算法,则是将需要保留的对象拷贝到一个新的内存中,并对原内存进行清理;分代收集算法则将内存对象分为新生代和老年代,对新生代采用复制算法,对老年代采用标记清除和标记整理算法。在每一次清理时,都会计算一次对象的计数值,在对象的计数值到达15后,就将对象从新生区再移动到老年区;

问:手撕算法 如果有一个链表,如何找到后200位数字

答:双指针,pre指针先移动200位,再在表头设置一个新的指针aft,两者一同遍历直到末尾。这时候,aft指针就可以遍历出最后200位数字了。

问:了解Redis吗?

答:Redis是一个NoSQL非关系型数据库,在开发中常用作缓存。其可以对其上数据进行持久化,采用RDB持久化和AOF持久化保存到数据库中。其中,RDB持久化就是保存数据。而AOF持久化则是保存用户对数据的操作。

问:进程间的通信方式?

答:管道,命名管道,消息队列和信号量,共享内存;其***享内存的传递消息的效率是最高的。因为消息队列,FIFO,管道的消息传递方式一般为 :
1).服务器获取输入的信息;
2).通过管道,消息队列等写入数据至内存中,通常需要将该数据拷贝到内核中;
3).客户从内核中将数据拷贝到自己的客户端进程中;
4).然后再从进程中拷贝到输出文件;
上述过程通常要经过4次拷贝,才能完成文件的传递。
而共享内存只需要:
1).输入内容到共享内存区
2).从共享内存输出到文件
上述过程不涉及到内核的拷贝,这些进程间数据的传递就不再通过执行任何进入内核的系统调用来传递彼此的数据,节省了时间,所以共享内存是这五种进程间通信方式中效率最高的。

问:共享内存的实现方式?信号量是怎么实现的?他们的使用场景。

答:共享内存是一种高效的IPC机制。共享内存的核心就是将一片物理内存映射到用户进程的虚拟地址空间。将物理内存作为共享内存的方法有两种:一种就是不关心物理内存的地址,直接调用shmget接口创建共享内存,shmat接口映射共享内存到进程的虚拟地址空间。另一种就是通过mmap将/dev/mem映射出来;信号量是指对互斥资源的标识,通过判断互斥资源的数量来进行进程间的通信。共享内存的使用场合是

问:数据库的四大隔离级别,怎么解决幻读的?

答:未提交读,已提交读,可重复读,可序列化;可以采用MVCC解决幻读,即考虑数据修改时候的版本号。以及加锁,即Gap锁。

问:MVCC是什么东西?Gap锁是什么,怎么实现的?

答:MVCC指的是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo日志 ,Read View。gap锁即间隙锁实质上是对索引前后的间隙上锁,不对索引本身上锁。根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,向右寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。间隙锁的目的是为了防止幻读,其主要通过两个方面实现这个目的:
(1)防止间隙内有新数据被插入。
(2)防止已存在的数据,更新成间隙内的数

问:你说到了GC root,里面都有包含什么东西。

答:虚拟机栈(栈桢中的本地变量表)中的引用的对象 、方法区中的类静态属性引用的对象 、方法区中的常量引用的对象 、本地方法栈中JNI的引用的对象

问:你读过Spring AOP的源码吗,你讲一下Spring是怎么使用Cglib实现AOP的?

答:篇幅原因,不便展开,建议参考 “深入理解CGLIB动态代理机制”

参考资料:
后端开发实习面经
共享内存不同实现方式