这是今天的第三面,也是最后一面。给一下前两面的传送门吧!
这次应该是一个leader面试我,气场就不一样。
上来先来个自我介绍,我一直以为这个是HR面,就很轻松的说了一下自己,他也很轻松,和我聊了一些实习城市的选择这些问题,直到他突然一句话:
先来做个题吧!
听到这句话我感觉有人浇了我一盆冷水啊,我一直以为这是HR面试,心情很放松的,这一句话一下就让我紧张起来了。
1.题目要求:现在有个完全二叉树,请你用 ‘之’ 字形遍历它
解题思路:用层序遍历的方式在两个队列之间遍历树,填充第一个队列的方式是从左到右,填充第二个队列的方式是从右到左。
这个题应该还有别的解题思路,大家自行上网搜索吧,我这个方法比较笨。
2.进程的通信方式
管道,共享内存。。。。不会X3。
3.进程,线程,协程的区别
进程是操作系统资源分配的单元,每个操作系统有多个进程,进程间的资源不共享。线程是操作系统的执行单元,每个进程有多个线程,每个进程至少有一个线程在执行。多个线程可以同时运行,可以共享进程内的资源。协程是线程内的一个内部的一个小单元,可以称他为轻量级线程,每个线程内可有多个协程。协程最大的优点就是他完全由应用程序控制,线程与进程的切换需要从操作系统用户态切换到内核态进行,效率不高。而协程在用户态即可操作,程序可以自行让协程暂停或运行,在一些高并发和资源争夺激烈的地方使用协程可以有效的减少线程阻塞唤醒带来的开销。
4.了解Java的数据结构吗,HashMap和LinkedList这些
了解.....HashMap问了三遍,可以去一面面经中查看
5.说说volatile关键字吧
被volatile关键字标记的变量在赋值和取值时的操作具有原子性特征,在JDK5中volatile关键字的语义被加强,使得被volatile关键字标记的变量在存取时具有了Java获取锁和释放锁的语言。
Java的内存模型大体是有一个共享内存,然后每个线程又有他的一个独享内存,在Java操作锁时,释放锁的过程会把独享内存中存放的共享变量的值刷新到共享内存中。volatile关键字在语义被加强之后也具有了类似的功能,在写volatile标记的变量值时,会直接把该变量的最新值和独享内存中的共享变量值都刷新到共享内存中。并且在Java内存模型语义happen-before的约束下,volatile关键字标记的变量的写与读操作不能被JVM虚拟机或cpu重排序,这就保证了每次读操作都发生在写之后,可以读到最新的值。
因为volatile关键字的增强,现在JDK的并发包中很多地方都使用volatile关键字加CAS操作来替换传统的阻塞来达到线程同步的目的。例如重入锁中的关键变量state就是一个被volatile关键字标记的int型变量,如果有线程访问临界区代码,就通过CAS操作把state的值进行修改,其他线程则使用循环CAS去等待state的值复原,也就是之前的进程从临界区代码中走出,释放锁。
6.平时对一些开源项目有了解吗?
对mysql数据库比较了解,因为项目中使用了它,因此当时就去了解了很多mysql底层的原理。
7.索引用过吗?说说吧
用过,说到索引,要从mysql的执行引擎说起。根据不同的引擎索引有不同的实现,常用的实现有B树、B+树和Hash表实现。我使用的InnoDB引擎,因为它具有更小的锁粒度,并且数据和索引的使用方式也有所不同,myisam把一张表分为三个部分存储,分别是表的定义部分,表的数据部分和表的索引部分。而InnoDB引擎则是一张表都存储在一个依据主键生成的聚簇索引中,即存储在一个B+树中,B+树一大特性就是只在叶子节点上保存值,非叶子节点保存叶子节点的边缘值以便查询。InnoDB存储数据的聚簇索引的叶子节点上存储的是每一条记录的信息,因此通常这个大聚簇索引被称为一级索引,其他方式建立的索引都被称为二级索引,这些索引也是存储在一棵B+树上,然后叶子节点上存放着主键的值。我们在通过索引检索数据时,通常会发生两次遍历树的操作,第一次是在二级索引上找到主键的值,第二次是在大的聚簇索引上通过主键找到具体的数据。
8.有什么想问我的吗?
我:请问面试官在咱们公司中Java语言运用的多吗?
面试官:Java语言大多用在大数据方面,后端也有一些但是并不多。
我:好的,谢谢
小结
这是一天之中的第三面,第三面感觉自己回答的不是很好,有点担心。这三次面试我发现自己操作系统和计算机网络简直弱的一笔,现在在恶补中。