1、Jvm虚拟机
2、messageQueue会不会阻塞ui线程
3、对象锁和类锁
4、之字形打印树
5、还有其他的记不清了,主要是我对二面印象太深刻了。
二面问的 Flutter 和 Dart
1、dart是值传递还是引用传递
2、Widget和element和RenderObject之间的关系
3、widget的root节点
4、mixin extends implement之间的关系(除了extends其他的没怎么用过。。)
5、jvm内存模型(感觉这个是面试官可怜我,看我什么都不会才问的=。=)
6、Future和microtask执行顺序
7、dart中…的用法(基本没用过。。)
8、await for(没用过。。)
说实话,第一个、第三个、第六个我准备的话应该能答出来的,但是一个多月没碰Flutter了,忘了都差不多。。。
等下把二面的答案写出来,希望能帮助后来人。
此外GitHub和博客维护好很重要,像我这种demo随手写,随手删的人直接GG。。
1、dart是值传递还是引用传递
首先给个结论,dart是引用传递。
先来看段代码
main(){
Test a = new Test(5);
print(“a的初始值为:${a.value}”);
setValue(a);
print(“修改后a的值为: ${a.value}”);
}
class Test{
int value = 1;
Test(int newValue){
this.value = newValue;
}
}
setValue(Test s){
print(“修改value为100”);
s.value = 100;
}
输出结果为:
a的初始值为:5
修改value为100
修改后a
的值为:100
从这里可以看出是引用传递,如果只是复制了一个对象的话,main函数中的a值是不会发生变化的。
有些人可能会以以下代码反驳我:
main(){
int s = 6;
setValue(s);
print(s); //输出6,而不是7
}
class Test{
int value = 1;
Test(int newValue){
this.value = newValue;
}
}
setValue(int s){
s += 1;
}
你看,这输出的不是6吗,在dart中一切皆为对象,如果是引用传递,那为什么是6啊。
答案是这样的,在 setValue()方法中,参数s实际上和我们初始化int s = 6的s不是一个对象,只是他们现在指的是同一块内存区域,然后在setValue()中调用s += 1的时候,这块内存区域的对象执行+1操作,然后在堆(类比java)中产生了一个新的对象,s再指向这个对象。所以s参数只是把main函数中的s的内存地址复制过去了,就比如java中的:
public class Test {
public static void main(String[] args) {
Test a = new Test();
Test b = a;
b = new Test();
}
}
我们只要记住一点,参数是把内存地址传过去了,如果对这个内存地址上的对象修改,那么其他位置的引用该内存地址的变量值也会修改。千万要记住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中…是什么
级联符号 … 可以让你连续操作相同的对象,不单可以连续地调用函数,还可以连续地访问方法,这样做可以避免创建临时变量,从而写出更流畅的代码,流式编程更符合现代编程习惯和编程风格:
main(){
Tree tree = new Tree(1);
tree…test1 = 1…test2 =5;
print(tree.test1);
print(tree.test2);
}
可以避免创建临时变量,从而写出更流畅的代码,流式编程更符合现代编程习惯和编程风格:
main(){
Tree tree = new Tree(1);
tree…test1 = 1…test2 =5;
print(tree.test1);
print(tree.test2);
}