admin管理员组

文章数量:1531281

前言

坐标:小米base南京,百度base上海。

小米一面8.28

  • 深挖项目和竞赛
    主要是实验室智能机器人相关的项目(系统设计、机器人视觉、算法落地);
    经典被问为什么研究算法相关的,工作要找开发(算法太难了TT);
    竞赛主要是数学建模(两次国赛两次省赛)。
  • 对安卓系统有哪些理解
    一开始答的activity运行起来之后的一系列过程,答偏了,面试官想问自己对安卓系统的理解,坦诚没有思考过。(问点Java基础吧)
  • JAVA中的引用类型
    1. 强引用,任何时候都不会被;垃圾回收器回收,如果内存不足,宁愿抛出OutOfMemoryError
      使用场景:我们平常大部分使用的场景都是使用了强引用,比如new创建对象,反射获得一个对象等。
    2. 软引用,只有在内存将满的时候才会被垃圾回收器回收,如果还有可用内存,垃圾回收器不会回收。
      软引用可以和一个引用队列进行关联,如果这个软引用的对象被垃圾回收,就会将这个软引用加入到关联的队列中去。 可用于高速缓存。
    3. 弱引用(WeakReference),生命周期更短,只要垃圾回收器运行,就肯定会被回收,不管还有没有可用内存。
      使用场景: 弱引用用于生命周期更短的,对内存更敏感的场景中,比如占用内存很大的Map,java api中就提供了WeakHashMap使用,就会是的大Map被及时清理掉。
    4. 虚引用(PhantomReference),虚引用等于没有引用,任何时候都有可能被垃圾回收。虚引用必须和引用队列联合使用,引用队列的作用和软弱引用一样。
      使用场景: 我觉得他的使用场景应该在判断一个对象是否被垃圾回收了,什么时候引用队列有新的引用入队了,就说明他被回收了。
  • 栈和队列,应用场景
    FILO,FIFO。使用场景答得比较随意,提了一些栈的应用(方法调用过程对应入栈出栈、安卓activity任务栈),队列主要用在一些需要公平处理的场景,消息队列。阻塞队列。
    这个问题被问过很多次,每次都是随意回答一下,希望大佬们评论区指点一波怎么答最好。
  • 生产者消费者问题中的锁的传递,PV操作
    生产者:每次执行时先判断当前库存是否超过负载(最大库存),超过的话就wait,释放锁;否则库存自增,然后唤醒其他线程。
    消费者:每次执行时先判断当前库存是否为零,是的话就wait,释放锁;否则库存自减,然后唤醒其他线程。
    PV操作当时没答上来,后来查了一下应该是基于信号量的方式实现消费者生产者问题。因自己不能确保理解正确了,先丢个链接Java实现PV操作 ,有大佬理解的可以评论区讨论一下!
  • 宏观的描述垃圾回收的思路
    先判断哪些对象需要回收,然后根据对象特性确定相应的回收算法,选用合适的垃圾回收器。
  • 怎么判断对象该不该回收,说说自己的理解。如果出现循环引用怎么办
    引用计数法、可达性分析法
  • 可达性分析法中淘汰的对象一定会被回收吗?
    即使在可达性分析算法中不可达的对象,也并非"非死不可"的,这时候他们暂时处在"缓刑"阶段。要宣告一个对象的真正死亡,至少要经历两次标记过程: 如果对象在进行可达性分析之后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者finalize()方法已经被JVM调用过,虚拟机会将这两种情况都视为"没有必要执行",此时的对象才是真正"死"的对象。
    如果这个对象被判定为有必要执行finalize()方法,那么将会被放置在一个叫做F-Queue的队列之中,并在稍后由一个虚拟机自动建立的、低优先级的Finalizer线程去执行它(这里所说的执行指的是虚拟机会触发finalize()方法)。finalize()方法是对象逃脱死亡的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模标记,如果对象在finalize()中成功拯救自己(只需要重新与引用链上的任何一个对象建立起关联关系即可,譬如把自己(this关键字)赋值给某个类变量或者对象的成员变量),那在第二次标记时它将会被移除出"即将回收"的集合;如果对象这时候还是没有逃脱,那基本上它就是真的被回收了。
  • 具体怎么做呢,挑一个垃圾回收算法谈谈自己的理解
    说了复制算法。
  • 复制算有什么问题
    仅针对新生代效果好,浪费内存(只能用一半)转移存活对象时会导致用户线程无法定位引用对象。
  • tcp怎么保证可靠性
  1. 序列号和确认号机制:
    TCP 发送端发送数据包的时候会选择序列号,接收端收到数据包后会检测数据包的完整性,如果检测通过会响应确认号表示收到了数据包。
  2. 超时重发机制:
    发送端发送了数据包后会启动一个定时器,如果一定时间没有收到接收端的确认,将会重新发送该数据包。
  3. 对乱序数据包重新排序:
    从 IP 网络层传输到 TCP 层的数据包可能会乱序,TCP 层会对数据包重新排序再发给应用层。
  4. 丢弃重复数据:
    从 IP 网络层传输到 TCP 层的数据包可能会重复,TCP 层会丢弃重复的数据包。
  5. 流量控制:
    TCP 发送端和接收端都有一个固定大小的缓冲空间,为了防止发送端发送数据的速度太快导致接收端缓冲区溢出,发送端只能发送接收端可以接纳的数据,为了达到这种控制效果,TCP 用了流量控制协议(可变大小的滑动窗口协议)来实现。
    【滑动窗口详解】
    滑动窗口通俗来讲就是一种流量控制技术。
    它本质上是描述接收方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据,如果发送方收到接收方的窗口大小为0的话,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据报的到来。首次发送数据时的窗口是链路带宽决定。
  6. 拥塞控制:在数据传输过程中,可能由于网络状态的问题,造成网络拥堵,此时引入拥塞控制机制,在保证TCP可靠性的同时,提高性能,具体为慢启动、拥塞避免、快重传与快恢复……
  • 算法题:给定一个多叉树,返回这棵树哪一层所有的节点和最大,返回层号。
    本质上就是层序遍历,维护一个层节点和。多叉树第一次写hhh

    复制代码

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    import java.util.*;

    public class Duochashu {

      public static void main(String[] args) {

          TreeNode root = new TreeNode(0);

          root.children.add(new TreeNode(1));

          root.children.add(new TreeNode(2));

          root.childr

本文标签: 小米三面意向SP