腾讯测试开发岗实习面试2018

话不多说 一首凉凉送给自己 自己学后端 然后腾讯投的测试开发岗位,今天面完发现问的挺难得呀 =-=

关于实习

  • oracle实习做的什么呀?
    web ui测试 用selenium写自动化case
    然后看过底层的源码吗? 看你妹啊。。我是做后端的。。。反正实习做的东西没讲好,凉了第一步

关于项目

介绍自己的项目,这个是每个公司都会让你介绍的(我觉得这个要背一背,毕竟一个项目这么多东西,需要总结一下),

问的问题

  1. 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.垃圾回收标记算法,我就扯了可达性分析(这个面经要一直看,我很久没看就忘了 项目也是)
  1. 常量和变量的内存分配
  2. new 一个对象 它的内存分配机制 在内存的哪一块,分配多大(我都不知道想问什么,一顿瞎扯 凉凉)
  3. 说一下socket吧,(socket没怎么学,java后端逻辑不怎么用到socket,他说这个挺重要的,我曹。。。凉)
  4. 讲一下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 modalNums = getModalNums(arr);

        System.out.println(modalNums);
    }

    public static List getModalNums(int[] arr) {
        int n = arr.length;

        if (n == 0) {
            return Collections.EMPTY_LIST;
        }

        if (n == 1) {
            return Arrays.asList(arr[0]);
        }

        Map 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> entries = new ArrayList<>(freqMap.entrySet());
        // 对 entries 按出现频率从大到小排序
        Collections.sort(entries, new Comparator>() {
            @Override
            public int compare(Map.Entry e1, Map.Entry e2) {
                return e2.getValue() - e1.getValue();
            }
        });

        List 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;
    }
}
  1. 海量log怎么持久化到数据库

老师问:比如王者荣耀这个游戏 |game|name|creattime| ...等字段 然后每5秒刷一个延迟记录一分钟就是12个 |100|22|99|22|44|.....| 然后一共有10g这种log,然后如何持久化到数据库中用来做其他的处理分析

  • 10g log如何读取
  • 读取后如何处理成vo
  • 入库持久化设计

你可能感兴趣的:(腾讯测试开发岗实习面试2018)