2020字节跳动Android面试凉凉,挥泪整理面筋,你不看看吗

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值