双非本科非科班 抖音Android面筋(被调剂到iOS了)
-
自我介绍
-
内核态用户态的区别
-
用户态可以访问内核态的内存吗,你说的一些有风险的指令,具体是怎么阻止用户态程序去执行有风险的指令的
-
既然用户态不可以访问内核态的内存,那么在做一些比如网络连接的操作的时候肯定需要内核态内存,用户态程序怎么做到使用内核态内存的
-
说到跨进程通信方式,你知道有什么跨进程通信方式吗?
-
你说到的共享内存,管道,消息队列,binder他们之间有什么区别吗?
-
你说到广播、内容提供器也有使用binder与AMS通信,那他们与binder之间有什么区别吗(广播、内容提供器的实质是不是就是binder)?
-
为什么要写这样一个测速的程序?
-
两个Activity,一个显示商品列表,一个实现商品详情页,在商品详情页点了关注之后,怎么使得返回商品列表之后也更新了关注状态呢?
-
你说的发布订阅模式,你知道有什么框架使用了这个设计模式吗?
-
假如两个Activity数据量比较大呢,要更新相当多的东西呢?
-
你把model设置为单例的话,那这个列表不断下滑,加载更多内容,最后导致占用相当多的内存怎么办?liveData、ViewModel你可以了解下
-
算法题:"www.toutiao.cn"转成"cn.toutiao.www"
-
有什么想问我的?(在头条工作的体验?这个你可以问hr)
-
你是哪里人?为什么选择投上海的岗位?除了上海,还有什么意向的城市吗?为什么不喜欢北京?上海也是这样啊?
-
问专业。与程序相关的课程有多少?有学计算机组成原理、计算机网络吗?
-
除了看书以外学习途径?你在安卓的群上一般讨论什么东西?印象深刻的是什么?
-
你在wifi***是上海的实习吗?你这个在wifi***的部门不是专门做安卓的吧?有没有安卓方面导师?都是靠你自己摸索的吗?项目有几个人在负责,都是你在负责吗?
-
因为什么而接触安卓?你在这个团队里负责什么角色?贡献了多少代码比如有多少页面是你写的?
-
有没有什么社团之类的让你接触安卓?
-
有什么想问我的?(问了对应届生的期望)
-
你认为你前面的面试表现怎么样?
-
你是女生为什么要来上海这么远工作?
-
你觉得抖音(还是字节跳动来着)怎么样?
-
你提到技术驱动型,你认为怎么样才是技术驱动型公司?
-
你提到你是抖音的用户,但是使用频率不高,是因为什么,因为抖音的内容质量不好吗?
-
你提到抖音是音视频相关,你对音视频开发是比较感兴趣吗?
-
实习工作中有没有遇到什么较大的问题?这个问题是什么原因有没有探究?
-
大学期间有没有遇到什么比较大的挫折?
-
你提前批有投过头条没有通过,是因为没有准备好吗?
-
如果通过了面试,你会提前来实习吗?
-
有什么想问我的?(在头条工作的体验?我这个岗位的发展空间?)
一面:
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.hashcode的作用(用在hashmap这种数据结构中的散列和查找);
2.我认为一个好的hashcode定义的要求:(
(1)不能经常改变,因为改变会导致无法找到原本的key对象;
(2)最好跟对象的一些数据相关,能够唯一标识一个对象(比如你每个对象都有不会改变的名字的话,就可以根据对象名字生成);
(3)在一个整型中0和1分布尽可能均匀,不能前面都是000后面才有几个数字,这样比较容易产生碰撞)
3.谈谈根据以上要求怎么生成hashcode)
(这个讲得不太好,就是说了一下写法,还有每个写法表示的是什么)
(我认为不会报错吧,因为泛型参数可以匹配所有类型参数,应该会优先调用更准确的方法……面试官觉得会报错,因为编译器会分不清应该调用哪个方法;我还是认为不会报错……他们是包含与被包含的关系,就像一个方法有Object参数和String参数,调用的时候如果传入一个String类型的参数,静态委派也是优先调用String的那个方法)
(虚拟机栈,以及上面的方法参数?还有ThreadLocal的话可以定义一个线程私有的对象,之后说我知道ThreadLocal的实现方式,然后就跟他说了一下ThreadLocal以及它的ThreadLocalMap那些……以及它不会内存泄漏的原因)
(项目的长时间运行崩溃的问题:
1.描述程序的整个结构运作过程;
2.问题处理思路:
(1)如何探究原因;
(2)找到原因后尝试解决,尝试提出解决方案;
(3)无法解决,写好日志分析报告交给leader;
面试官:那最后这个问题解决了吗?
我:我离职了不知道情况了。
面试官:这个问题你可以问问他们解决了没有。
我:那我想问一下您认为有什么解决办法吗?
工作氛围(哪方面的氛围?学习氛围、加班情况);
程序员职业发展建议以及如何快速融入工作。
三面:(记不全)
四面:(记不全)
hr面:(记不全)