字节移动端日常实习二面
23号的字节移动端日常实习二面,当时面完一个多小时就有HR打电话过来约HR面,HR面在下周一,还不知道能不能拿到offer。由于我本来是学习后端的,这个岗位也是支持移动端零基础的同学进去再学的,所以以下的面试题基本没涉及移动端的知识。并且,我面试的时候没有录音,以下都是我面试完之后根据记忆复原的,可能有所遗漏,敬请见谅。
八股
1.自我介绍
没什么可说的,正常流程
2.挑一个项目介绍,并说一下遇到的难题和解决方法
也没什么可说的,还是正常流程
3.输入网址到打开一个页面经历了什么
DNS->TCP三次握手->发起请求->服务器处理请求返回响应->浏览器解析响应并渲染页面,我大致是这样子答,不过会稍微展开
4.有了解浏览器渲染页面的过程吗
这个我这没了解过,就直接说没了解过了
5.TCP和UDP的区别及应用场景
区别的话,我答了以下几个方面
- 是否面向连接:TCP面向连接,UDP无连接
- 是否可靠:TCP提供了可靠数据传输,而UDP不可靠
- 首部开销:TCP在不使用首部可选字段的情况下是首部开销是20字节,UDP首部开销固定为8个字节
- 传输方式:TCP基于字节流,UDP基于报文
应用场景: 首先,TCP实现了可靠传输,但需要做很多复杂控制使得传输速率不如UDP。所以TCP适合一些对数据可靠性比较高的场景,如HTTP、SSH;UDP适合一些对可靠性要求不高,而对实时性要求高的场景,如实时流媒体、视频、音频等。
6.TCP的可靠传输是怎么实现的
序列号、滑动窗口、流量控制、拥塞控制、重传等。
7.关闭TCP连接有多少次挥手
4次挥手
8.为什么不是3次
在第二次挥手和第三次挥手之间,服务器可能还有一些数据需要发送给客户端,所以一般不能把第二次和第三次挥手合并。
9.HTTP和HTTPS的区别
HTTP运行在TCP之上,使用明文传输。HTTPS则在于TCP之间加入了一个TLS层,用来对数据进行加密解密,使用的是密文进行传输,保证了安全性。
10.HTTPS怎么实现安全传输
一开始使用非对称加密交换会话密钥,之后使用会话密钥进行对称加密来传输数据。
11 进程和线程的区别
进程是运行时的程序,是系统进行资源分配的基本单位,一个进程一般包含多个线程。 线程是轻量级的进程,是CPU调度的基本单位,同一个进程下的线程共享该进程的资源。
12.线程间通信的方式
同进程下的线程通信:因为共享了进程资源,可以直接访问进程内存进行通信?(这个我印象有点模糊,可能没答对) 不同进程间的线程通信:这种情况本质上就是进程间通信,可以使用匿名管道、有名管道、消息队列、共享内存、信号、信号量等等。
13.避免多线程冲突有哪些方式?
互斥锁、信号量等等。
14.谈一下你了解的锁
自旋锁、互斥锁、乐观锁、悲观锁等等。
15.谈一下你对封装、继承、多态的理解
封装:隐藏对象内部的数据和成员,不允许外部直接进行访问,但向外部提供了共有接口,外部只能通过公有接口来对对象内部进行访问。 继承:使用在具有亲缘关系的类之间,表示一个类具有另一个类的行为和特征,有利于进行代码复用。 多态:一个对象具有多种状态,可以在不同的角度去看待同一个对象。
16.了解内存泄漏吗?怎么解决?
内存泄漏是指一些已经不会再被访问的内存得不到回收而没办法再次使用,造成了内存的浪费。Java的垃圾回收机制可以一定程度解决内存泄漏。
17.Java垃圾回收的实现机制
将对象分为了新生代和老年代,分别对两种对象采用不同的回收方法。新生代对象大多朝生夕灭,而老年代对象大多会长期存在。堆区中的1/3用于存储新生代对象,一般采用复制算法进行回收,剩下2/3用于存储老年代对象,一般采用标记-清除算法、标记-整理算法进行回收。
18.有哪些方法可以判断一个对象是否应该被回收?
引用计数:记录每个对象的引用次数,但一个对象的引用次数为0,就说明该对象不会再被使用,就可以进行回收。 可达性分析:从Roots开始出发,访问当前对象所持有的引用,并且又访问引用的引用,依次访问,直到把能访问到的对象都访问一遍。能被访问到的对象不需要回收,而那些未被访问到的对象说明不会再被使用,对那些未被访问到的对象进行回收。
19.以上判断对象是否应该被回收的方法有哪些优劣?
引用计数:优点是实现简单,只需要给每个对象加个引用计数器。缺点是不能解决循环引用的问题,即是两个对象相互持有对方的引用,但这两个对象没有被其他对象持有引用,这种情况下这两个对象显然不会再被访问,但又因为相互持有对方引用而不会被收回。 可达性分析:优点是解决了循环引用的问题。缺点是需要一定时间开销。
20.学过C和C++吗,挑一个你熟悉的语言谈一下内存分区
我学过一点点C和C++,不过我当时还是选择老老实实谈了一下Java的运行时数据区,也即是堆区、方法区、程序计数器、虚拟机栈、本地方法栈,并简单说了一下这些分区是干嘛用的。
21.了解过设计模式吗?挑几个你学过的谈一下,并说一下应用场景
我当时大概谈了一下单例模式、建造者模式、工厂模式、模板方法模式,并说了一下应用场景。
算法
1.无重复字符的最长子串(leetcode 3),并分析一下时间复杂度和空间复杂度
有刷过一些算法题的同学应该都对这道题不陌生,直接滑动窗口就可以了。
2.合并N个长度为M的升序数组,并分析一下时间复杂度
这道题的话,我写的时候求点稳,就写了两个两个进行合并的方式。然后面试官问,还有没有其他写法,我就说了用N个指针指向每个数据的当前头元素,每次选择头元素中最小的一个加到新数组,并将对应指针加1。面试官接着问,有没有什么数据结构可以优化这个过程,我答了堆,可以用一个小顶堆维护这N个元素,每次取出堆的头节点加到新数组,并把对应旧数组的后一个元素加入堆。