华为OD薪资待遇一览表。。

沉默王二

共 9812字,需浏览 20分钟

 · 2024-04-13

大家好,我是二哥呀。

对于短期内没有更好的选择,去不了大厂,但又不太想去不知名的小厂,或者外包的话,华为 OD 是一个不错的过渡选择,别架着自己,高不成低不就是最难受的。

  • 有的人高瞻远瞩,且能力很强,就可以一直践行自己的目标。
  • 有的人随波逐流,但运气很好,也可以一直顺风顺水,平步青云。
  • 有的人想很多,但实力不太够,就经常在挫败和努力奋斗中挣扎,反而更难受。

对于有 gap 期、学历够得上门槛的同学来说,我觉得 OD 是可以去的。别委屈自己,也别看不起 OD,鞋子适不适合只有脚知道。我之前在《Java 面试指南-华为 OD 面经》中统计过一波各个地区 OD 的薪资待遇,大家可以作为参考。

抠图的朋友请表明出处,尊重劳动成果

然后我们再以《Java 面试指南》中同学 1 的面试内容为例,来看看华为 OD 的面试官都喜欢问哪些问题。

可以看得出,仍然是围绕着二哥一直给大家强调的 Java 后端四大件展开,并且难度不大。内容较长,建议大家先收藏起来,面试的时候大概率会碰到,我会尽量用通俗易懂+手绘图的方式,让天下所有的面渣都能逆袭 😁

华为 OD面经(挺细节)

用过哪些MySQL函数?

MySQL支持很多内置函数,包括执行计算、格式转换、日期处理等。我说一些自己常用的。

  • CONCAT(): 连接两个或多个字符串。
  • LENGTH(): 返回字符串的长度。
  • SUBSTRING(): 从字符串中提取子字符串。
  • REPLACE(): 替换字符串中的某部分。
  • NOW(): 返回当前的日期和时间。
  • SUM(): 计算数值列的总和。
  • AVG(): 计算数值列的平均值。
  • COUNT(): 计算某列的行数。
  • MAX()MIN(): 分别返回列中的最大值和最小值。
-- 连接字符串
SELECT CONCAT('沉默'' ''王二'AS concatenated_string;

-- 获取字符串长度
SELECT LENGTH('沉默 王二'AS string_length;

-- 提取子字符串
SELECT SUBSTRING('沉默 王二'15AS substring;

-- 替换字符串内容
SELECT REPLACE('沉默 王二''王二''MySQL'AS replaced_string;

Linux 使用过哪些命令

我自己常用的 Linux 命令有 top 查看系统资源、ps 查看进程、netstat 查看网络连接、ping 测试网络连通性、find 查找文件、chmod 修改文件权限、kill 终止进程、df 查看磁盘空间、free 查看内存使用、service 启动服务、mkdir 创建目录、rm 删除文件、rmdir 删除目录、cp 复制文件、mv 移动文件、zip 压缩文件、unzip 解压文件等等这些。

文件操作的命令有哪些?

  • ls:列出目录内容。ls -l显示详细信息,ls -a显示隐藏文件。
  • cd:更改当前目录。cd ..回到上级目录,cd ~回到用户的主目录。
  • pwd:显示当前工作目录的完整路径。
  • cp:复制文件或目录。cp source_file target_file复制文件,cp -r source_directory target_directory复制目录。
  • mv:移动或重命名文件或目录。
  • rm:删除文件或目录。rm -r递归删除目录及其内容。
  • mkdir:创建新目录。
  • cat:查看文件内容。cat file1 file2合并文件内容显示。

系统管理的命令有哪些?

  • ps:显示当前运行的进程。ps aux显示所有进程。
  • top:实时显示进程动态。
  • kill:终止进程。kill -9 PID强制终止。
  • df:显示磁盘空间使用情况。df -h以易读格式显示。
  • du:显示目录或文件的磁盘使用情况。
  • free:显示内存和交换空间的使用情况。
  • chmod:更改文件或目录的权限。
  • chown:更改文件或目录的所有者和所属组。

网络管理的命令有哪些?

  • ping:检查与远程服务器的连接。
  • wget:从网络上下载文件。

压缩和解压的命令有哪些?

  • tar:打包或解包.tar文件。tar cvf archive.tar files打包,tar xvf archive.tar解包。
  • gzip / gunzip:压缩或解压.gz文件。
  • zip / unzip:压缩或解压.zip文件。

查找文件的命令有哪些?

  • find:在目录树中查找文件。find /directory/ -name filename

chmod 的参数讲一下?

chmod 命令在 Linux 中用来改变文件或目录的访问权限。这个命令的使用可以基于符号表示法(也称为文本方法)或者八进制数表示法。

chmod 777 file 赋予文件所有权限,就属于八进制数表示法。7=4+2+1,分别代表读、写、执行权限。

Linux 中的权限可以应用于三种类别的用户:

  • 文件所有者(u)
  • 与文件所有者同组的用户(g)
  • 其他用户(o)
图片来源于网络

①、符号模式

符号模式使用字母来表示权限,如下:

  • 读(r)
  • 写(w)
  • 执行(x)
  • 所有(a)

例如:

  • chmod u+w file:给文件所有者添加写权限。
  • chmod g-r file:移除组用户的读权限。
  • chmod o+x file:给其他用户添加执行权限。
  • chmod u=rwx,g=rx,o=r file:设置文件所有者具有读写执行权限,组用户具有读执行权限,其他用户具有读权限。

②、数字模式

数字模式使用三位八进制数来表示权限,每位数字代表不同的用户类别(所有者、组、其他用户),数字是其各自权限值的总和:

  • 读(r)= 4
  • 写(w)= 2
  • 执行(x)= 1
图片来源于网络

因此,权限模式可以是从 0(无权限)到 7(读写执行权限)的任何值。

  • chmod 755 file:使得文件所有者有读写执行(7)权限,组用户和其他用户有读和执行(5)权限。
  • chmod 644 file:使得文件所有者有读写(6)权限,而组用户和其他用户只有读(4)权限。

对于多线程编程的了解?

多线程编程涉及到两个非常重要的概念,一个是进程,一个是线程。

进程说简单点就是我们在电脑上启动的一个个应用,比如我们启动一个浏览器,就会启动了一个浏览器进程。进程是操作系统资源分配的最小单位,它包括了程序、数据和进程控制块等。

线程说简单点就是我们在 Java 程序中启动的一个 main 线程,一个进程至少会有一个线程。当然了,我们也可以启动多个线程,比如说一个线程进行 IO 读写,一个线程进行加减乘除计算,这样就可以充分发挥多核 CPU 的优势,因为 IO 读写相对 CPU 计算来说慢得多。线程是 CPU 分配资源的基本单位。

三分恶面渣逆袭:进程与线程关系

一个进程中可以有多个线程,多个线程共用进程的堆和方法区(Java 虚拟机规范中的一个定义,JDK 8 以后的实现为元空间)资源,但是每个线程都会有自己的程序计数器和栈。

多线程并发是指系统有处理多个任务的能力,但是任意时刻只有一个任务在执行。在单核处理器上,多个任务是通过时间片轮转的方式实现的。但这种切换非常快,给人感觉是在同时执行。

仿佛是在并行执行。

并行是指多个处理器同时执行多个任务,每个核心实际上可以在同一时间独立地执行不同的任务。

三分恶面渣逆袭:并行和并发

通常我们会使用线程池来管理线程,提高线程的使用效率。

线程池创建的几个核心参数?

线程池有 7 个参数,需要重点关注corePoolSizemaximumPoolSizeworkQueuehandler 这四个。

三分恶面渣逆袭:线程池参数

我一一说一下:

①、corePoolSize

定义了线程池中的核心线程数量。即使这些线程处于空闲状态,它们也不会被回收。这是线程池保持在等待状态下的线程数。

②、maximumPoolSize

线程池允许的最大线程数量。当工作队列满了之后,线程池会创建新线程来处理任务,直到线程数达到这个最大值。

③、keepAliveTime

非核心线程的空闲存活时间。如果线程池中的线程数量超过了 corePoolSize,那么这些多余的线程在空闲时间超过 keepAliveTime 时会被终止。

④、unit

keepAliveTime 参数的时间单位:

  • TimeUnit.DAYS; 天
  • TimeUnit.HOURS; 小时
  • TimeUnit.MINUTES; 分钟
  • TimeUnit.SECONDS; 秒
  • TimeUnit.MILLISECONDS; 毫秒
  • TimeUnit.MICROSECONDS; 微秒
  • TimeUnit.NANOSECONDS; 纳秒

⑤、workQueue

用于存放待处理任务的阻塞队列。当所有核心线程都忙时,新任务会被放在这个队列里等待执行。

⑥、threadFactory

一个创建新线程的工厂。它用于创建线程池中的线程。可以通过自定义 ThreadFactory 来给线程池中的线程设置有意义的名字,或设置优先级等。

⑦、handler

拒绝策略 RejectedExecutionHandler,定义了当线程池和工作队列都满了之后对新提交的任务的处理策略。常见的拒绝策略包括抛出异常、直接丢弃、丢弃队列中最老的任务、由提交任务的线程来直接执行任务等。

什么是HTTP?

HTTP 全称是超文本传输协议(HyperText Transfer Protocol),是一个基于请求与响应模式的应用层协议,基于 TCP/IP 协议传输数据。

HTTP 遵循标准的客户端-服务器模型,客户端打开连接以发出请求,然后等待它收到服务器端响应。

三分恶面渣逆袭:HTTP 请求的过程和原理
  • 在浏览器输入 URL 后,浏览器首先会通过 DNS 解析获取到服务器的 IP 地址,然后与服务器建立 TCP 连接。
  • TCP 连接建立后,浏览器会向服务器发送 HTTP 请求。
  • 服务器收到请求后,会根据请求的信息处理请求。
  • 处理完请求后,服务器会返回一个 HTTP 响应给浏览器。
  • 浏览器收到响应后,会根据响应的信息渲染页面。然后,浏览器和服务器断开 TCP 连接。

客户端发送一个请求到服务器,服务器处理请求并返回一个响应。这个过程是同步的,也就是说,客户端在发送请求后必须等待服务器的响应。在等待响应的过程中,客户端不会发送其他请求。

说一说OSI七层参考模型

计算机网络体系结构通过将复杂的网络通信分解成不同的层次,来标准化交互的过程。常见的模型包括 OSI 七层模型、TCP/IP 四层模型和五层体系结构。

三分恶面渣逆袭:三种网络体系结构

OSI 是理论上的网络通信模型,TCP/IP 是实际应用层面上的网络通信模型,五层结构是为了方便理解和记忆。

说说 OSI 七层模型?

OSI(Open System Interconnection)七层参考模型是一个网络架构模型,由国际标准化组织(ISO)提出,用于描述和标准化各种计算机网络的功能和过程。这七层从低到高分别是:

  • 应用层:最靠近用户的层,负责处理特定的应用程序细节。这一层提供了网络服务与用户应用软件之间的接口。例如,Web 浏览器、FTP 客户端和服务器、电子邮件客户端等。
  • 表示层:确保从一个系统发送的信息可以被另一个系统的应用层读取。它负责数据的转换、压缩和加密。例如,确保数据从一种编码格式转换为另一种,如 ASCII 到 EBCDIC。
  • 会话层:管理用户的会话,控制网络上两节点间的对话和数据交换的管理。它负责建立、维护和终止会话。例如,建立一个会话令牌,以便在网络上的两个节点之间传递。
  • 传输层:提供端到端的通信服务,保证数据的完整性和正确顺序。这一层包括 TCP 和 UDP 等。
  • 网络层:负责在多个网络之间进行数据传输,确保数据能够在复杂的网络结构中找到从源到目的地的最佳路径。这层使用的是 IP(Internet Protocol)协议。
  • 数据链路层:在物理连接中提供可靠的传输,负责建立和维护两个相邻节点间的链路。包括帧同步、MAC(媒体访问控制)。
  • 物理层:负责在物理媒介上实现原始的数据传输,比如电缆、光纤和无线信号传输。涉及的内容包括电压、接口、针脚、电缆的规格和传输速率等。

Redis的了解, 部署方案?

Redis 是 Remote Dictionary Service 三个单词中加粗字母的组合,是一种基于键值对(key-value)的 NoSQL 数据库。

三分恶面渣逆袭:Redis图标

但比一般的键值对,比如 HashMap 强大的多,Redis 中的 value 支持 string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog(基数估算)、GEO(地理信息定位)等多种数据结构。

而且因为 Redis 的所有数据都存放在内存当中,所以它的读写性能非常出色。

不仅如此,Redis 还可以将内存数据持久化到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据并不会“丢失”。

除此之外,Redis 还提供了键过期、发布订阅、事务、流水线、Lua 脚本等附加功能,是互联网技术领域中使用最广泛的缓存中间件。

Redis 除了单机部署外,还可以通过主从复制、哨兵模式和集群模式来实现高可用。

主从复制(Master-Slave Replication):允许一个 Redis 服务器(主节点)将数据复制到一个或多个 Redis 服务器(从节点)。这种方式可以实现读写分离,适合读多写少的场景。

哨兵模式(Sentinel):用于监控主节点和从节点的状态,实现自动故障转移和系统消息通知。如果主节点发生故障,哨兵可以自动将一个从节点升级为新的主节点,保证系统的可用性。

集群模式(Cluster):Redis 集群通过分片的方式存储数据,每个节点存储数据的一部分,用户请求可以并行处理。集群模式支持自动分区、故障转移,并且可以在不停机的情况下进行节点增加或删除。

你了解的设计模式

单例模式,在需要控制资源访问,如配置管理、连接池管理时经常使用单例模式。它确保了全局只有一个实例,并提供了一个全局访问点。

在有多种算法或策略可以切换使用的情况下,我会使用策略模式。像技术派实战项目中,我就使用策略模式对接了讯飞星火、OpenAI 等多家 API 服务,实现了一个可以自由切换 AI 服务的对话聊天服务。

技术派派聪明 AI 助手

这样就不用在代码中写 if/else 判断,而是将不同的 AI 服务封装成不同的策略类,通过工厂模式创建不同的 AI 服务实例,从而实现 AI 服务的动态切换。

后面想添加新的 AI 服务,只需要增加一个新的策略类,不需要修改原有代码,这样就提高了代码的可扩展性。

队列和栈的区别了解吗?

队列是一种先进先出(FIFO, First-In-First-Out)的数据结构。在队列中,第一个加入队列的元素会是第一个被移除的。队列常用于处理按顺序来的任务。

疯狂的技术宅:队列

栈是一种后进先出(LIFO, Last-In-First-Out)的数据结构。在这种结构中,最后一个加入栈的元素会是第一个被移除的。这种特性使得栈非常适合于那些需要访问最新添加的数据元素的场合。

Wang Wei:栈

引用类型的变量有什么特点

引用类型的变量存储的是对象的地址,而不是对象本身。因此,引用类型的变量在传递时,传递的是对象的地址,也就是说,传递的是引用的值。

三分恶面渣逆袭:Java引用数据值传递示意图

参考链接

  • 三分恶的面渣逆袭:https://javabetter.cn/sidebar/sanfene/nixi.html
  • 二哥的 Java 进阶之路:https://javabetter.cn

ending

一个人可以走得很快,但一群人才能走得更远。二哥的编程星球已经有 5000 多名球友加入了,如果你也需要一个良好的学习环境,戳链接 🔗 加入我们吧。这是一个编程学习指南 + Java 项目实战 + LeetCode 刷题的私密圈子,你可以阅读星球专栏、向二哥提问、帮你制定学习计划、和球友一起打卡成长。

两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远

欢迎点击左下角阅读原文了解二哥的编程星球,这可能是你学习求职路上最有含金量的一次点击。

最后,把二哥的座右铭送给大家:没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。共勉 💪。

浏览 123
10点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
10点赞
评论
收藏
分享

手机扫一扫分享

举报