面试问题浓缩总结 面试问题浓缩总结
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • 3月份面试

    • 第一次面试
      • Vue原理
        • 实例化过程
        • 模板编译过程
        • 虚拟DOM
        • 数据绑定
      • 什么是回调函数
      • 主键,外键,索引,唯一索引
      • 进程线程相关的问题
      • 最短路径问题
      • 指针问题
      • MySQL和MongoDB的区别
      • Go和Java的区别
      • 锁的概念
        • MySQL的几种锁
        • Java的同步锁
    • 第二次面试
    • 福州蓝鲨信息技术(一面)
  • 4月份面试

  • 个人面试
  • 3月份面试
小游
2021-03-22

第一次面试

# Vue原理

# 实例化过程

初始化生命周期,初始化事件,初始化渲染,触发执行beforeCreate生命周期方法,初始化data/props数据监听,触发执行created生命周期方法。

对应到生命周期示例图,created方法执行结束,接下来判断是否传入挂载的el节点,如果传入的话此时就会通过$mount函数把组件挂载到DOM上面,整个vue构造函数就执行完成了。以上是vue对象创建的基本流程。

# 模板编译过程

挂载的$mount函数,此函数的实现与运行环境有关,在此只看web中的实现。

实现只有简单的两行,

1、判断运行环境为浏览器,

2、调用工具方法查找到el对应的DOM节点,

3、mountComponent方法来实现挂载,

这里就涉及到了挂载之前的处理问题。

1、对于拥有render(JSX)函数的情况,组件可以直接挂载,

2、如果使用的是template,需要从中提取AST渲染方法(注意如果使用构建工具,最终会为我们编译成render(JSX)形式,所以无需担心性能问题),AST即抽象语法树,它是对真实DOM结构的映射,可执行,可编译,能够把每个节点部分都编译成vnode,组成一个有对应层次结构的vnode对象。

有了渲染方法,下一步就是更新DOM,注意并不是直接更新,而是通过vnode,于是涉及到了一个非常重要的概念。

# 虚拟DOM

虚拟DOM技术是一个很流行的东西,现代前端开发框架vue和react都是基于虚拟DOM来实现的。

虚拟DOM技术是为了解决一个很重要的问题:浏览器进行DOM操作会带来较大的开销。

1、要知道js本身运行速度是很快的,

2、而js对象又可以很准确地描述出类似DOM的树形结构,

通过使用js描述出一个假的DOM结构,每次数据变化时候,在假的DOM上分析数据变化前后结构差别,找出这个最小差别并且在真实DOM上只更新这个最小的变化内容,这样就极大程度上降低了对DOM的操作带来的性能开销。

上面的假的DOM结构就是虚拟DOM,比对的算法成为diff算法,这是实现虚拟DOM技术的关键。

1、在vue初始化时,首先用JS对象描述出DOM树的结构,

2、用这个描述树去构建真实DOM,并实际展现到页面中,

3、一旦有数据状态变更,需要重新构建一个新的JS的DOM树,

4、对比两棵树差别,找出最小更新内容,

5、并将最小差异内容更新到真实DOM上。

有了虚拟DOM,下面一个问题就是,什么时候会触发更新,接下来要介绍的,就是vue中最具特色的功能--数据响应系统及实现。

# 数据绑定

vue.js的作者尤雨溪老师在知乎上一个回答中提到过自己创作vue的过程,最初就是尝试实现一个类似angular1的东西,发现里面对于数据处理非常不优雅,于是创造性的尝试利用ES5中的Object.defineProperty来实现数据绑定,于是就有了最初的vue。vue中响应式的数据处理方式是一项很有价值的东西。

vue官网上面其实有具体介绍,下面是一张官方图片:

vue响应

响应实现的基本原理:

1、vue会遍历此data中对象所有的属性,

2、并使用Object.defineProperty把这些属性全部转为getter/setter,

3、而每个组件实例都有watcher对象,

4、它会在组件渲染的过程中把属性记录为依赖,

5、之后当依赖项的 setter被调用时,会通知watcher重新计算,从而致使它关联的组件得以更新。

为什么vue不能在IE8以下运行?

因为IE8不支持ES5,所以用不了Object.defineProperty方法,又因为Object.defineProperty无法shim,所以vue不支持IE8及以下不支持ES5的浏览器。

# 什么是回调函数

回调函数(callback)是什么? - 知乎 (zhihu.com) (opens new window)

引用stack overflow 上大神的描述 其实callback 很简单也很纯粹 A "callback" is any function that is called by another function which takes the first function as a parameter. (在一个函数中调用另外一个函数就是callback)

function callback() {
    alert("I am in the callback!");
}

function work(func) {
    alert("I am calling the callback!");
    func(); 
}

work(callback);
1
2
3
4
5
6
7
8
9
10

然后来说一下callback 经常的使用场景

A lot of the time, a "callback" is a function that is called when *something* happens. That *something* can be called an "event" in programmer-speak.(很多时候 callback 都是用来执行事件驱动的任务 比如有货了通知我 | 你到家了再叫我做饭 等等之类的 )

# 主键,外键,索引,唯一索引

主键(primary key) 能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。

外键(foreign key) 是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。

索引(index) 是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度, 按一定的规则创建的,一般起到排序作用。所谓唯一性索引,这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。

总结:

主键一定是唯一性索引,唯一性索引并不一定就是主键。

一个表中可以有多个唯一性索引,但只能有一个主键。

主键列不允许空值,而唯一性索引列允许空值。

主键可以被其他字段作外键引用,而索引不能作为外键引用。

# 进程线程相关的问题

参考操作系统进程和线程 | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)

# 最短路径问题

有下面几个算法

  1. 深度或广度优先搜索算法(解决单源最短路径)
  2. 弗洛伊德算法(解决多源最短路径):时间复杂度O(n^3),空间复杂度O(n^2)
  3. 迪杰斯特拉算法(解决单源最短路径)
  4. Bellman-Ford算法(解决负权边,解决单源最短路径,前几种方法不能求含负权边的图)::时间复杂度O(nm),空间复杂度O(m)

# 指针问题

参考:

# MySQL和MongoDB的区别

  1. MySQL是关系型数据库,MongoDB是非关系型的
  2. MongoDB采用虚拟内存+持久化来存储数据,MySQL不同的引擎存储方式不同
  3. MySQL使用的是传统的SQL语句,MongoDB使用的是独特的MongoDB查询
  4. MongoDB基于内存,把热数据存储在内存中,达到高速读写。而MySQL不同的引擎有不同的特点
  5. MongoDB是新兴的数据库成熟度较低。MySQL有成熟的体系,成熟度较高
  6. MongoDB采用json存储方式,非常适合文档格式的存储与查询
  7. MySQL海量数据处理效率比较低
  8. MongoDB事务支持较弱,开发文档不够完善

# Go和Java的区别

  1. Go,也称为Golang,是一种编程语言。作为一种用于编程的开源语言,Go使构建可靠,简单和高效的软件变得更加容易。Go利用goroutines代替了线程,它可以通过多核并发计算能大幅度提高程序的性能,但是Golang的协程如果使用不当反而会成为影响程序执行的瓶颈,它的各种浪费特性使Go变得非常突出。
  2. Java是一种通用的计算机编程语言,它是基于类,并发和面向对象的。Java经过专门设计,只包含很少的实现依赖项。Java应用程序在JVM(Java虚拟机)上运行,它是当今最著名的编程语言之一,Java是一种用于为多种平台开发软件的编程语言。
  3. Java中没有原始的无符号数字类型,这就是Java不适合进行底层编程的原因。
  4. Go提供垃圾回收,但是像Java一样,它不支持完整的GC。
  5. Go上不允许函数重载,必须具有方法和函数的唯一名称。java允许函数重载。
  6. Go不使用异常来显示运行时和寿命终止之类的事件,而是使用错误来显示此类事件。
  7. go的速度比java快
  8. Java默认允许多态。而Go没有。
  9. Go语言使用HTTP协议进行路由配置;而java使用Akka.routing.ConsistentHashingRouter和Akka.routing.ScatterGatherFirstCompletedRouter进行路由配置。
  10. Go代码可以自动扩展到多个核心;而Java并不总是具有足够的可扩展性。
  11. Go语言的继承通过匿名组合完成:基类以Struct的方式定义,子类只需要把基类作为成员放在子类的定义中,支持多继承。而Java只此次单继承

# 锁的概念

# MySQL的几种锁

  1. mysql的读锁和写锁(共享锁和排它锁)
  2. 意向锁
  3. 乐观锁和悲观锁

详细参考:事务和锁 | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)

# Java的同步锁

编辑 (opens new window)
上次更新: 2021/03/24, 22:08:13
第二次面试

第二次面试→

Theme by Vdoing | Copyright © 2021-2021 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式