电信智科-大数据开发运营工程师(成都base)面经
电信智科(中国电信股份有限公司数字智能科技分公司)-大数据开发运营工程师面经
9月1日投的,15日笔试,26日一面。这个公司是在国聘行动上投递的,在成都就这一个岗位,本来没抱希望投的,结果没想到还给面试了。面试在腾讯会议上的,一共25分钟左右,比较短;感觉有点凉,像kpi面,我准备了kafka的很多八股,结果一个没问,一直在怼网络,感觉有点像kpi面试。
以下回答绝大部分是GPT4.0回答的,我看着没太大问题就贴上来了,仅供参考,可能有些错误。
1.前后端分离的项目中,前端往后端发送http请求过程中发生了什么?
2.http基于TCP这个全双工的协议,为什么基本上都是客户端请求服务端,服务端返回数据这种半双工的模式呢?
HTTP 是一个请求-响应协议。虽然它基于 TCP,这是一个全双工的协议,但 HTTP 本身是设计为一个简单的、无状态的协议,主要用于文档的检索和信息的发布。因此,HTTP 的主要模式是客户端发送一个请求,服务器返回一个响应。
现在我们详细分析这个问题:
- HTTP的设计初衷:HTTP 最初的设计是为了文档的检索和信息的发布,它并不是为双向实时通信设计的。所以,尽管 TCP 支持全双工模式,HTTP 在设计时选择了请求-响应模型,即半双工模式。
- 无状态性:HTTP 是无状态的。每一个请求-响应对都是独立的。这简化了服务端的设计和实现,因为服务端不需要维护与客户端之间的长时间连接状态。
- 长轮询和服务器推送:在 HTTP/1.1 下,尽管主要的模式是请求-响应,但也可以通过技巧如长轮询来模拟服务器向客户端的推送。但这并不是真正的全双工通信。
- HTTP/2 的服务器推送:HTTP/2 引入了服务器推送功能。这允许服务器在没有客户端明确请求的情况下发送数据。然而,这仍然是在请求-响应模型的上下文中,只是提供了更高效的方式来预先推送可能需要的资源。
- WebSocket:WebSocket 是一个不同的协议,尽管它从 HTTP 升级而来。它提供了真正的全双工通信能力,允许服务器和客户端之间的双向实时通信。与 HTTP 相比,WebSocket 更适合需要实时交互和低延迟的应用,例如在线聊天、游戏和实时数据流。
综上所述,尽管 TCP 是全双工的,但 HTTP 的设计选择和其应用场景使其主要成为一个请求-响应模型。为了满足实时双向通信的需求,WebSocket 协议被引入为一个单独的、完全不同于 HTTP 的协议。
3.http1.1协议下,如果要双向互动的话,只能升级到websocket吗?
对
4.http协议升级到websocket的过程简述一下。哪个响应码是协议升级?(101)
可以看小林coding的这篇3.9 既然有 HTTP 协议,为什么还要有 WebSocket? | 小林coding (xiaolincoding.com)。
5.多线程在平时用过吗?简述一下场景
6.在kotlin中如何开启协程的?StateFlow是如何使用的?
代码
fun main() { GlobalScope.launch(context = Dispatchers.IO) { //延时一秒 delay(1000) log("launch") } //主动休眠两秒,防止 JVM 过快退出 Thread.sleep(2000) log("end") }
用的比较多的协程作用域是coroutineScope
;StateFlow就是一个热流,可以对新来的数据进行回调操作。
private suspend fun test() { // 创建一个热流,初始值为1 val flow = MutableStateFlow(1) // 将MutableStateFlow对象转换为StateFlow对象 // StateFlow对象不能调用emit方法,因此只能用于接收 val onlyReadFlow = flow.asStateFlow() // 接收者1 // 启动一个新的协程 GlobalScope.launch { // 触发并处理接收的数据 onlyReadFlow.collect { Log.d("liduozuishuai", "test1: $it") } } // 接收者2 // 启动一个新协程 GlobalScope.launch { // 订阅监听,当collect方法触发订阅时,会首先会调onSubscription方法 onlyReadFlow.onSubscription { Log.d("liduozuishuai", "test2: ") // 发射数据:2 // 向下游发射数据:2,其他接收者收不到 emit(2) }.onEach { // 处理接收的数据 Log.d("liduozuishuai", "test2: $it") }.collect() } // 发送数据:3,多次发送 GlobalScope.launch { flow.emit(3) flow.emit(3) flow.compareAndSet(3, 3) } }
7.说一下Java如何从线程中取返回值?
直接贴代码了,用Callable+submit()后得到的Future对象进行get()api的调用或者直接使用FutureTask也可以。这里我没有回答好,只知道使用get()
调用,但是不知道具体是在哪个对象上进行get()。
记住,我们要获取返回值的时候,需要用get()方法,这个get()方法是Future
接口内的,那么实现了Future
借口的对象怎么来?
- 通过线程池(submit)提交
Callable
对象,之后会返回一个Future
,对它调用get()
即可 - 直接通过
Future
借口的实现类,FutureTask
,只不过使用它之后,放入线程池中执行就只需要用execute()
方法,不能用submit()
了。因为当您传入一个FutureTask
到submit
方法中,其实是调用了另一个重载版本submit(Runnable task)
,这个版本的submit
方法并不关心Runnable
是否是一个FutureTask
或是否有返回值。
代码如下:
public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<Integer> ft = new FutureTask<>(()->{ int i = 0 ; for(;i<10;i++){ System.out.println(Thread.currentThread().getName() + "的循环变量i的值 :" + i); } return i; }); ThreadPoolExecutor tpe = new ThreadPoolExecutor(5,10,10 , TimeUnit.SECONDS,new ArrayBlockingQueue<>(10), new ThreadFactory() { @Override public Thread newThread(Runnable r) { return new Thread(null,r,"这是一个有返回值的线程"); } },new ThreadPoolExecutor.CallerRunsPolicy()); tpe.execute(ft); System.out.println(ft.get()); Callable<Integer> callable = new Callable<Integer>() { @Override public Integer call() throws Exception { System.out.println("callable开始执行"); int i = 0 ; for(;i<10;i++){ System.out.println(Thread.currentThread().getName() + "的循环变量i的值 :" + i); } return i; } }; Future<Integer> submit = tpe.submit(callable); System.out.println(submit.get()); tpe.shutdown(); }
8.知道的数据结构说一下
数组、链表、树、图、栈、队列、双端队列、哈希表等等
9.如何判断一个链表中是否有环?
快慢指针
10. 说一下栈的应用场景
栈(Stack)是一个后进先出(LIFO)的数据结构,有很多实际应用场景。以下是一些常见的应用场景以及详细的说明:
- 函数调用/方法执行:在程序中,每当有一个函数或方法被调用,系统会将调用信息(如返回地址、局部变量等)压入系统调用栈中。当函数执行完毕并返回时,系统从调用栈中弹出该函数的调用信息,继续执行前一个函数。举例:考虑递归函数。例如,计算斐波那契数列。每次函数递归调用自己,都会将当前的计算状态保存在栈中。
- 表达式求值:栈用于解析和计算算术表达式,特别是当它们有不同的优先级时。举例:使用两个栈,一个用于值和另一个用于运算符,来实现后缀(逆波兰)表示法或将中缀表达式转换为后缀表达式。
- 括号匹配:栈可以帮助检查括号、大括号、方括号等在代码或表达式中是否正确匹配。举例:检查字符串“{[()]}”中的括号是否匹配。每次遇到左括号时压入栈,遇到右括号时从栈中弹出并检查是否匹配。
- 后退功能:在浏览器或软件中的后退功能,可以使用栈来实现。每次用户访问新页面或状态时,当前页面/状态被压入栈中。点击后退时,最近的页面/状态从栈顶被弹出。举例:浏览器历史功能。当你浏览新的网页时,之前的网页地址被压入栈。点击后退按钮时,返回栈顶的网页。
- 撤销操作:在许多应用程序中(如文字处理器或图形编辑器),栈可以用来实现撤销功能。每次更改都被压入栈中。要撤销更改,只需从栈顶弹出操作。举例:在Microsoft Word中,当你删除文本或添加格式时,每个更改都被保存在栈中。使用撤销功能时,可以逐步回退到之前的状态。
- 深度优先搜索:在图形或树形结构中,深度优先搜索可以使用栈来实现。举例:考虑一个迷宫问题。从起点开始,你可以使用栈来存储访问路径。每次都走可能的路径,如果到达死胡同,则从栈中弹出上一步并尝试其他路径。
这些只是栈的几个应用场景。由于其简单且高效的性质,栈在计算机科学和其他领域中有着广泛的应用。
11.说一下树的应用场景
10和11让我感觉kpi的味道很浓了,感觉面试官从第7个我没答好的问题开始就有点失去兴趣了,哎
12.TCP/IP是几个协议?
TCP/IP 并不是指一个单独的协议,而是一个协议族或者说是一个协议套件。这个协议族中包含了多个层次和类型的协议。其名称中的“TCP”和“IP”分别是传输控制协议(TCP)和互联网协议(IP),这两个是这个协议族中最著名的协议,但实际上,TCP/IP协议族包含了更多的协议。
TCP/IP 模型大致可以分为以下四个层次:
- 应用层:这一层包含了各种应用层协议,如 HTTP, FTP, SMTP, DNS 等。
- 传输层:这一层主要有两个协议,即 TCP 和 UDP(用户数据报协议)。
- 网络层:主要协议是 IP,但还包括如 ICMP(互联网控制消息协议)、IGMP(互联网组管理协议)等其他协议。
- 链路层:这一层并没有特定的协议定义在 TCP/IP 协议族中,但是这一层主要负责与具体的物理网络相交互,如 Ethernet。
因此,说 TCP/IP 是“几个”协议其实不准确。它是一个包含了许多协议的协议族,而这些协议都服务于不同的目的和功能。
13.TCP协议和IP协议的关系?
14.包粘粘问题说一下
15.k8s说一下
反问:
1.公司是做什么的?
电信智科是中国电信的分公司,是专门做AI,大模型的。成都团队主要做大数据相关的,工作有很多种,开发、算法都有,需要进去之后再看(感觉这句话挺敷衍的hhhh)。
2.能给我什么建议吗?
我不能给你什么建议。
绝了,第一家啥建议也给不到俺的公司,哪怕客套话也不说,感觉是明着kpi了,面试的时候对面也挺吵的,也没开摄像头。
也可能是自己太菜了,不能让面试官感兴趣吧hhhh