话不多说 一首凉凉送给自己 自己学后端 然后腾讯投的测试开发岗位,今天面完发现问的挺难得呀 =-=
关于实习
- oracle实习做的什么呀?
web ui测试 用selenium写自动化case
然后看过底层的源码吗? 看你妹啊。。我是做后端的。。。反正实习做的东西没讲好,凉了第一步
关于项目
介绍自己的项目,这个是每个公司都会让你介绍的(我觉得这个要背一背,毕竟一个项目这么多东西,需要总结一下),
问的问题
- java新生代 老年代 持久代
虚拟机的堆内存 首先堆内存分为三个代 年轻代 老年代 持久代
- 年轻代 :所有新生成的对象都是首先放在年轻代的,年轻代的目标就是尽可能快速的收集到那些生命周期短的对象,年轻代又分为三个区,一个Eden区域,两个survivor区域(这些区域的比例也可以动态设置的),大部分对象在Eden区域生成。
Eden到survivor当Eden区域满的时候,还存活的对象将被复制到survivor区域
survivor到另一个survivor当一个survivor区域满的时候,此区中的存活对象将被复制到从前一个survivor区域复制过来的并且此时还存活的对象,将被复制到老年区
survivor到老年代 当另一个survivor也满了,并且前一个survivor区域复制过来此时还存活的对象就进入老年代
注意 survivor两个区域是对称的,没有先后关系,而且他是由于复制算法的性能太浪费内存引入的,(复制算法,标记清除算法)一个survivor区域可能存在来自Eden和另一个复制过来的对象,
*老年代
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放入老年代中。因此,可以认为老年代中存放的都是一些生命周期较长的对象
*持久代
用来存放静态数据,比如java Class,Method
持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class (其实对持久代和方法区这里比较模糊 后面要看书吃透,看面筋不行的,还有minor gc和full gc 有点模糊 cms和g1也要很熟 总之 一定要认真看书。。。)
2.垃圾回收标记算法,我就扯了可达性分析(这个面经要一直看,我很久没看就忘了 项目也是)
- 常量和变量的内存分配
- new 一个对象 它的内存分配机制 在内存的哪一块,分配多大(我都不知道想问什么,一顿瞎扯 凉凉)
- 说一下socket吧,(socket没怎么学,java后端逻辑不怎么用到socket,他说这个挺重要的,我曹。。。凉)
- 讲一下Redis吧(扯)
手写代码。。
1.找到众数
给一个int[] {1,2,3,4,5,6,1,1,22,3,14,...}找到出现次数最多的数 和次数 然后就是考虑优的复杂度
第一想到就是map来搞,然后没有考虑到top k ,然后提醒我 我就说。。。 然后他说可以动态更新 找到最大的。。没听懂。。
import java.util.*;
public class What {
public static void main(String[] args) throws Exception {
int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 2, 2, 3, 4, 5};
int n = arr.length;
List<Integer> modalNums = getModalNums(arr);
System.out.println(modalNums);
}
public static List<Integer> getModalNums(int[] arr) {
int n = arr.length;
if (n == 0) {
return Collections.EMPTY_LIST;
}
if (n == 1) {
return Arrays.asList(arr[0]);
}
Map<Integer, Integer> freqMap = new HashMap<>();
for (int i = 0; i < n; i++) { // 统计数组中每个数出现的频率
Integer v = freqMap.get(arr[i]);
// v == null 说明 freqMap 中还没有这个 arr[i] 这个键
freqMap.put(arr[i], v == null ? 1 : v + 1);
}
// 将 freqMap 中所有的键值对(键为数,值为数出现的频率)放入一个 ArrayList
List<Map.Entry<Integer, Integer>> entries = new ArrayList<>(freqMap.entrySet());
// 对 entries 按出现频率从大到小排序
Collections.sort(entries, new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {
return e2.getValue() - e1.getValue();
}
});
List<Integer> modalNums = new ArrayList<>();
modalNums.add(entries.get(0).getKey()); // 排序后第一个 entry 的键肯定是一个众数
int size = entries.size();
for (int i = 1; i < size; i++) {
// 如果之后的 entry 与第一个 entry 的 value 相等,那么这个 entry 的键也是众数
if (entries.get(i).getValue().equals(entries.get(0).getValue())) {
modalNums.add(entries.get(i).getKey());
} else {
break;
}
}
return modalNums;
}
}
- 海量log怎么持久化到数据库
老师问:比如王者荣耀这个游戏 |game|name|creattime| ...等字段 然后每5秒刷一个延迟记录一分钟就是12个 |100|22|99|22|44|.....| 然后一共有10g这种log,然后如何持久化到数据库中用来做其他的处理分析
- 10g log如何读取
- 读取后如何处理成vo
- 入库持久化设计