多益网络的面经【面试准备】
多益网络的面经【面试准备】
前言
2023-9-4 19:19:31
私密发布于
2023-11-15 21:11:01
公开发布于
2024-5-21 13:16:43
以下内容源自《【面试准备】》
仅供学习交流使用
版权
禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://blog.csdn.net/qq_51625007
禁止其他平台发布时删除以上此话
多益网络的面经
【多益网络】专业面试
总时长:40分钟左右,项目10分钟,八股20分钟,做题10分钟
自我介绍
项目相关(10分钟)
深拷贝和浅拷贝的区别
浅拷贝:只能拷贝地址指针,快捷方式
深拷贝:会重新创建副本,复制
Java中对于线程的控制方法有哪些?
Thread中的方法
sleep yield
在Java中,对于线程的控制方法有以下几种:
-
start():启动线程,使其进入就绪状态并执行run()方法。
-
run():定义线程的执行逻辑,需要在自定义的Thread类中重写。
-
sleep(long millis):使当前线程进入休眠状态,暂停执行一段时间,单位为毫秒。
-
yield():让出当前线程的执行权限,使得其他具有相同优先级的线程有机会执行。
-
join():等待线程执行完毕,将线程合并到当前线程中。
-
interrupt():中断线程,给线程发送中断信号,但不会立即停止线程,需要在线程中判断中断信号并做相应处理。
-
isAlive():判断线程是否还活着,即线程是否处于活动状态。
-
setDaemon(boolean on):将线程设置为守护线程,当所有非守护线程结束时,守护线程会自动结束。
-
stop():强制停止线程,不推荐使用,因为该方法可能导致线程无法释放资源。
-
suspend():暂停线程的执行,不推荐使用,因为该方法容易导致线程死锁。
-
resume():恢复线程的执行,不推荐使用,因为该方法容易导致线程死锁。
这些方法提供了对线程的不同控制方式,可以根据具体的需求选择适当的方法来控制线程的执行。
线程休眠(sleep)和线程让步(yield)的区别?
sleep,不会让出CPU
yield,会让出CPU
JVM常见OOM异常有哪些?
除了程序计数器都会发生OOM
JVM堆溢出
JVM栈溢出 本地方法栈溢出
方法区移除
继承有什么作用?
代码重用
扩展功能
MySQL读取数据的方式有哪些?
MySQL读取数据的方式有以下几种:
-
使用SELECT语句:SELECT语句是最常用的读取数据的方式。可以指定要查询的表、字段和条件,以及排序方式和限制返回的结果数量。
-
使用JOIN操作:JOIN操作可以将多个表连接在一起,根据指定的关联条件读取相关数据。可以使用INNER JOIN、LEFT JOIN、RIGHT JOIN等不同类型的JOIN操作。
-
使用子查询:子查询是一个嵌套在主查询中的查询语句,用于获取一部分数据作为主查询的条件或结果。可以在SELECT语句、FROM语句、WHERE语句等位置使用子查询。
-
使用视图:视图是一个虚拟的表,它基于一个或多个表的查询结果。可以将复杂的查询逻辑封装在视图中,然后通过查询视图来读取数据。
-
使用存储过程和函数:存储过程和函数是一组预编译的SQL语句,可以接受参数并返回结果。可以在存储过程或函数中执行查询语句,然后通过调用存储过程或函数来读取数据。
这些方式可以根据具体的需求和场景选择合适的方法来读取MySQL数据库中的数据。
limit函数会带来什么问题?
使用LIMIT函数可以限制查询结果的数量,从而提高查询性能和减少网络传输的数据量。然而,使用LIMIT函数可能会导致以下问题:
-
不准确的结果:如果使用LIMIT函数限制结果数量,可能会错过某些符合条件的数据。特别是在多次查询中使用LIMIT函数时,每次查询结果都可能不同,可能导致不一致的数据展示。
-
高内存消耗:当使用LIMIT函数获取大量数据时,MySQL数据库会将所有满足条件的数据加载到内存中,然后再返回指定数量的结果。如果查询结果数据量很大,可能会占用大量的内存资源,导致性能下降或内存溢出。
-
性能问题:当使用LIMIT函数查询大量数据时,MySQL数据库需要扫描和排序整个结果集,以找到满足LIMIT条件的结果。这可能会导致较高的查询时间和资源消耗,特别是当没有合适的索引支持时。
-
分页问题:使用LIMIT函数进行分页查询时,如果数据量很大,可能会导致分页效果不佳,因为MySQL数据库需要每次重新计算OFFSET和LIMIT,查询速度可能会随着OFFSET的增加而变慢。
要解决这些问题,可以考虑使用更精确的查询条件、合适的索引、优化查询语句等方法来提高性能和准确性。
Redis怎么解决并发竞争问题?
单线程的原子命令
事务
分布式锁
Redis提供了多种机制来解决并发竞争问题,以下是一些常用的方法:
-
使用事务:Redis支持事务操作,可以将一组命令打包成一个事务,保证这组命令的原子性执行。通过使用MULTI和EXEC命令,可以将多个命令放入一个事务中执行,保证这些命令的顺序执行,避免了并发竞争问题。
-
使用乐观锁:乐观锁是一种乐观的并发控制方法,在更新数据之前先获取数据的版本号或标识,然后在更新的时候比对版本号,如果一致则执行更新操作。Redis可以使用WATCH命令来实现乐观锁,通过监视一个或多个键,如果在执行WATCH之后有其他客户端对这些键进行了修改,则当前事务会被取消。
-
使用分布式锁:分布式锁是一种在分布式系统中用于解决竞争条件的方法。Redis可以使用SET命令来实现基于互斥的分布式锁。通过在设置键时加上NX(只在键不存在时设置)和EX(设置键的过期时间)选项,在并发情况下只有一个客户端能够成功地设置该键,实现锁的互斥性。
-
使用队列:Redis的列表数据类型可以用作队列,通过使用LPUSH和RPOP命令,可以将任务添加到队列的左侧,然后从队列的右侧取出任务进行处理。这样可以实现多个客户端之间对任务的并发处理,避免了竞争条件。
-
使用Pub/Sub模式:Redis的发布订阅模式可以用于解耦并发处理过程中的竞争问题。通过将任务发布到指定的频道,然后由多个订阅者同时接收并处理任务,可以实现并发处理而不会发生竞争条件。
需要根据具体的使用场景和需求选择合适的方法来解决并发竞争问题。
使用Redis缓存时候可能存在什么问题?
缓存穿透
缓存击穿
缓存雪崩
怎么查询redis占用空间比较大的key?
要查询Redis中占用空间比较大的key,可以使用Redis的命令SCAN
结合MEMORY USAGE
来实现。下面是具体的步骤:
- 使用
SCAN
命令遍历所有的key:
SCAN 0 COUNT 1000
这个命令将从第一个key开始,返回最多1000个key。可以根据实际情况调整COUNT
参数的值。
- 对每个返回的key,使用
MEMORY USAGE
命令查询其占用的内存大小:
MEMORY USAGE key
这个命令将返回指定key所占用的内存大小(以字节为单位)。
- 根据返回的内存大小进行排序,并选择占用空间较大的key。
需要注意的是,SCAN
命令是一个迭代命令,可能需要多次调用才能遍历完所有的key。另外,MEMORY USAGE
命令在Redis 4.0及以上版本才可用。
如果使用的是Redis 4.0以下的版本,可以考虑使用Redis的插件或工具来实现查询占用空间较大的key,如Redis-RDB-tools、redis-cli等。这些工具可以提供更方便的方式来查询Redis中占用空间较大的key。
redis发生内存溢出,该怎么处理?
当Redis发生内存溢出的情况时,可以采取以下几种处理方式:
-
增加Redis实例的内存容量:如果Redis实例的内存容量不够大,可以考虑增加Redis的内存容量,以便能够容纳更多的数据。可以通过调整Redis的配置文件中的
maxmemory
参数来设置内存容量。 -
优化Redis的内存使用:可以通过以下几种方式来优化Redis的内存使用:
- 选择合适的数据结构:根据实际需求选择合适的数据结构,以减少内存的使用。
- 压缩存储:使用压缩算法对存储的数据进行压缩,以减少内存的使用。
- 删除过期的键值对:使用Redis的过期机制,定期删除过期的键值对,以释放内存空间。
-
分片数据:如果Redis实例的内存容量已经达到极限,可以考虑将数据进行分片存储,使用多个Redis实例来存储数据,以减轻单个实例的内存压力。
-
持久化数据:可以将部分数据持久化存储到硬盘上,以释放内存空间。Redis提供了RDB持久化和AOF持久化两种方式,可以根据实际情况选择合适的持久化方式。
-
内存淘汰策略:当Redis的内存使用超过设定的
maxmemory
参数时,可以配置合适的内存淘汰策略。可以使用maxmemory-policy
参数来设置淘汰策略,如LRU(最近最少使用)、LFU(最不经常使用)等。 -
监控和优化:监控Redis的内存使用情况,及时发现内存使用异常或潜在的内存泄漏问题,并进行优化处理。
综合以上处理方式,可以根据实际情况选择合适的方法来处理Redis的内存溢出问题,并确保系统的稳定性和高可用性。
在请求的时候,如何做到请求接口的重复提交?
为了防止请求接口的重复提交,可以采取以下几种方式:
-
幂等性设计:在接口设计阶段,考虑将接口设计为幂等操作。即无论请求多次,结果都是一样的,不会产生副作用。这样可以避免由于重复提交产生的重复操作。
-
前端防止重复提交:前端可以在提交请求后,禁用提交按钮,或者在提交时进行验证,防止用户重复点击提交按钮。可以通过设置标识位或使用锁机制来实现。
-
后端防止重复提交:后端可以通过以下方式来防止重复提交:
- Token验证:在每次请求时,前端生成一个唯一的Token,放入请求参数中,后端在接收到请求后,验证Token的有效性,如果重复提交则拒绝处理。
- 请求ID验证:后端在处理请求时,可以将请求ID保存到数据库中,并设置请求ID为唯一索引,当收到重复请求时,由于唯一索引的冲突而拒绝处理。
- 分布式锁:使用分布式锁机制,如Redis的分布式锁,确保同一时刻只有一个请求能够获取锁并处理请求,其他请求在获取锁失败时返回错误。
-
请求过期处理:在接收到请求后,可以将请求信息保存到缓存或数据库中,并设置过期时间,当重复请求到达时,检查之前的请求是否仍然有效,如果已过期则处理新的请求,否则拒绝处理。
通过以上方式,可以有效地防止请求接口的重复提交,确保系统的数据一致性和稳定性。
为什么虚拟地址空间切换比较耗时?
虚拟地址空间切换比较耗时的主要原因有以下几点:
-
上下文切换:虚拟地址空间切换需要进行进程或线程的上下文切换。在切换过程中,需要保存当前进程或线程的寄存器状态、程序计数器等上下文信息,并加载新的进程或线程的上下文信息。这个过程涉及大量的数据拷贝和寄存器状态的切换,需要消耗较多的时间。
-
TLB刷新:TLB(Translation Lookaside Buffer)是用于加速虚拟地址到物理地址的转换的缓存。在虚拟地址空间切换时,TLB中的缓存内容可能会失效,需要进行TLB刷新。TLB刷新会导致之后的虚拟地址转换变得缓慢,增加内存访问的延迟。
-
页表切换:虚拟地址空间切换涉及到页表的切换。每个进程都有自己的页表,用于虚拟地址到物理地址的映射。当发生虚拟地址空间切换时,需要切换页表,即将当前进程的页表切换为新进程的页表。页表切换需要访问内存获取新的页表,这个过程可能涉及到较多的内存访问,增加了切换的耗时。
-
缓存失效:虚拟地址空间切换可能引起缓存的失效。在切换过程中,由于切换了进程或线程的内存访问模式,可能导致之前的缓存内容失效,需要重新加载新的数据到缓存中。缓存失效会导致后续的内存访问变慢,增加切换的耗时。
综上所述,虚拟地址空间切换耗时主要是由于上下文切换、TLB刷新、页表切换和缓存失效等因素引起的。为了降低虚拟地址空间切换的耗时,可以通过优化上下文切换、TLB刷新、页表切换和缓存失效等方面的处理,以及使用更高效的硬件架构和算法来改善切换的性能。
web开发过程中需要注意的安全性问题?
在Web开发过程中,需要注意以下安全性问题:
-
跨站脚本攻击(XSS):输入验证不严格、输出未经转义等情况可能导致XSS攻击。开发者应该对用户输入进行有效的验证和过滤,确保用户输入的数据不会被当做代码执行或注入恶意脚本。
-
跨站请求伪造(CSRF):未进行有效的防范措施,恶意网站可以通过伪造用户身份执行一些操作。为了防止CSRF攻击,开发者可以使用随机令牌、验证码等方式来验证请求的合法性。
-
SQL注入:当用户输入的数据未经过滤或转义时,恶意用户可以通过输入特定的数据来修改或执行不安全的SQL查询。为了防止SQL注入,开发者应该使用参数化的查询或预编译语句,避免拼接SQL语句。
-
敏感数据泄露:开发中的错误配置、不当的权限设置或不安全的存储方式可能导致敏感数据的泄露。开发者应该谨慎处理和存储敏感数据,并采取必要的加密措施来保护数据的安全。
-
文件上传漏洞:未对上传的文件进行适当的验证和检查可能导致上传恶意文件或文件读取/执行漏洞。开发者应该对上传文件进行严格的验证、限制文件类型和大小,并将上传的文件存储在安全的位置。
-
不安全的身份验证和会话管理:使用弱密码、不安全的会话管理方法(如明文会话ID、会话固定等)可能导致用户身份被盗用。开发者应该使用安全的密码存储方法(如哈希加盐)、使用安全的会话管理机制(如使用随机生成的会话ID)等来提高身份验证和会话管理的安全性。
-
未授权访问和越权访问:未正确实现权限控制机制可能导致未授权的用户访问敏感数据或执行未授权的操作。开发者应该对敏感操作进行权限验证,并使用最小权限原则,确保用户只能访问其所需的资源。
-
不安全的第三方组件和库:使用不安全的第三方组件或库可能导致安全漏洞。开发者应该选择可信赖的组件和库,并及时应用安全更新和补丁。
除了以上列出的安全性问题,开发者还应该持续关注最新的安全威胁和漏洞,并及时采取相应的安全措施来保护Web应用的安全性。
互联网工作强度持什么态度?
手撕 力扣46 全排列
作者:正在努力的豆
链接:https://www.nowcoder.com/discuss/526882414551977984?sourceSSR=dynamic
来源:牛客网
多益技术一面凉经
多益技术一面(35min)
1、自我介绍
2、在几个项目中觉得最好的是哪个,为什么做这个,分为哪几部分,做了多长时间,难点是什么,怎么解决的,还差什么没实现,详细介绍
3、熟悉什么语言,java和python的优缺点都有什么
Java一次编译,到处运行
JVM虚拟机
4、淘宝给用户个性化推荐商品,用到了什么技术点
5、全局变量与局部变量区别
作用域的不同
类内部
方法内部
6、面向对象与面向过程区别
过程的角度,机器角度
对象的结点,人的角度
7、用户访问一个网页,经历了什么流程
当用户访问一个网页时,通常经历以下流程:
-
用户输入URL:用户在浏览器地址栏中输入要访问的网页的URL(统一资源定位符)。
-
域名解析:浏览器将URL中的域名解析成对应的IP地址。浏览器会首先查询本地DNS缓存,如果找不到则向DNS服务器发送请求,获取域名对应的IP地址。
-
建立TCP连接:浏览器通过使用HTTP或HTTPS协议与服务器建立TCP连接。TCP连接是一种可靠的连接方式,保证数据的可靠传输。
-
发送HTTP请求:浏览器向服务器发送HTTP请求,请求包括HTTP方法(GET、POST等)、请求头(Header)和请求体(Body)。请求头中包含了一些信息,如浏览器类型、Cookie、访问来源等。
-
服务器处理请求:服务器接收到浏览器发送的请求后,根据请求的内容进行处理。这个过程可能包括验证用户身份、查询数据库、生成动态页面等。
-
返回HTTP响应:服务器处理完请求后,将生成的HTML、CSS、JavaScript等文件封装成HTTP响应返回给浏览器。响应包括响应头和响应体,响应头包含状态码、响应类型等信息。
-
浏览器解析响应:浏览器接收到服务器返回的响应后,开始解析响应,包括解析HTML结构、CSS样式、JavaScript脚本等。
-
页面渲染:浏览器根据解析的HTML、CSS和JavaScript,渲染页面内容,包括布局、样式、图像等。浏览器会根据HTML的结构生成DOM树,并根据CSS样式生成渲染树,最终将渲染树绘制到屏幕上。
-
执行JavaScript:如果页面中有JavaScript代码,浏览器会执行这些脚本。脚本可以修改页面的内容、交互和动画效果等。
-
完成页面加载:页面加载完成后,浏览器会触发load事件,并展示完整的页面给用户。
以上是一般的网页访问流程,不同的网站可能会有一些特殊的处理,例如使用缓存、压缩数据等来提高性能和用户体验。
8、Http与TCP、UDP的联系
Http基于TCP
Http3.0防止TCP粘包 用来UDP
9、MySQL分页查询,一页三十条数据,要查询第五页,该怎么写
select * from table
limit 120,30
10、项目中用到了MySQL,数据量有多少
11、项目中用到了那些框架,这些框架解决了项目中的那些问题,对这些框架的理解
12、关注了哪些技术热点
13、算法题:把两个有序整型数组合并为一个新的有序数组
14、反问
面试官挺好的,我不会的问题都在尽力引导,奈何我太菜了带不动
作者:叙利亚搬砖民工
链接:https://www.nowcoder.com/feed/main/detail/44435a11b77b4d189f390bbc9362c431?sourceSSR=search
来源:牛客网
最后
我们都有光明的未来
祝大家考研上岸
祝大家工作顺利
祝大家得偿所愿
祝大家如愿以偿
点赞收藏关注哦
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)