大家好,我是二哥呀。
深信服也开奖了,有人欢喜有人悲,有说这是什么牛马公司,985 硕给开到 20 出头的年包,有说这就是自己梦里想得到的薪资。
伟大的罗素先生曾说:参差不齐乃幸福本源。所以,满足自己预期就可以了,别为难自己,开心点。😄
为了让大家心中有数,我花了半个小时给大家盘点了一下深信服 25 届已开奖的薪资,已收录在《
Java 面试指南
》中,里面还有很多其他公司的薪资统计,感兴趣的小伙伴可以直达参考一下。
-
硕士 211 后端开发开到 22k,12-18 个月
-
-
硕士双一流 研发工程师,给到 19k,还是 x 领跑计划
-
双非本 985 硕 系统虚拟化,年包 40+,算是 sp,已经发了签字费
-
硕士 211 后端开发,给到劝退价 19k,果断拒了
-
985 硕 后端开发,只给到 15k,也是果断拒了
-
本科双一流 后端开发,开到了 24k,非常给力,比前面的所有人都高
整体看下来就是,深信服不太适合高阶学历的选手(🤣),给的薪资待遇远不如互联网大厂。反而双一流本科给到了一个意外的薪资,难道说,深信服对双非本的同学更加青睐?
去年星球里就有双非本的球友拿到 16k,这比 985 硕的 15k 还要多 1k,可见学历的含金量在深信服上并没有体现出来(足以证明一点,深信服非点击就送的学历厂)。
10 月下旬,拿到多个 offer 的小伙伴基本上都要开奖并且释放 offer 了,
手头上还没有 offer 的选手这时候就要注意了,注意了,注意了
。
该出手时就出手,这个时候正是好机会。
另外,看了很多深信服的面经,我发现,线下面越来越多了,究其原因就是线下面试考察的都是真实水平,不容易作弊,相对来说,对于那些一直真心实意在准备的同学也会更友好一点。
那今天我们就以《Java 面试指南》中收录的同学 3 深信服 Java 后端线下一面为例,来看看这 30 分钟内面试官都问了哪些问题,好心中有数(不再是纯粹的八股,会有一些手撕)。
深信服 Java 线下一面
手撕: 长字符串(纯数字)轮询把第一位放到最后一位, 问哪个数最大?
将数字字符串的第一位移动到最后一位,意味着每次将字符串首位的字符移到末尾,依次得到不同的字符串组合。
对于原始字符串:"23132",轮询后的组合:
从这些轮询结果中可以看出,字典序最大的字符串是 "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 // 生成轮询字符串
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 commonElements = findCommonElements(a, b);
// 输出结果
System.out.println("相同的元素: " + commonElements);
}
public static Set 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的其他所有。