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