腾讯移动端一面总结

因为没有录音,都是面完回想起来的,整理的有点乱~~~~
1. 谈谈你学习过的架构模式 MVC MVP MVVM(对MVVM模式不太熟悉)
MVVM可以算是MVP的升级版,其中的VM是ViewModel的缩写,ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力
2. 一个Union类型,共有一个int类型、Float、Double类型的字段,请问在32位的CPU创建时需要占用多少字节?
union的长度取决于其中的长度最大的那个成员变量的长度。即union中成员变量是重叠摆放的,其开始地址相同。
3. Union和Struct的区别
结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。
4. 谈谈你所了解的C语言的内存管理
对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text)、数据段(.data)、静态区(.BSS)、堆和栈组成。
  • BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量
  • 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量和静态变量的一块内存区域
  • 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。
  • 栈区:由系统自动分配,栈区的分配运算内置于处理器的指令集,当函数执行结束时由系统自动释放。存放局部变量。栈的缺点是:容量有限,当相应的区间被释放时,局部变量不可再使用。栈是一块连续的区域,向高地址扩展,栈顶和容量是事先约定好的。
  • 堆区:在程序的执行过程中才能分配,由程序员决定,编译器在编译时无法为他们分配空间,只有在程序运行时分配,所以被称为动态分配。堆是不连续的区域,向高地址扩展。由于系统用链表来描述空闲的地址空间,链表的遍历是由地地址向高地址的,故堆区是不连续的动态的存储空间
5. 说说你了解的程序设计模式,知道多少说多少(有23种,只说了几种。。)
  • 单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
  • 工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
  • 模板方法模式:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 代理模式:为其他对象提供一种代理以控制对这个对象的访问。
  • 装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
  • 适配器模式:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
  • 迭代器模式:它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节
  • 观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
  • 访问者模式:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作
6. 说说TCP和UDP的区别,你认为QQ的实现是使用TCP还是UDP?
TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。 TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。
UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击…… UDP的缺点: 不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。 基于上面的优缺点,那么: 什么时候应该使用TCP: 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输,什么时候应该使用UDP: 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP
7. 谈谈你了解的C语言的编译过程
腾讯移动端一面总结
文章图片

  • 预处理:主要是做一些代码文本的替换工作
  • 编译:把预处理完的文件进行一系列词法分析(lex)、语法分析(yacc)、语义分析及优化后生成汇编代码,这个过程是程序构建的核心部分。
  • 汇编:汇编代码->机器指令
  • 链接:静态链接。多个目标文件、库->最终的可执行文件(拼合的过程)
8 . 进程和线程的区别
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源
9. 谈谈你对Viper架构模式的了解
Viper是IOS开发使用的架构,问所未闻,gg了~~~~
传统的MVC架构中,我们都知道,其Controller(控制器)层接纳了太多的任务,当开发不断进行,其内部的业务逻辑逐渐积累,最后则会变得臃肿不堪,不便于后期的调试测试以及多人协助,所以,我们需要寻找减轻Controller层负担的方法,而VIPER架构其实是将Controller再细分成三层,分别是ViewInteractorPresenter,已达到减轻Controller层负担的作用。
10. Fiddler的工作原理解释一下
转载 Fiddler在浏览器与服务器之间建立一个代理服务器,Fiddler工作于七层中的应用层,能够捕获通过的HTTP(S)请求。Fiddler启动后会自动将代理服务器设置成本机,默认端口为8888。Fiddler不仅能记录PC上浏览器的网络请求数据,还可以记录同一网络中的其他设备的HTTP(S)请求数据。数据传递流程大致如下:
腾讯移动端一面总结
文章图片

1) 客户端像WEB服务器发送HTTP(S)请求时,请求会先经过代理Fiddler代理服务器。
2) Fiddler代理服务器截取客户端的请求报文,再转发到WEB服务器,转发之前可以做一些请求报文参数修改的操作。
3) WEB服务器处理完请求以后返回响应报文,Fiddler代理服务器会截取WEB服务器的响应报文。
4) Fiddler处理完响应报文后再返回给客户端。
11. 死锁产生的原因以及解决办法
死锁指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程将永远不能再向前进。处理死锁的方法有预防死锁、避免死锁、检测死锁、解除死锁。
产生死锁的必要条件:
  • 互斥条件:请求的资源为临界资源
  • 请求和保持条件:申请新资源,保持旧资源
  • 不剥夺条件:已获得的资源,在使用完之前,不被外力剥夺
  • 环路等待条件:互相等待资源
死锁的预防:
  • 摒弃“请求和保持条件,一次将资源全部分配
  • 摒弃“不剥夺条件”,当请求的资源得不到满足时,释放已分配的资源
  • 摒弃“环路等待条件”,对申请资源必须按照一定的顺序进行
12. 进程的调度算法有哪些,分别解释一下?
  • 先来先服务调度算法
  • 短作业优先算法
  • 高相应比优先调度算法
  • 最高优先权调度算法
  • 时间片轮转调度算法
  • 多级队列调度算法
  • 多级反馈队列调度算法
13. Android程序共享数据的方式有哪些?
一下子想不起来,我回答的是跨进程数据的方式。如SharedPreferences,ContentProvider那些
14. Android的性能优化
  • 布局优化:减少嵌套、使用复用布局、加载一些不常用的布局、标签减少布局的嵌套层次
  • 内存优化:珍惜Services资源、懒加载、避免浪费、避免内存泄漏等等
15. Handler和HandlerThread的区别
【腾讯移动端一面总结】我就说了HandlerThread会自动管理Looper,能够实现子线程和子线程的通信
16. 八皇后问题了解过吗?具体怎么实现的?
只知道用回溯法,具体实现细节忘记了~~~~
17. 解释一下异步编程,说说它的应用
这个没有深入的了解,回答得不好
18. Android应用的启动过程
能记住的大概就是这些了,只能说自己基础实在有点差,以前学过的东西都忘得七七八八了,接下来得恶补基础了。

    推荐阅读