# 多益网络

💣 过程简述

多益网络是我室友帮忙内推的,本来我并没有投递该公司。面试时,三个面试官轮番上阵,也可以看出在刷 KPI。面试难度也有,相对问题与主流问题不太一样,看得出也并没有完全按照题库中问,如问到了如何实现一个扫描库,如何实现 TreeView 等。最后谈薪水的时候,有个面试官可能觉得我要价过高,甚至忍不住笑了,这对于一个面试官来说做得并不够好。

这个岗位在多益这个游戏公司里并不重要,它们主要以 C++ 为主,Java 已经不算是主流,Android 端开发在这个公司更是缺人。

PS:面试之前先进行了HR面,直接问我是否接受 996,并且急需入职。最终这次面试并没有成功,多益网络也是著名的「广州三大坑」之一。其 Boss 的一些奇葩观念知乎可查。

  1. 自我介绍

  2. 介绍自己的项目,项目中用到了谷歌的 ZXing 库,如果自己实现这个扫描二维码的框架,因为外界条件不清晰,如何改进

    面试官给提供的思路是,由于光线或者手机摄像头对准的位置等外界因素,所以会导致二维码模糊不清无法读取,那么改进方法就是精准地显示二维码的位置。常用的技术是界面上会出现一个正方形的框,然后当摄像头识别到二维码后,会放大到二维码那里,聚焦。

  3. TCP 和 UDP 的区别

  4. 现在视频是用 TCP 还是 UDP?如果 UDP 发送数据丢包,怎么解决这个问题

    UDP 丢包率高的原因有:

    • 接收端处理时间过长导致丢包
    • 发送的包巨大丢包
    • 发送的包较大,超过接受者缓存导致丢包
    • 发送的包频率太快

    解决方法有:

    • 控制报文大小
    • 增加系统发送或者接受缓冲区的大小
    • 增加应答机制,处理完一个包后,再继续发包
    • 在应用层实现丢包重发机制和超时机制,确保数据包不丢失。
  5. http 和 https 的区别

  6. HashSet 了解吗,介绍一下原理是如何实现的

    HashSet 实现自 set 接口,set 集合中元素无序且不能重复;

    HashSet 底层是基于 HashMap 实现的,当你 new 一个 HashSet 时,实际上是 new 一个 map,执行 add 方法时,实际上是调用 map 的 put 方法;将 key-value 放入 HashMap 中,根据 key 的 hashCode 返回值决定存储位置,如果 hash 相同,则存储位置相同。如果两个 key 的 equals 比较返回 true,那么新添加的 value 就会覆盖原有的 value,key 不会覆盖。如果向 HashSet 中添加一个已经存在的元素,则不会覆盖原有的集合元素。

  7. HashMap 原理是如何实现的,是线程安全的吗?如果让你来写,怎么实现线程安全

  8. RecyclerView 怎么实现树形结构 TreeView

    需要构造节点类 Node,含有的属性包括:

    private String id;  // 节点的唯一标识
    private String pid; // 当前节点的父节点
    private int level;  // 所在层级
    private boolean expand; // 当前是否是展开的状态
    private int choosed;    // 选中的状态
    private String showText;    // 展示的文本
    private List<Node> childs = new ArrayList<>();  // 子节点
    
  9. RecyclerView 的 item 复用怎么实现

  10. AsyncTask 的底层是如何实现的(原理)

  11. 与 Handler 之间的区别,Handler 消息传递机制

  12. 常用的设计模式怎么写,单例模式怎么写,工厂模式,观察者模式

  13. Retrofit 和 OkHttp 之间的区别

    Retrofit 底层对网络的访问默认是基于 OkHttp,不过 Retrofit 非常适合于 Restful url 风格的请求,更多使用注解的方式提供功能,下面这个网络请求流程图,可以更直观的理解 OkHttp 和 Retrofit 的关系。

    Retrofit 底层

    网络请求:App 发起网络请求,Retrofit 通过注解配置请求参数、Header、BaseUrl 之后,通过 OkHttp 发送网络请求给服务器;

    服务器响应:服务器返回响应数据,OkHttp 将数据传递给 Retrofit,再把数据直接传递给应用,界面刷新反馈结果给用户;

    • Retrofit 主要负责应用层面的封装,主要方便使用,比如请求参数、响应数据的处理,错误处理等等;
    • OkHttp 主要负责 socket 部分的优化,比如多路复用、buffer 缓存、数据压缩等;

    网上一般推荐 RxJava + Retrofit + OkHttp 框架,Retrofit 负责请求的数据和请求的结果,使用接口的方式呈现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间切换。

  14. OkHttp 的实现原理

  15. Service 的两种启动方式,两种方式之间的区别

  16. 广播的类型和注册方式,静态注册和动态注册之间的区别

  17. Glide 的原理,缓存机制

  18. Lru 算法是如何实现的

  19. 如何判断一个单向链表是否有环,并返回环的长度