首页 > 笔经面经 > 双非本科非科班 抖音Android面筋(被调剂到iOS了)

双非本科非科班 抖音Android面筋(被调剂到iOS了)

头像
欧了個姆
编辑于 2019-10-11 16:05:11 APP内打开
赞 24 | 收藏 86 | 回复37 | 浏览4688
楼主是20届,来自广东工业大学数字媒体技术专业的一个女生🤣跟校友一起上岸头条了,所以发个面筋回馈牛客。
标题写个双非本科非科班,其实也不应该是关注的重点,就当做是用来吸引一下大家注意力吧😅
我的简历可以说是毫无优势,除了学历短板以外,大厂实习也是没有的,跟各位大佬拿到同一个公司的offer其实我的压力也很大😅
9月上旬面完所有面试,2周后,hr联系我说Android那边没通过,问我调剂到iOS是否接受,答应之后给我发了iOS的意向书。
秋招除了抖音iOS offer,还拿了一个百度Android的白菜档位的offer。(秋招投的公司也不多)
一路走来其实挺不容易的,春招到秋招可以说踩了很多坑,现在回想起来就是很多个“早知道这样我就不xxx了”……

面经其实一早就写好了,一二面的问题都有复盘,三四五面是连着面的,面完很累记不清了就没写了。
至于为什么是五面,这个可能是跟部门有关吧,跟我同一个流程的大佬,也是会有20min到30min的电话一面,这个应该是简历面。

    一面:

    1.activityservice怎么通信

    (回答了启动service的方式。。但是面试官说让我说怎么通信不是问启动。。。我就从两种启动方式说了一下不同的启动方式怎么通信了,但是面试官问我还有吗答不出了,扯了一下activity和service的跨进程的通信)

    2.因为扯到了跨进程通信,就让我说一下安卓上有什么跨进程的通信方式

    (答了广播,socket,基于binder那些,剪贴板,文件,管道。。。都是下意识说的,没答全)

    3.说到了管道,让我说一下在Android的时候会用到管道吗

    (我说了平时没有用到,但是linux下敲命令行的时候会用到"|",这个实际上会用到管道,后面还补充说Android的Handler机制是用到管道的。。面试官说平时基本不怎么用到的)

    4.Java 两个整型相加怎么知道有没有溢出

    (我说如果是int相加,就用long保存结果,然后与Integer.MAX_VALUE和Integer.MIN_VALUE比较。然后如果long都存不下的话,可以用Java提供的一些数值类来表示数字,进行运算(回来查了一下,BigInteger和BigDecimal可以提供这种大数字的运算)。面试官说如果不用这些呢,如果是两个正数相加呢,我没答上来,但我说了一下正数相加溢出的话符号位会改变。。。问了面试官,也是这个答案,他正数相加溢出会变成负数)

    5.Java怎么停止线程

    (这是我之前面试没回答上来的问题似乎,但那时问的是安全地停止一个线程。。。我就答了捕获InterruptException和isInterrupt()标志位那些。。(跑题)然后面试官说不是这个,就说怎么停止线程就好。。。于是回答了线程池的shutdownAll()方法那些;还说了一下设置标志位,作为循环停止的条件;然后还说如果是有looper的线程,可以停止looper。。。感觉不是答得很好)

    (1.标记位;2.Thread类的interrupt()方法(stop()已废弃);3.线程池使用shutDownAll();4.Looper的quit方法或quitSafely方法)

    6.假如有4个线程同步开始,其中第4个线程要等前面三个线程执行完进行些统计操作,要怎么操作呢。

    (说了CountDownLatch和那个栅栏CyclicBarriy(不会拼)?但是说得不太好,因为我用得少不是特别理解,面试官看出来我回答得不好,让我说说它们的区别,这个应该回答得没什么大问题?(后来发现问题大了!我把countDownLatch说成信号量了,给记串了,但是面试官看起来也没发现?))

    7.如果不通过使用Java的并发包的现成类库来实现一个CountDownLatch,怎么实现?

    ((嗯这个也是描述信号量的,所以是错误回答)我回答是(感觉基本是下意识回答的,没有脑子了),维护一个volatile的数字,然后通过++和--操作来控制数字的大小,并用sychronized块保证++和--操作的原子性;然后当一个线程要调用countdown操作的时候,发现这个值为0,那么就主动调用wait()方法;如果一个线程调用++的操作,那么当从0加到1的时候,就调用锁上的notifyAll(),来通知沉睡的线程。因为使用notifyAll唤醒的线程可能有多个,所以被唤醒的线程还需要再次检查数字是不是为0,应该需要一个循环检查的逻辑)

    8.那么使用你这个CountDownLatch的这3+1个线程,一共需要几个锁呢?

    (一个呀,因为只有在同一个锁上才能保证互斥呀)

    9.知道大顶堆和小顶堆吗,一个数组建堆,时间复杂度是多少呢?

    (原地建堆O(n),但是数学证明没搞懂,如果逐个插入,则是O(nlogn)(这个回答的时候不是很清晰,这个答案不太自信))

    10.在堆中找指定的一个元素复杂度是多少?

    (答了O(n)。。。我说又不是二叉搜索树这种更加有序的结构,如果找的不是根元素,那么也只有遍历查找了)

    11.看你简历上也有写网络方面的知识,https的过程说一下

    (这是我之前面试跪过的题目。。。但是我这次不怕了。。给他说了一下ssl层的握手过程,然后面试官有问我ssl握手生成的这几个随机数有什么用,我说了这几个随机数是用来生成真正的对称密钥的,还可以防止重放攻击,并且三个伪随机数更接近真正的随机)

    二面:
    1.UnicodeASCII的区别
    (说实话这个我不记得,我就说了一下Java是Unicode编码,然后占用16bits,然后说ASCII编码范围应该比Unicode要小)
    2.Unicode有哪些种类?Java是哪种?
    (不知道。。面试官说是utf-8就是一个。。(我知道Java不是标准的UTF,但是我没说))
    3.json这种格式知道吗,是怎样的,有什么用?
    (存储一些键值对(属性)吧,可以用花括号表示一个json对象,还有方括号表示json数组;json这种格式可以用来表示一个序列化的对象)
    4.序列化除了json还有什么可以使用?
    (xml格式也可以吧)
    5.说说Android上的序列化?
    (serializable和Parcelable,使用方式讲了一下)
    6.Javaserializable有个Id,你知道是有啥用的吗?
    (类的版本吧,定义之后可以最大限度恢复对象,说了一下serializable可以用于深拷贝)
    7.深拷贝浅拷贝说说?
    (描述了一下定义吧)
    8.Objecthashcode()用来干嘛,怎么自己实现hashcode

    (头条之前问过我这个问题,但是我没讲好(所以才会挂嘛)。

        这次的话,我说了一下

            1.hashcode的作用(用在hashmap这种数据结构中的散列和查找);

            2.我认为一个好的hashcode定义的要求:(

                    (1)不能经常改变,因为改变会导致无法找到原本的key对象;

                    (2)最好跟对象的一些数据相关,能够唯一标识一个对象(比如你每个对象都有不会改变的名字的话,就可以根据对象名字生成);

                    (3)在一个整型中0和1分布尽可能均匀,不能前面都是000后面才有几个数字,这样比较容易产生碰撞)

            3.谈谈根据以上要求怎么生成hashcode)

    (复盘:可以吹吹哈希洪范攻击,还有怎么解决哈希洪范攻击)
    9.JNI讲讲?
    (讲了一下System.load之类的加载.so库的两个方法,还有Java方法和cpp方法的签名匹配)
    10.一个a包里的B类的c方法,cpp代码中的方法一定要a_B_c()这样吗
    (也可以自定义映射,我有看到别人的代码中有这样的映射)
    11.Java的泛型讲讲,有啥用?咋实现的
    (有泛型方法和泛型类;实现就是编译期的时候进行了转型,有对应的虚拟机指令;一般来说运行时不可以获取泛型参数的类型,但是有一种情况可以)
    12.在什么情况下可以在运行时获取泛型参数
    (在父类是一个泛型类,子类继承这个父类并实现这个泛型参数的时候,可以通过反射getGenxxxType()的方法获取泛型参数列表具体的泛型)
    13.上界通配符和下界通配符讲讲

    (这个讲得不太好,就是说了一下写法,还有每个写法表示的是什么)

    (List<? extends T>:get:T;put :任何都不行;List<? super T>:get:Object;put:T)
    14.两个方法,一个方法的参数是泛型的,一个参数是正常的类(如String),会怎么样?

    (我认为不会报错吧,因为泛型参数可以匹配所有类型参数,应该会优先调用更准确的方法……面试官觉得会报错,因为编译器会分不清应该调用哪个方法;我还是认为不会报错……他们是包含与被包含的关系,就像一个方法有Object参数和String参数,调用的时候如果传入一个String类型的参数,静态委派也是优先调用String的那个方法)

    (回到宿舍实测,不会报错)
    15.输入网址到返回ip的过程
    (讲了一下DNS服务的请求过程)
    16.假设你你缓存的ip地址过时了,怎么办
    (我猜测说,要是ip过期的话,会无法响应请求,那客户端就可以再走一次DNS请求的流程(这个答案不好哈哈哈哈))
    17.你认为DNS机制是怎么解决这个问题的,你可以尝试参考http的缓存机制想想
    (每次使用之前与DNS服务器对比一下?(is_modify_since?)或者定义一个过期时间,过期之前都可以直接使用这个ip地址)
    18.广播有几种,有序和粘性讲讲
    (粘性不记得了,有序讲了一下优先级)
    19.注册广播的方式,你觉得静态注册广播这个是什么时候执行的呢
    (静态注册和动态注册?执行应该是开机之后相关服务启动之后吧(猜测))
    20.本地广播
    (只能在进程内传播消息,使用handler实现,工作机制就是……说了一下广播过滤那些吧,然后再发消息到指定的广播接收器去处理)
    21.线程进程区别
    (1.进程是系统分配资源的单位;2.线程是系统分配和调度cpu资源的单位;3.线程独立性没有进程高;4.一个进程可以有多个线程……等等)
    22.讲到内存资源,线程有什么数据是私有的

    (虚拟机栈,以及上面的方法参数?还有ThreadLocal的话可以定义一个线程私有的对象,之后说我知道ThreadLocal的实现方式,然后就跟他说了一下ThreadLocal以及它的ThreadLocalMap那些……以及它不会内存泄漏的原因)

    (面后复盘补充,jvm中虚拟机栈、程序计数器、本地方法栈都是线程私有的)
    23.算法:二叉树的右视图
    (思路是层次遍历最后一个,但是连层次遍历都写错了)
    24.算法:两个栈实现队列
    (写出来了,但是面试官说可以优化,没说好)
    25.讲讲实习项目遇到的问题

    (项目的长时间运行崩溃的问题:

            1.描述程序的整个结构运作过程;

            2.问题处理思路:

                    (1)如何探究原因;

                    (2)找到原因后尝试解决,尝试提出解决方案;

                    (3)无法解决,写好日志分析报告交给leader;

            面试官:那最后这个问题解决了吗?

            我:我离职了不知道情况了。

            面试官:这个问题你可以问问他们解决了没有。

            我:那我想问一下您认为有什么解决办法吗?

            面试官:没有接触这一类的问题,我也不清楚。)
    26.有什么想问我的:

    工作氛围(哪方面的氛围?学习氛围、加班情况);

    程序员职业发展建议以及如何快速融入工作。

    三面:(记不全)

    1. 自我介绍

    2. 内核态用户态的区别

    3. 用户态可以访问内核态的内存吗,你说的一些有风险的指令,具体是怎么阻止用户态程序去执行有风险的指令的

    4. 既然用户态不可以访问内核态的内存,那么在做一些比如网络连接的操作的时候肯定需要内核态内存,用户态程序怎么做到使用内核态内存的

    5. 说到跨进程通信方式,你知道有什么跨进程通信方式吗?

    6. 你说到的共享内存,管道,消息队列,binder他们之间有什么区别吗?

    7. 你说到广播、内容提供器也有使用binder与AMS通信,那他们与binder之间有什么区别吗(广播、内容提供器的实质是不是就是binder)?

    8. 为什么要写这样一个测速的程序?

    9. 两个Activity,一个显示商品列表,一个实现商品详情页,在商品详情页点了关注之后,怎么使得返回商品列表之后也更新了关注状态呢?

    10. 你说的发布订阅模式,你知道有什么框架使用了这个设计模式吗?

    11. 假如两个Activity数据量比较大呢,要更新相当多的东西呢?

    12. 你把model设置为单例的话,那这个列表不断下滑,加载更多内容,最后导致占用相当多的内存怎么办?liveData、ViewModel你可以了解下

    13. 算法题:"www.toutiao.cn"转成"cn.toutiao.www"

    14. 有什么想问我的?(在头条工作的体验?这个你可以问hr)

    四面:(记不全)

    1. 你是哪里人?为什么选择投上海的岗位?除了上海,还有什么意向的城市吗?为什么不喜欢北京?上海也是这样啊?

    2. 问专业。与程序相关的课程有多少?有学计算机组成原理、计算机网络吗?

    3. 除了看书以外学习途径?你在安卓的群上一般讨论什么东西?印象深刻的是什么?

    4. 你在wifi***是上海的实习吗?你这个在wifi***的部门不是专门做安卓的吧?有没有安卓方面导师?都是靠你自己摸索的吗?项目有几个人在负责,都是你在负责吗?

    5. 因为什么而接触安卓?你在这个团队里负责什么角色?贡献了多少代码比如有多少页面是你写的?

    6. 有没有什么社团之类的让你接触安卓?

    7. 有什么想问我的?(问了对应届生的期望)

    hr面:(记不全)

    1. 你认为你前面的面试表现怎么样?

    2. 你是女生为什么要来上海这么远工作?

    3. 你觉得抖音(还是字节跳动来着)怎么样?

    4. 你提到技术驱动型,你认为怎么样才是技术驱动型公司?

    5. 你提到你是抖音的用户,但是使用频率不高,是因为什么,因为抖音的内容质量不好吗?

    6. 你提到抖音是音视频相关,你对音视频开发是比较感兴趣吗?

    7. 实习工作中有没有遇到什么较大的问题?这个问题是什么原因有没有探究?

    8. 大学期间有没有遇到什么比较大的挫折?

    9. 你提前批有投过头条没有通过,是因为没有准备好吗?

    10. 如果通过了面试,你会提前来实习吗?

    11. 有什么想问我的?(在头条工作的体验?我这个岗位的发展空间?)


37条回帖

回帖
加载中...
回帖

本文相关内容

相关热帖

近期热帖

热门推荐