Android中高级进阶开发面试题冲刺合集(九)

以下主要针对往期收录的面试题进行一个分类归纳整理,方便统一回顾和参考。本篇是第九集【完结篇】~

第一篇面试题在这: Android中高级进阶开发面试题冲刺合集(一)

第二篇在这: Android中高级进阶开发面试题冲刺合集(二)

第三篇在这: Android中高级进阶开发面试题冲刺合集(三)

第四篇在这: Android中高级进阶开发面试题冲刺合集(四)

第五篇在这: Android中高级进阶开发面试题冲刺合集(五)

第六篇在这: Android中高级进阶开发面试题冲刺合集(六)

第七篇在这: Android中高级进阶开发面试题冲刺合集(七)

第八篇在这:Android中高级进阶开发面试题冲刺合集(八)【Flutter篇】

Dart相关

1.Dart 当中的 「..」表示什么意思?

参考答案:

“..” 和 “.” 不同:调用..后返回的相当于是this,而.返回的则是该方法返回的值;

2.Dart 的作用域是怎么样的?

参考答案:

Dart没有publicprivate等关键词,默认就是公开的,私有变量使用下划线开头;

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 是单线程模型,运行的的流程如下图。

    image.png

    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接受消息用来处理,但是我们需要注意的是,ReceivePortSendPort在每个isolate都有一对,只有同一个isolate中的ReceivePort才能接受到当前类的SendPort发送的消息并且处理。

    11.await for 如何使用?

    参考答案:

    await for是不断获取stream流中的数据,然后执行循环体中的操作。它一般用在直到stream什么时候完成,并且必须等待传递完成之后才能使用,不然就会一直阻塞。

    12.Stream 有哪两种订阅模式?分别是怎么调用的?

    参考答案:

    单订阅(single)和多订阅(broadcast)。

    单订阅就是只能有一个订阅者,而广播是可以有多个订阅者。这就有点类似于消息服务(Message Service)的处理模式。单订阅类似于点对点,在订阅者出现之前会持有数据,在订阅者出现之后就才转交给它。而广播类似于发布订阅模式,可以同时有多个订阅者,当有数据时就会传递给所有的订阅者,而不管当前是否已有订阅者存在。

    Stream 默认处于单订阅模式,所以同一个 stream 上的 listen 和其它大多数方法只能调用一次,调用第二次就会 错。但 Stream 可以通过 transform() 方法(返回另一个 Stream)进行连续调用。通过 Stream.asBroadcastStream() 可以将一个单订阅模式的 Stream 转换成一个多订阅模式的 StreamisBroadcast 属性可以判断当前 Stream 所处的模式。

    13.dart中mixin机制是怎么样的?

    参考答案:

    mixin 是Dart 2.1 加入的特性,以前版本通常使用abstract class代替。简单来说,mixin是为了解决继承方面的问题而引入的机制,Dart为了支持多重继承,引入了mixin关键字,它最大的特殊处在于:mixin定义的类不能有构造方法,这样可以避免继承多个类而产生的父类构造方法冲突。 mixins的对象是类,mixins绝不是继承,也不是接口,而是一种全新的特性,可以mixins多个类,mixins的使用需要满足一定条件。

    14.JIT 与 AOT分别是什么?

    参考答案:

    借助于先进的工具链和编译器,Dart 是少数同时支持 JIT(Just In Time,即时编译)和 AOT(Ahead of Time,运行前编译)的语言之一。那,到底什么是 JIT 和 AOT 呢?语言在运行之前通常都需要编译,JIT 和 AOT 则是最常见的两种编译模式。JIT 在运行时即时编译,在开发周期中使用,可以动态下发和执行代码,开发测试效率高,但运行速度和执行性能则会因为运行时即时编译受到影响。

    AOT 即提前编译,可以生成被直接执行的二进制代码,运行速度快、执行性能表现好,但每次执行前都需要提前编译,开发测试效率低。

    15.Dart的内存分配与垃圾回收是怎么样的?

    参考答案:

    Dart VM 的内存分配策略比较简单,创建对象时只需要在堆上移动指针,内存增长始终是线性的,省去了查找可用内存的过程。在 Dart 中,并发是通过 Isolate 实现的。Isolate 是类似于线程但不共享内存,独立运行的 worker。这样的机制,就可以让 Dart 实现无锁的快速分配。

    Dart 的垃圾回收,则是采用了多生代算法。新生代在回收内存时采用“半空间”机制,触发垃圾回收时,Dart 会将当前半空间中的“活跃”对象拷贝到备用空间,然后整体释放当前空间的所有内存。回收过程中,Dart 只需要操作少量的“活跃”对象,没有引用的大量“死亡”对象则被忽略,这样的回收机制很适合 Flutter 框架中大量 Widget 销毁重建的场景。

    16.使用mixins的条件是什么?

    参考答案:

    因为mixins使用的条件,随着Dart版本一直在变,这里讲的是Dart2.1中使用mixins的条件:

  • mixins类只能继承自object mixins类不能有构造函数
  • 一个类可以mixins多个mixins
  • 可以mixins多个类,不破坏Flutter的单继承
  • 17.mixin 怎么指定异常类型?

    参考答案:

    on关键字可用于指定异常类型。 on只能用于被mixins标记的类,例如mixins X on A,意思是要mixins X的话,得先接口实现或者继承A。这里A可以是类,也可以是接口,但是在mixins的时候用法有区别.

    on 一个类:

    on 的是一个接口: 得首先实现这个接口,然后再用mix

    18.main future mirotask 的执行顺序是怎样的?

    参考答案:

    普通代码都是同步执行的,结束后会开始检查microtask中是否有任务,若有则执行,执行完继续检查microtask,直到microtask列队为空。最后会去执行event队列(future)。

    19.Future和Isolate有什么区别?

    参考答案:

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年9月12日
    下一篇 2022年9月12日

    相关推荐