一面问的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是值传递。
之前把引用传递理解错了,给各位读者报个歉,同时也感谢评论区的指正
先来看段代码
输出结果为:
从这里可以看出是值传递,如果只是复制了一个对象的话,函数中的值是不会发生变化的。 有些人可能会以以下代码反驳我:
你看,这输出的不是6吗,在中一切皆为对象,如果是值传递,那为什么是6啊。
答案是这样的,在方法中,参数实际上和我们初始化的不是一个对象,只是他们现在指的是同一块内存区域,然后在中调用的时候,这块内存区域的对象执行操作,然后在堆(类比java)中产生了一个新的对象,再指向这个对象。所以参数只是把函数中的的内存地址复制过去了,就比如java中的:
我们只要记住一点,参数是把内存地址传过去了,如果对这个内存地址上的对象修改,那么其他位置的引用该内存地址的变量值也会修改。千万要记住dart中一切都是对象。
偷偷说一句,我觉得面试官这个地方面试的不好,这种细节问题,如果不是遇到什么bug,业务忙的时候是没时间注意这个的,面试官可以把这两种情况展示下,然后问面试者原因是什么。。然后我就能回答出来了。。哭唧唧。。
2. Widget和element和RenderObject之间的关系
首先我详细说下当时的情景,面试官问我和之间是不是一对多的关系,如果是增加一个之后,这个关系又是什么。 这部分还是没有很好地答案,现在只是一个猜想,如果添加了一个,树遍历后面所有的看类型是否发生改变,有的话再重建。和之间应该还是一对一的关系,因为每个的都是独一无二的。等想好了再写上去吧。
3. widget树的root节点
还是没能理解面试官的意思。。有能够理解的同学请评论告知我一下。 现在理解了,面试官的意思应该指是runApp()方法中的那个的Widget。我当时也想说的,不过忘记这个方法名是啥了。。。
4. mixin extends implement之间的关系
这部分可以参考掘金的小德大佬的文章,高产似那啥。。
6. Future和microtask执行顺序
这部分就不多做赘述了,大家可以自行搜索文章观摩参考。
7. dart中..是什么
级联符号 .. 可以让你连续操作相同的对象,不单可以连续地调用函数,还可以连续地访问方法,这样做可以避免创建临时变量,从而写出更流畅的代码,流式编程更符合现代编程习惯和编程风格:
8. await for使用
先来一段官方文档
await-for As every Dart programmer knows, the for-in loop plays well with iterables. Similarly, the await-for loop is designed to play well with streams. Given a stream, one can loop over its values: Every time an element is added to the stream, the loop body is run. After each iteration, the function enclosing the loop suspends until the next element is available or the stream is done. Just like await expressions, await-for loops can only appear inside asynchronous functions.
大概意思就是是不断获取流中的数据,然后执行循环体中的操作。
java基础面试官问题
输出为
和 的作用很相似,都是获取流中数据然后输出,但是正如中的所示,如果没有传递完成,就会一直阻塞在这个位置,上面没吃饭是最后输出的,下面给个的实例,一看就懂。
输出为
所以一般用在直到什么时候完成,并且必须等待传递完成之后才能使用,不然就会一直阻塞,造成类似于的问题。
总结
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/19714.html