大家好,我是程序员王不错,**************发现更多分享,开启你的技术进阶之路!
今天为大家分享的是不错在今年24届秋招面试字节跳动抖音直播的后端开发岗位的校招面经。在分享题目的同时,我也将根据查找到的资料整理出答案,方便大家快速学习。
1. 首先还是千年不变的自我介绍环节。
自我介绍阶段仍然是交代清楚自己的基本信息、项目经历、实习经历等。
2. 接下来是针对项目的提问,这里只总结通用问题。
(1)cookie和session是什么,有什么区别?
cookie:
cookie和session用来进行身份验证以及跟踪会话(通过身份确定是否是同一用户的同一会话请求)。
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
Cookie是保存在客户端的一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
session:
客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象就是session。session把这次请求的用户信息记录在服务端的。这种存储方式相对cookie来说更安全。
session需要和cookie搭配使用来判断是否是同一个会话。
server第一次收到请求,开辟session空间,生成一个session-ID,并通过响应头“set-cookie”向客户端发送要求设置cookie的响应。
client接收到响应后,在本地客户端设置了一个cookie消息,cookie过期时间为浏览器会话结束。
client每次向同一个server发送请求时,请求头中都包含一个cookie信息,Server从中得到session-ID。
session过期要被删除,防止过多占用服务器资源。
(2)用户登录的流程。
在登录页面中,用户输入账号、密码等相关信息,以POST形式将请求发送给服务器。(可以详细说一下请求包经过七层网络发送到服务器的过程)
经过前端验证,如验证账号密码是否合法。
前端验证不通过的话,用户会收到提示,不需要发送请求给后端。
验证通过,服务器会向后端发送请求,验证用户是否存在以及密码是否正确。
如果用户不存在或密码不正确,服务器会返回相应的错误提示给前端。
如果用户存在且密码正确,服务器会返回登录成功的信息给前端,并携带用户的相关信息。
前端接收到服务器返回的信息后,将用户的登录状态保存在本地或者存储在Cookie中,以便后续的页面访问可以使用已保存的用户信息。
(3)向服务器发送登录请求后,服务器做了哪些工作?
首先服务器拿到用户的用户名和密码,与数据库中的进行比对;
比对成功之后,会给客户端一个cookie(设置一个响应头),客户端拿到这个响应头之后自动将cookie存在本地,下次在访问这个页面时,会自动带有本地的全部cookie信息,服务器拿到这个请求头的cookie信息,验证通过后将数据返回给用户;
当然,服务器还会设置一个过期时间,比方说10分钟,当客户端10分钟没有访问服务器,则需要重新登录。
3. hashmap是怎么实现的?
HashMap是基于哈希表的Map接口的实现,其底层数据结构是数组和链表的结合体。在HashMap中,每个元素都是一个键值对(key-value pair),称为一个Entry。每个Entry都有一个键和一个值,以及指向下一个Entry的引用。
HashMap的实现主要包括以下几个部分:
1)数组部分:HashMap底层是一个数组结构,数组的每个元素都是一个Entry对象。数组的大小在初始化时确定,并且在运行时可以动态调整。
2)哈希函数:每个Entry都有一个哈希值,用于确定该元素在数组中的位置。HashMap使用哈希函数将键转换成数组的索引位置,从而实现O(1)的平均查找时间复杂度。
3)链表部分:当两个或多个Entry具有相同的哈希值时,它们会在数组中形成链表。在这种情况下,HashMap通过链表解决键冲突的问题。
4)扩容机制:当HashMap中的元素数量超过了一定的阈值(默认是8)时,会进行扩容操作。扩容时,HashMap会创建一个新的数组,大小通常是原数组大小的2倍,并将所有元素重新哈希到新数组中。
5)迭代器机制:HashMap提供了用于遍历集合的迭代器(Iterator)方法。迭代器按照元素的插入顺序或访问顺序进行遍历。
4. 假如有一个8G的程序,但是只有4G的内存,程序可以运行吗?
内存只有4G无法一次性读入8G文件,需要分批读入数据且记录每次读入数据的位置。分批每次读取数据的大小,太小的话会在读取操作花费过多时间。
5. 虚拟内存是什么?
虚拟内存是一个由存放在磁盘中的N个连续的字节大小的单元组成的数组,每个字节都有唯一的虚拟地址,作为数组的索引。磁盘上数组的内容被缓存到主存中。
虚拟内存会被分割成块,每一块称为虚拟页;物理内存也会被分割为与虚拟页大小相等的块,称为物理页,也叫页帧。
6. 说说你知道的页面置换算法?
(1)最优替换策略:替换内存中最远将来才会被访问到的页
a. 优点:缓存未命中率最低
b. 缺点:需要预测未来,无法实现,但可以用来衡量其他置换算法。
(2)先进先出替换策略(FIFO,First In First Out)
先进先出调度算法是根据页面进入内存的时间先后选择调度页面,该算法实现时需要将页面按照进入的时间先后组成一个队列,每次优先淘汰队首页面。
a. 优点:比较容易实现,能够利用主存储器中页面调度情况的历史信息,
b. 缺点:没有反映程序的局部性,因为最先调入主存的页面,很可能也是经常要使用的页面。
(3)随机策略:随机选择一个页进行替换
(4)最不经常使用策略(LFU, Least Frequently Used)
淘汰一定时期内被访问次数最少的页面,LFU关键是看一定时间段内页面被使用的频率。
(5)最少最近使用(LRU,Least Recently Used)
首先淘汰最长时间未被使用的页面,LRU关键是看页面最后一次被使用到发生调度的时间长短。
7. LRU的底层是怎么实现的?
数据结构:哈希链表
在哈希链表中,key 和 value 具有固定的排列顺序,就像双向链表一样,每一个键值对都有一个前驱,一个后驱。
如果访问一个数据,首先查看哈希链表中是否存在,如果存在则把它删除,然后添加到哈希链表的尾部,如果要查找的元素不存在哈希链表中,则进行数据库的查询,然后添加到哈希链表的尾部,这样一来,最近最少使用的数据就在哈希链表的头部了,然后就可以直接删除了。
8. SQL里面的内连接和外连接是什么,有什么区别?
内连接(INNER JOIN):
当两个表的指定列有匹配的值时,内连接会返回这两个表的行。
如果某个表的某行在另一个表中没有匹配的行,那么该行不会出现在结果集中。
外连接(OUTER JOIN):
外连接包括两种类型:左外连接(LEFT JOIN 或 LEFT OUTER JOIN)和右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN)。
左外连接(LEFT JOIN 或 LEFT OUTER JOIN): 返回左表中的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则结果集中对应的列将包含NULL值。
右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN): 与左外连接相反,返回右表中的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则结果集中对应的列将包含NULL值。
区别:
内连接只返回两个表中具有匹配值的行。如果某个表的某行在另一个表中没有匹配的行,那么该行不会出现在结果集中。
外连接会返回左表或右表中的所有行,即使在另一个表中没有匹配的行。未匹配的列将包含NULL值。
9. SQL注入是什么,怎么避免?
SQL注入是一种注入攻击手段,通过将恶意的字符串拼接到SQL中进行数据库查询,使攻击者能够控制Web应用程序后台的数据库服务器。一般SQL注入是通过在代码里通过拼接字符串执行SQL语句导致的。
如:用户登录场景,要执行的语句是:SELECT * FROM userinfo WHERE username ='"+username+"'AND password ='"+password"'
假如用户在输入框输入随意的username和password,后面加上"or 1 = 1",
因为1=1永远是对的,就可以查询出数据表中所有数据了。
防止SQL注入的最有效方法是使用参数化查询:参数化查询可以确保用户输入被当作数据而不是SQL代码处理。大多数现代编程语言和数据库框架都支持参数化查询。
10. Go的多态是什么?
多态是指代码可以根据类型的具体实现采取不同行为的能力。这种多态性是通过接口和类型实现来实现的。
在Go中,接口是一种类型,它定义了一组方法的集合。一个类型如果实现了某个接口的所有方法,那么该类型就被认为实现了该接口。通过接口,可以实现多态性。
11. 数据库索引是什么,如何实现的,为什么用索引更加高效?
数据库索引是一种数据结构,用于快速检索数据库表中的数据。类似于书的目录,可以帮助数据库系统快速定位到所需的数据,而不需要逐行扫描整个表。
索引的实现方式中最常见的是B+树。在B+树中,所有的键值都存储在叶子节点上,并且叶子节点之间通过指针相互连接,形成一个链表结构,方便顺序访问。
通过索引,数据库系统可以快速定位到所需的数据,避免了对整个表的逐行扫描,从而大大提高了查询效率。
12. 算法题
字符串减法(大数相减)
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的差。
注意:
num1 和num2 都只会包含数字 0-9
num1 和num2 都不包含任何前导零
你不能使用任何內建 BigInteger 库
最后是反问环节。
我是程序员王不错,**************发现更多分享,开启你的技术进阶之路!
#校招##秋招##字节##面经#