欢迎来到知了堂!
知了堂-电话号码 028-87058185

蘑菇街校招Java面试题总结及答案-知了堂

蘑菇街校招Java面试题总结及答案

         其他系列文章:
        腾讯校招Java面试题总结及答案
        阿里巴巴校招Java面试题总结及答案
        微店校招Java面试题总结及答案

  1.Mysql和mongodb索引原理(说一下B+tree和B-tree区别,为什么一个用b+一个用b-,为什么索引用btree不用平衡二叉树)mysql两种存储引擎

  B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。

  这就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据。

  从Mysql(Inoodb)的角度来看,B+树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。

  那么Mysql如何衡量查询效率呢?磁盘IO次数,B-树(B类树)的特定就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数,当查询数据的时候,最好的情况就是很快找到目标索引,然后读取数据,使用B+树就能很好的完成这个目的,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时啊!),而B+树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。这是优点之一。

  另一个优点是什么,B+树所有的Data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。

  至于MongoDB为什么使用B-树而不是B+树,可以从它的设计角度来考虑,它并不是传统的关系性数据库,而是以Json格式作为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,上面所述的优点2需求就没那么强烈了,其次Mysql由于使用B+树,数据都在叶节点上,每次查询都需要访问到叶节点,而MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql(但侧面来看Mysql至少平均查询耗时差不多)。

  总体来说,Mysql选用B+树和MongoDB选用B-树还是以自己的需求来选择的。

蘑菇街校招Java面试题总结及答案

 

  2.浮点型为什么不是精确值

  十进制小数部分化二进制,常常化不尽。

  如同无限循环小数,最后有截断误差。

  二进制无法精确表示十进制的十分之一。

  使用BigDecimal来做精确运算

  3.线程池原理,单核操作系统是否应该使用多线程,为什么

  应该,要知道一个作业可不总是CPU密集型的,必然穿插着大量的IO调用在其中。而IO的一个特性就是阻塞等待。这个阻塞等待的时间消耗往往是远远大于线程切换所消耗的时间的,如果你要访问10个url获取接口内容,假如一次http访问平均阻塞时间大概是1s,那么你是一个一个的线性访问快还是10个线程访问快?相信不用算也知道多线程肯定更快。

  最后就可以得出结论,多线程在CPU密集型的作业下的确不能提高性能甚至更浪费时间,但是在IO密集型的作业下则可以提升性能(或者更准确点说叫平均响应时间)。

  4.有1万个左右的脏词,每次发帖要判断帖子里边是否包括有脏词,数据库应该如何设计

  可以建立一个脏词字典表,写好函数判断帖子正文里面是否有脏词。然后再这个帖子正文字段上面建立check 约束。

  
      版权声明:本文来源于网络,由知了堂搜集整理,仅供大家学习Java时使用