首页 > Android秋招,字节跳动一面
头像
想要一个offer就好
编辑于 2021-08-29 16:41
+ 关注

Android秋招,字节跳动一面

()开局自我介绍。

项目部分:
ijkplayer有研究过吗?(没有)


Java:
  1. int、float、double几个字节?(int、float4个字节,double 8个字节)
  2. Java有操作符重载吗?(没有,C++就有操作符重载)
  3. String进行+操作底层实现 (使用Stringbuidler 进行append操作)
  4. Java传值是值传递还是引用传递? (值传递,但是对于对象传递其值地址,修改后会改变其值)
  5. 参数对象对其地址进行修改后源地址会不会修改? (不会,对地址进行修改后引用新的地址,原有地址不会改变)
  6. Java同步机制有哪些?    (锁,这里应该展开来讲讲锁的一些机制和原理以及为什么需要同步)
  7. 为什么Java要有线程池
    线程池就是对线程进行管理的一种方式,可以防止以下情况的出现:
        1)频繁的创建线程、销毁线程浪费资源
        2)线程数过多导致线程切换过多,效率低,线程过少导致任务等待时间过长,效率低
        3)线程重用效率低,不能够很好的利用线程资源
        4) 不能提供定时执行、定期执行、单线程、并发数控制等功能。
  8. 锁static方法跟锁普通方法区别? (锁普通方法作用与实例,锁静态方法作用于类)
  9. JVM运行时内存区域?    (把五个区域以及作用都简单讲了一下)
  10. GC发生在哪个区域?        (堆区,这里应该再讲讲GC的一些机制和原理)
  11. 回调函数中为什么参数不加final会报错?    (加上final后存放位置变为方法区的常量池,这样子其他线程才可以获得到)
  12. 讲一讲泛型(这里应该把泛型的机制详细讲一讲才对)
  13. 泛型类型擦除后是什么数据类型?(其定义父类,如ArrayList是List,没有指定的话就是Object)
  14. 异常机制大概讲一下    (大概讲了异常的几种机制)
  15. Error能不能Catch住    (不可以,是一种不可检异常)
  16. 为什么Java要有异常机制,C 没有(Java语言按照面向对象的思想来处理异常,使得程序具有更好的维护性

Android:
  1. 详细讲一下Handler机制    (详细讲了一圈)
  2. MessageQueue使用了什么数据结构? (为了确保插入时维护时间顺序,因此使用了链表来做数据结构)
  3. Looper跟MessageQueue以及Handler的数量情况    (一个线程一般只有一个Looper和messagequeue,可以有多个 Handler)
  4. Looper.get为什么能够获得Looper,底层是怎么实现的?(它是一个ThreadLocal变量,在调用Looper.prepare()的时候就会把该实例存在线程当中
  5. 讲一讲TheadLocal (是一种将变量放到线程本地的操作,接下来在操作时就能够直接操作本地变量,本质上是一个HashMap来做的,)
  6. 了解HandlerThead吗?(不知道)复盘:(HandlerThread对象start后可以获得其Looper对象,并且使用这个Looper对象实例Handler,之后Handler就可以运行在其他线程中了
  7. 让你创建一个线程后初始化Looper,然后再外部如何确保获取到这个Looper是已经初始化的了?(可以通过sleep等待子线程Looper完)
  8. 讲一下OKHTTP的调用方法    (同步调用:okhttp.send()  异步调用: okhttp.excute())
  9. 讲一下OKHTTP的责任链模式    (责任链模式是在okhttp发送请求时会把请求一层一层进行处理,其中有头部处理,复用处理等等)
  10. 讲一下OKHTTP的责任链调用过程
    在发送一个任务之后,任务会进入异步消息队列,进入之后一旦被调度就会进行职责链处理,主要有五个部分:
    RetryAndFollowUpInterceptor: 该部分进行两部分的操作:在请求失败之后判断是否需要重新发起请求。   当服务器返回当前请求需要进行重定向时直接发起新请求,并且在条件允许的情况下复用当前连接
    BridgeInterceptor: 对头部进行处理,例如编码、压缩处理、设置cookie、内容长度设置。
    CacheInterceptor:对缓存进行处理,一般有三个步骤:
    1) 判断是否有可用缓存,有的话若无网络则使用。
    2) 网络请求回来之后判断是否需要更新缓存,若是更新。若不是则更新命中率。
    3)如果判断当前缓存失效,删除
    ConnectInterceptor: 负责判断是否复用连接、使用连接。主要有以下步骤:
    1) 判断该地址是否已经有连接,若有直接使用原有连接,没有进入第2步(okhttp确保一个地址只发起一个连接)
    2) 若找不到连接,则进行配置路由,配置之后再次进行查找连接,若查找连接成功复用连接,这里是为了防止http域名压缩之后出现的情况
    3) 找不到则发起新连接,且更新到连接池
    4)判断连接池有无新的连接出现,若有则删除新连接
  11. CallServerInterceptor:负责向服务器发起真正的访问请求,并在接收到服务器返回后读取响应返回。
  12. Android中还有什么地方用到了责任链模式 (回答了事件分发机制且简单讲了事件分发的过程)
  13. 事件分发上级是如何知道下级是否拦截的    (通过返回值)
  14. sharepreferrence  apply跟commit区别
    apply()方法是异步的,在提交文件修改之后,会先将文件写入到内存当中,然后创建线程异步将文件写入到外存当中。
    commit()方法是同步的提交之后马上写入到外存并且返回值。
  15. apply之后立即读数据能够读到吗?(可以,会先放到内存当中,sharedPreferences通过xml文件存储数据,获取的时候在通过解析xml文件获取
  16. apply过程中的缓存有吗?(有的)
  17. 了解动画吗?(不了解)

计算机网络:
  1. TCP UDP区别?
    可靠性角度:TCP可靠、UDP不可靠
    连接建立角度:TCP建立连接、UDP不建立连接
    传输数据角度:TCP通过字节传输、UDP通过报文传输
  2. TCP如何确保可靠的?
    这个问题还是答得少了,应该多答一些:
    连接建立的角度:通过三次握手建立连接、四次挥手断开连接
    在防止传输出错的角度:通过校验和验证是否出现错误
    在防止失序的角度:通过给每个字节编号来实现
    流量控制的角度:通过拥塞控制来进行实现
    在防止丢包的角度:通过停止等待协议实现
  3. 直播使用TCP还是UDP?
    必然是UDP

操作系统:
  1. 大端小端的概念(数据地位放在低地址为小端,数据地位放在高地址为大端)
  2. Java是大端还是小端?(不知道)(小端存储
  3. Android是大端还是小端?(不知道)(应该跟Java一致都是小端)
  4. 网络是大端还是小端?(网络是大端)

算法题:
合并两个有序链表(送分题,感谢面试官)

反问:
Q : 简单评价一下?
A : 基础不咋地,Java基础薄弱,Android多了解一些开源库,代码规范还好。
Q :啥时候发感谢信
A : 我把情况报给HR,HR决定。


总结:
这次面试感觉挺舒服的,面试官很好,就是自己Java太久没看了实在是垃圾,算法做出来了,很简单。
不过应该要感谢信了。下次继续。

个人复盘:
虽然收了感谢信但是这次面试还是受益匪浅,暴露出自己的几个缺点:
1、太久没有面试,面试的一些经验出现丢失,应该是自己遇到会的东西多讲一些,而不是等着面试官问。
2、Java基础不扎实,需要补充Java基础知识。
3、Android基础还好,但是需要有更加深度、全面的学习

接下来的面试准备有两个方向:
1、恶补Java基础
2、将Android会的部分进行深挖,高度概括总结,让面试官问的时候可以打出一套组合拳。


更多模拟面试

全部评论

(3) 回帖
加载中...
话题 回帖