以下主要针对往期收录的面试题进行一个分类归纳整理,方便统一回顾和参考。本篇是第九集【完结篇】~
强调一下:别问了别问了, 面试文档要的直接找作者获取。
第一篇面试题在这: Android中高级进阶开发面试题冲刺合集(一)
第二篇在这: Android中高级进阶开发面试题冲刺合集(二)
第三篇在这: Android中高级进阶开发面试题冲刺合集(三)
第四篇在这: Android中高级进阶开发面试题冲刺合集(四)
第五篇在这: Android中高级进阶开发面试题冲刺合集(五)
第六篇在这: Android中高级进阶开发面试题冲刺合集(六)
第七篇在这: Android中高级进阶开发面试题冲刺合集(七)
第八篇在这:Android中高级进阶开发面试题冲刺合集(八)【Flutter篇】
Dart相关
1.Dart 当中的 「…」表示什么意思?
参考答案:
“…” 和 “.” 不同:调用..
后返回的相当于是this
,而.
返回的则是该方法返回的值;
2.Dart 的作用域是怎么样的?
参考答案:
Dart没有public
和private
等关键词,默认就是公开的,私有变量使用下划线开头;
3.dart是多线程还是单线程执行?
参考答案:
单线程执行,多线程是使用异步来执行的;
4.阻塞式调用和非阻塞式调用是怎么样的?
参考答案:
阻塞:调用结果之前,当前线程会被挂起,调用线程只有在得到结果之后才会继续执行;
非阻塞:调用执行之后,当前线程不会停止运行,只需要过一段时间来检查有没有结果返回即可;
5.事件循环是什么?
参考答案:
将需要处理的一系列事件,放在一个事件队列(Event Queue
)中,不断从事件队列中取出事件,并执行需要执行的代码块,直到事件被清空。
6.dart是值传递还是引用传递?
参考答案:
dart是值传递。我们每次调用函数,传递过去的都是对象的内存地址,而不是这个对象的复制。
7.Dart 语言有哪些重要的特性?
参考答案:
- Productive(生产力高,Dart的语法清晰明了,工具简单但功能强大)
- Fast(执行速度快,Dart提供提前优化编译,以在移动设备和Web上获得可预测的高性能和快速启动。)
- Portable(易于移植,Dart可编译成ARM和X86代码,这样Dart移动应用程序可以在iOS、Android和其他地方运行)
- Approachable(容易上手,充分吸收了高级语言特性,如果你已经知道C++,C语言,或者Java,你可以在短短几天内用Dart来开发)
- Reactive(响应式编程)
8.Dart 语言有哪些重要的概念?
参考答案:
- 在Dart中,一切都是对象,所有的对象都是继承自
Object
- Dart是强类型语言,但可以用var或
dynamic
来声明一个变量,Dart会自动推断其数据类型,dynamic
类似c# - 没有赋初值的变量都会有默认值
null
- Dart支持顶层方法,如
main
方法,可以在方法内部创建方法 - Dart支持顶层变量,也支持类变量或对象变量
- Dart没有
public
protected
private
等关键字,如果某个变量以下划线(_)开头,代表这个变量在库中是私有的
9.Dart线程模型是如何执行的?
参考答案:
Dart 是单线程模型,运行的的流程如下图。
Dart 在单线程中是以消息循环机制来运行的,包含两个任务队列,一个是“微任务队列” microtask queue
,另一个叫做“事件队列” event queue
。 当Flutter应用启动后,消息循环机制便启动了。首先会按照先进先出的顺序逐个执行微任务队列中的任务,当所有微任务队列执行完后便开始执行事件队列中的任务,事件任务执行完毕后再去执行微任务,如此循环往复,生生不息。
10.Dart 是如何实现多任务并行的?
参考答案:
Dart 是单线程的,不存在多线程,那如何进行多任务并行的呢?其实,Dart的多线程和前端的多线程有很多的相似之处。Flutter的多线程主要依赖Dart的并发编程、异步和事件驱动机制。
简单的说,在Dart中,一个Isolate
对象其实就是一个isolate
执行环境的引用,一般来说我们都是通过当前的isolate
去控制其他的isolate
完成彼此之间的交互,而当我们想要创建一个新的Isolate
可以使用Isolate.spawn
方法获取返回的一个新的isolate
对象,两个isolate
之间使用SendPort
相互发送消息,而isolate
中也存在了一个与之对应的ReceivePort
接受消息用来处理,但是我们需要注意的是,ReceivePort
和SendPort
在每个isolate
都有一对,只有同一个isolate
中的ReceivePort
才能接受到当前类的SendPort
发送的消息并且处理。
11.await for 如何使用?
参考答案:
await for
是不断获取stream
流中的数据,然后执行循环体中的操作。它一般用在直到stream
什么时候完成,并且必须等待传递完成之后才能使用,不然就会一直阻塞。
12.Stream 有哪两种订阅模式?分别是怎么调用的?
参考答案:
单订阅(single
)和多订阅(broadcast
)。
单订阅就是只能有一个订阅者,而广播是可以有多个订阅者。这就有点类似于消息服务(Message Service
)的处理模式。单订阅类似于点对点,在订阅者出现之前会持有数据,在订阅者出现之后就才转交给它。而广播类似于发布订阅模式,可以同时有多个订阅者,当有数据时就会传递给所有的订阅者