深信服也开奖了,有人欢喜有人悲,有说这是什么牛马公司,985 硕给开到 20 出头的年包,有说这就是自己梦里想得到的薪资。
那我简单给大家盘点了一下深信服 25 届已开奖的薪资,已收录在《[Java 面试指南)》中,里面还有很多其他公司的薪资统计,感兴趣的小伙伴可以直达参考一下。
- 硕士 211 后端开发开到 22k,12-18 个月
- 硕士 985 后台开发,也是 22k,不太满意
- 硕士双一流 研发工程师,给到 19k,还是 x 领跑计划
- 双非本 985 硕 系统虚拟化,年包 40+,算是 sp,已经发了签字费
- 硕士 211 后端开发,给到劝退价 19k,果断拒了
- 985 硕 后端开发,只给到 15k,也是果断拒了
- 本科双一流 后端开发,开到了 24k,非常给力,比前面的所有人都高
整体看下来就是,深信服不太适合高阶学历的选手(🤣),给的薪资待遇远不如互联网大厂。双一流本科给到了一个意外的薪资,难道说,深信服更对双非本的同学更加青睐?
去年星球里就有双非本的球友拿到 16k,这比 985 硕的 15k 还要多 1k,可见学历的含金量在深信服上并没有体现出来。
10 月下旬,拿到多个 offer 的小伙伴基本上都要开奖并且释放 offer 了,手头上还没有 offer 的选手这时候就要注意了,注意了,注意了。
该出手时就出手,这个时候正是好机会。
另外,看了很多深信服的面经,我发现,线下面越来越多了,究其原因就是线下面试考察的都是真实水平,不容易作弊,相对来说,对于那些一直真心实意在准备的同学也会更友好一点。
那今天我们以《Java 面试指南》中收录的同学 3 深信服 Java 后端线下一面为例,来看看这 30 分钟内面试官都问了哪些问题,好心中有数。
深信服 Java 线下一面
手撕: 长字符串(纯数字)轮询把第一位放到最后一位, 问哪个数最大?
将数字字符串的第一位移动到最后一位,意味着每次将字符串首位的字符移到末尾,依次得到不同的字符串组合。
对于原始字符串:“23132”,轮询后的组合:
- 第一次轮询结果 “31322”
- 第二次轮询结果 “13223”
- 第三次轮询结果 “32231”
- 第四次轮询结果 “22313”
从这些轮询结果中可以看出,字典序最大的字符串是 “32231”。题解方法:
public class MaxRotatedString {
public static void main(String[] args) {
String numStr = "23132"; // 输入字符串
String maxStr = findMaxRotation(numStr);
System.out.println("最大的轮询结果: " + maxStr);
}
public static String findMaxRotation(String numStr) {
String maxStr = numStr; // 初始化为原始字符串
int length = numStr.length();
// 轮询整个字符串,比较每次轮询结果
for (int i = 1; i < length; i++) {
// 生成轮询字符串
String rotatedStr = numStr.substring(i) + numStr.substring(0, i);
// 更新最大值
if (rotatedStr.compareTo(maxStr) > 0) {
maxStr = rotatedStr;
}
}
return maxStr;
}
}
题解思路:
- 使用
substring(i)
和substring(0, i)
来实现轮询操作,即将字符串从第 i 个位置切分为两部分,并将前半部分移到字符串末尾。 - 使用字符串的 compareTo 方法来比较字典序,如果第一个字符串大于第二个字符串(即字典序更靠后),返回值为正数。
只提供想法 : String[] a 和 String[] b求两个数组相同的元素
第一种:可以将数组 a 的元素存入一个 HashSet,然后遍历数组 b,判断每个元素是否存在于这个 HashSet 中。
通过这种方式,可以快速找到两个数组的交集元素。原理:Set 的特点是存取无序,不可以存放重复的元素。
第二种:使用一个 HashMap 来统计数组 a 中每个元素的频率。遍历数组 b,对于每个元素,检查它在 Map 中的频率,如果频率大于 0,则为相同元素,并更新频率。
第三种:将数组 a 转换为 Stream,使用 filter 函数过滤出数组 b 中也存在的元素,然后使用 collect 收集相同元素。
class ArrayIntersection {
public static void main(String[] args) {
// 示例数组
String[] a = {"沉默王二", "沉默王三", "沉默王四", "沉默王五"};
String[] b = {"沉默王三", "沉默王六", "沉默王二", "沉默王八"};
// 使用 Stream API 获取两个数组的交集
Set<String> commonElements = findCommonElements(a, b);
// 输出结果
System.out.println("相同的元素: " + commonElements);
}
public static Set<String> findCommonElements(String[] a, String[] b) {
// 将数组 a 转换为 List,然后使用 filter 来过滤出数组 b 中也存在的元素
return Arrays.stream(a)
.filter(element -> Arrays.asList(b).contains(element)) // 过滤条件
.collect(Collectors.toSet()); // 收集结果为 Set 集合,去除重复元素
}
}
JVM变量存在堆栈的位置?
对于局部变量来说,它存储在当前方法的栈帧中的局部变量表中。当方法执行完毕,栈帧被回收,局部变量也会被释放。
public void method() {
int localVar = 100; // 局部变量,存储在栈帧中的局部变量表里
}
对于静态变量来说,它存储在 Java 规范中的方法区中,也就是元空间(Metaspace)。
public class StaticVarDemo {
public static int staticVar = 100; // 静态变量,存储在方法区中
}
操作系统:指针是存在虚拟内存中,问物理内存和虚拟内存的区别
物理内存指的是计算机中实际存在的硬件内存。物理内存是计算机用于存储运行中程序和数据的实际内存资源,操作系统和应用程序最终都必须使用物理内存来执行。
也就是我们常说的那个 8G、16G、64G 的内存条。
虚拟内存是操作系统提供的一种内存管理技术,它使得应用程序认为自己有连续的、独立的内存空间,而实际上,这个虚拟内存可能部分存储在物理内存上,部分存储在 磁盘(如硬盘的交换分区或页面文件) 中。
虚拟内存的核心思想是通过硬件和操作系统的配合,为每个进程提供一个独立的、完整的虚拟地址空间,解决物理内存不足的问题。
①、每个进程都有自己的虚拟地址空间,虚拟内存使用的是逻辑地址,它与实际的物理内存地址不同,必须经过地址转换才能映射到物理内存。
②、操作系统通过 页表(Page Table) 将虚拟地址映射到物理地址。当程序访问某个虚拟地址时,CPU 会通过页表找到对应的物理地址。
③、操作系统将虚拟内存划分为若干个页(Pages),每个页可以被映射到物理内存中的一个页面。如果物理内存不够,操作系统会将不常用的页暂时存储到磁盘的交换区(Swap)中,这个过程叫做页交换(Paging)。
计算机网络:http请求除了get post的其他所有。
HTTP 协议定义了多种请求方式,用以指示请求的目的。常见的请求方式有 GET、POST、DELETE、PUT。
- GET:请求检索指定的资源。应该只用于获取数据,并且是幂等的,即多次执行相同的 GET 请求应该返回相同的结果,并且不会改变资源的状态。
- POST:向指定资源提交数据,请求服务器进行处理(如提交表单或上传文件)。数据被包含在请求体中。可能会创建新的资源或修改现有资源。
- DELETE:删除指定的资源。
- PUT:用于替换指定的资源。如果指定的资源不存在,创建一个新资源。
- HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。可以用于检查资源是否存在,验证资源的更新时间等。
- OPTIONS:用于获取服务器支持的 HTTP 请求方法。通常用于跨域请求中的预检请求(CORS)。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。但由于安全风险(可能暴露敏感信息),很多服务器会禁用 TRACE 请求。
- CONNECT:建立一个到目标资源的隧道(通常用于 SSL/TLS 代理),用于在客户端和服务器之间进行加密的隧道传输。
内容来源
- 星球嘉宾三分恶的面渣逆袭:https://javabetter.cn/sidebar/sanfene/nixi.html
- 二哥的 Java 进阶之路(GitHub 已有 13000+star):https://javabetter.cn