一面问的Java 和Android基础
Jvm虚拟机
messageQueue会不会阻塞ui线程
对象锁和类锁
之字形打印树
还有其他的记不清了,主要是我对二面印象太深刻了。
二面问的Flutter和Dart
dart是值传递还是引用传递
Widget和element和RenderObject之间的关系
widget的root节点
mixin extends implement之间的关系(除了extends其他的没怎么用过。。)
jvm内存模型(感觉这个是面试官可怜我,看我什么都不会才问的=。=)
Future和microtask执行顺序
dart中..的用法(基本没用过。。)
await for(没用过。。)
说实话,第一个、第三个、第六个我准备的话应该能答出来的,但是一个多月没碰Flutter了,忘了都差不多。。。 等下把二面的答案写出来,希望能帮助后来人。 此外GitHub和博客维护好很重要,像我这种demo随手写,随手删的人直接GG。。
1. dart是值传递还是引用传递
首先给个结论,dart是引用传递。 先来看段代码

输出结果为:
a的初始值为:5
修改value为100
修改后a的值为:100
从这里可以看出是引用传递,如果只是复制了一个对象的话,main函数中的a值是不会发生变化的。 有些人可能会以以下代码反驳我:

你看,这输出的不是6吗,在dart中一切皆为对象,如果是引用传递,那为什么是6啊。
答案是这样的,在setValue()方法中,参数s实际上和我们初始化int s = 6的s不是一个对象,只是他们现在指的是同一块内存区域,然后在setValue()中调用s += 1的时候,这块内存区域的对象执行+1操作,然后在堆(类比java)中产生了一个新的对象,s再指向这个对象。所以s参数只是把main函数中的s的内存地址复制过去了,就比如java中的:

我们只要记住一点,参数是把内存地址传过去了,如果对这个内存地址上的对象修改,那么其他位置的引用该内存地址的变量值也会修改。千万要记住dart中一切都是对象。
偷偷说一句,我觉得面试官这个地方面试的不好,这种细节问题,如果不是遇到什么bug,业务忙的时候是没时间注意这个的,面试官可以把这两种情况展示下,然后问面试者原因是什么。。然后我就能回答出来了。。哭唧唧。。
2. Widget和element和RenderObject之间的关系
首先我详细说下当时的情景,面试官问我Widget和Element之间是不是一对多的关系,如果是增加一个Widget之后,这个关系又是什么。 这部分还是没有很好地答案,现在只是一个猜想,如果添加了一个widget,Element树遍历后面所有的Element看类型是否发生改变,有的话再重建RenderObject。Element和Widget之间应该还是一对一的关系,因为每个Widget的context都是独一无二的。等想好了再写上去吧。
3. widget树的root节点
还是没能理解面试官的意思。。有能够理解的同学请评论告知我一下。 现在理解了,面试官的意思应该指是runApp()方法中的那个的Widget。我当时也想说的,不过忘记这个方法名是啥了。。。
4. mixin extends implement之间的关系
这部分可以参考掘金的小德大佬的文章,高产似那啥。。
Flutter Dart mixins 探究
Flutter Dart语法(1):extends 、 implements 、 with的用法与区别
5. Future和microtask执行顺序
同样参考小德的文章
深入了解Flutter的isolate(1) ---- 事件循环(event loop)及代码运行顺序
深入了解Flutter的isolate(2) --- 创建自己的isolate
深入了解Flutter的isolate(3) --- Flutter的thread model(线程模型)
深入了解Flutter的isolate(4) --- 使用Compute写isolates
6. dart中..是什么
级联符号 .. 可以让你连续操作相同的对象,不单可以连续地调用函数,还可以连续地访问方法,这样做可以避免创建临时变量,从而写出更流畅的代码,流式编程更符合现代编程习惯和编程风格:

7. await for使用
先来一段官方文档

大概意思就是await for是不断获取stream流中的数据,然后执行循环体中的操作。

输出为
上午被开水烫了脚
不开心
面试
没
过
晚上还没吃饭
await for 和 listen的作用很相似,都是获取流中数据然后输出,但是正如await for中的await所示,如果stream没有传递完成,就会一直阻塞在这个位置,上面没吃饭是最后输出的,下面给个listen的实例,一看就懂。

输出为
上午被开水烫了脚
晚上还没吃饭
不开心
面试
没
过
所以await for一般用在直到stream什么时候完成,并且必须等待传递完成之后才能使用,不然就会一直阻塞,造成类似于Android ANR的问题。
总结
其实面试官还是很nice的,第一次见到活的大佬。。大佬对flutter和dart的研究真的很深入,远不是我这种只会调api的人可以比拟的。 主要还是我一个半月没使用过flutter了,然后之前问其他大佬要不要准备Flutter,大佬们说不用,以前看的很多东西都忘的差不多了。 哎,还是自己准备不充分,或者开始大佬问我的时候直接回答忘得差不多了,应该就能过了吧。
这里小编针对上面的面试内容整理出了一些互联网公司Android程序员面试涉及到的面试题及答案和一些高阶Android学习资料及思维导图,希望能帮助到大家的学习早日拿到大厂的offer。
需要这些资料的大伙关注+点赞+加群:185873940 免费获取!
我这里还有许多免费的关于高阶安卓学习资料,包括高级UI、性能优化、架构师课程、 NDK、混合式开发:ReactNative+Weex等多个Android技术知识的架构视频资料,还有职业生涯规划及面试指导。
网友评论