20届秋招头条Android面经(已拿iOS offer,附部分解答)

一面:

1.activity和service怎么通信

(回答了启动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.Unicode和ASCII的区别

(说实话这个我不记得,我就说了一下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.Java的serializable有个Id,你知道是有啥用的吗?

(类的版本吧,定义之后可以最大限度恢复对象,说了一下serializable可以用于深拷贝)

7.深拷贝浅拷贝说说?

(描述了一下定义吧)

8.Object的hashcode()用来干嘛,怎么自己实现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:get:T;put :任何都不行;List: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. 有什么想问我的?(在头条工作的体验?我这个岗位的发展空间?)

你可能感兴趣的:(20届秋招头条Android面经(已拿iOS offer,附部分解答))