# 多益网络
💣 过程简述
多益网络是我室友帮忙内推的,本来我并没有投递该公司。面试时,三个面试官轮番上阵,也可以看出在刷 KPI。面试难度也有,相对问题与主流问题不太一样,看得出也并没有完全按照题库中问,如问到了如何实现一个扫描库,如何实现 TreeView 等。最后谈薪水的时候,有个面试官可能觉得我要价过高,甚至忍不住笑了,这对于一个面试官来说做得并不够好。
这个岗位在多益这个游戏公司里并不重要,它们主要以 C++ 为主,Java 已经不算是主流,Android 端开发在这个公司更是缺人。
PS:面试之前先进行了HR面,直接问我是否接受 996,并且急需入职。最终这次面试并没有成功,多益网络也是著名的「广州三大坑」之一。其 Boss 的一些奇葩观念知乎可查。
自我介绍
介绍自己的项目,项目中用到了谷歌的 ZXing 库,如果自己实现这个扫描二维码的框架,因为外界条件不清晰,如何改进
面试官给提供的思路是,由于光线或者手机摄像头对准的位置等外界因素,所以会导致二维码模糊不清无法读取,那么改进方法就是精准地显示二维码的位置。常用的技术是界面上会出现一个正方形的框,然后当摄像头识别到二维码后,会放大到二维码那里,聚焦。
TCP 和 UDP 的区别
现在视频是用 TCP 还是 UDP?如果 UDP 发送数据丢包,怎么解决这个问题
UDP 丢包率高的原因有:
- 接收端处理时间过长导致丢包
- 发送的包巨大丢包
- 发送的包较大,超过接受者缓存导致丢包
- 发送的包频率太快
解决方法有:
- 控制报文大小
- 增加系统发送或者接受缓冲区的大小
- 增加应答机制,处理完一个包后,再继续发包
- 在应用层实现丢包重发机制和超时机制,确保数据包不丢失。
http 和 https 的区别
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 中添加一个已经存在的元素,则不会覆盖原有的集合元素。
HashMap 原理是如何实现的,是线程安全的吗?如果让你来写,怎么实现线程安全
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<>(); // 子节点
RecyclerView 的 item 复用怎么实现
AsyncTask 的底层是如何实现的(原理)
与 Handler 之间的区别,Handler 消息传递机制
常用的设计模式怎么写,单例模式怎么写,工厂模式,观察者模式
Retrofit 和 OkHttp 之间的区别
Retrofit 底层对网络的访问默认是基于 OkHttp,不过 Retrofit 非常适合于 Restful url 风格的请求,更多使用注解的方式提供功能,下面这个网络请求流程图,可以更直观的理解 OkHttp 和 Retrofit 的关系。
网络请求:App 发起网络请求,Retrofit 通过注解配置请求参数、Header、BaseUrl 之后,通过 OkHttp 发送网络请求给服务器;
服务器响应:服务器返回响应数据,OkHttp 将数据传递给 Retrofit,再把数据直接传递给应用,界面刷新反馈结果给用户;
- Retrofit 主要负责应用层面的封装,主要方便使用,比如请求参数、响应数据的处理,错误处理等等;
- OkHttp 主要负责 socket 部分的优化,比如多路复用、buffer 缓存、数据压缩等;
网上一般推荐 RxJava + Retrofit + OkHttp 框架,Retrofit 负责请求的数据和请求的结果,使用接口的方式呈现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间切换。
OkHttp 的实现原理
Service 的两种启动方式,两种方式之间的区别
广播的类型和注册方式,静态注册和动态注册之间的区别
Glide 的原理,缓存机制
Lru 算法是如何实现的
如何判断一个单向链表是否有环,并返回环的长度