字节跳动Android实习面试凉凉经

一面问的Java 和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 = 6s不是一个对象,只是他们现在指的是同一块内存区域,然后在setValue()中调用s += 1的时候,这块内存区域的对象执行+1操作,然后在堆(类比java)中产生了一个新的对象,s再指向这个对象。所以s参数只是把main函数中的s的内存地址复制过去了,就比如java中的:

public class Test {
    public static void main(String[] args) {
        //相当于dart中main函数初始化
        Test a = new Test();
        //相当于setValue()中的s,并把参数代表的内存地址赋值给b
        Test b = a;    
        //s指向一个新对象,即为dart中的s += 1
        b = new Test();
    }
}

我们只要记住一点,参数是把内存地址传过去了,如果对这个内存地址上的对象修改,那么其他位置的引用该内存地址的变量值也会修改。千万要记住dart中一切都是对象。

偷偷说一句,我觉得面试官这个地方面试的不好,这种细节问题,如果不是遇到什么bug,业务忙的时候是没时间注意这个的,面试官可以把这两种情况展示下,然后问面试者原因是什么。。然后我就能回答出来了。。哭唧唧。。

2. Widget和element和RenderObject之间的关系

首先我详细说下当时的情景,面试官问我WidgetElement之间是不是一对多的关系,如果是增加一个Widget之后,这个关系又是什么。
这部分还是没有很好地答案,现在只是一个猜想,如果添加了一个widgetElement树遍历后面所有的Element看类型是否发生改变,有的话再重建RenderObjectElementWidget之间应该还是一对一的关系,因为每个Widgetcontext都是独一无二的。等想好了再写上去吧。

3. widget树的root节点

还是没能理解面试官的意思。。有能够理解的同学请评论告知我一下。
现在理解了,面试官的意思应该指是runApp()方法中的那个的Widget。我当时也想说的不过忘记这个方法名是啥了。。。

4. mixin extends implement之间的关系

这部分可以参考掘金的小德大佬的文章,高产似那啥。。
Flutter Dart mixins 探究
Flutter Dart语法(1):extends 、 implements 、 with的用法与区别

6. Future和microtask执行顺序

同样参考小德的文章
深入了解Flutter的isolate(1) ---- 事件循环(event loop)及代码运行顺序
深入了解Flutter的isolate(2) --- 创建自己的isolate
深入了解Flutter的isolate(3) --- Flutter的thread model(线程模型)
深入了解Flutter的isolate(4) --- 使用Compute写isolates

7. dart中..是什么

级联符号 .. 可以让你连续操作相同的对象,不单可以连续地调用函数,还可以连续地访问方法,这样做可以避免创建临时变量,从而写出更流畅的代码,流式编程更符合现代编程习惯和编程风格:

main(){
  Tree tree = new Tree(1);
  tree..test1 = 1..test2 =5;
  print(tree.test1);
  print(tree.test2);
}

class Tree{
  int value;
  int test1 = 2;
  int test2 = 3;
  Tree(int a){
    this.value = a;
  }
}

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.

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

Stream<String> stream = new Stream<String>.fromIterable(['不开心', '面试', '没', '过']);
main() async{
  print('上午被开水烫了脚');
  await for(String s in stream){
    print(s);
  }
  print('晚上还没吃饭');
}

输出为

上午被开水烫了脚
不开心
面试
没
过
晚上还没吃饭

await forlisten的作用很相似,都是获取流中数据然后输出,但是正如await for中的await所示,如果stream没有传递完成,就会一直阻塞在这个位置,上面没吃饭是最后输出的,下面给个listen的实例,一看就懂。

Stream<String> stream = new Stream<String>.fromIterable(['不开心', '面试', '没', '过']);
main(){
  print('上午被开水烫了脚');
  stream.listen((s) { print(s); });
  print('晚上还没吃饭');
}

输出为

上午被开水烫了脚
晚上还没吃饭
不开心
面试
没
过

所以await for一般用在直到stream什么时候完成,并且必须等待传递完成之后才能使用,不然就会一直阻塞,造成类似于Android ANR的问题。

总结

其实面试官还是很nice的,第一次见到活的大佬。。大佬对flutter和dart的研究真的很深入,远不是我这种只会调api的人可以比拟的。
主要还是我一个半月没使用过flutter了,然后之前问其他大佬要不要准备Flutter,大佬们说不用,以前看的很多东西都忘的差不多了。
哎,还是自己准备不充分,或者开始大佬问我的时候直接回答忘得差不多了,应该就能过了吧。
另:求Android实习一份,最好是大厂的。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270