一面问的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是值传递。
之前把引用传递理解错了,给各位读者报个歉,同时也感谢评论区的指正
先来看段代码
输出结果为:
从这里可以看出是值传递,如果只是复制了一个对象的话,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之间的关系
这部分可以参考掘金的小德大佬的文章,高产似那啥。。
6. Future和microtask执行顺序
这部分就不多做赘述了,大家可以自行搜索文章观摩参考。
7. dart中..是什么
级联符号 .. 可以让你连续操作相同的对象,不单可以连续地调用函数,还可以连续地访问方法,这样做可以避免创建临时变量,从而写出更流畅的代码,流式编程更符合现代编程习惯和编程风格:
8. 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程序员面试涉及到的绝大部分面试题及答案做成了文档和架构视频资料免费分享给大家【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
转发+评论"视频"可获取下面的准备的视频资料
閱讀更多 互聯網的碼農 的文章