Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇
StringBuffer与StringBuilder在进行字符串操作时的效率(字节跳动)
这道题想考察什么?
在开发中需要进行字符串操作时如何合理利用StringBuffer与StringBuilder
考察的知识点
字符串工具类
考生应该如何回答
当对字符串进行修改的时候,使用 StringBuffer 和 StringBuilder 能够多次的修改,并且不产生新的未使用字符串对象。
String在进行字符串操作时,每次操作都会new StringBuilder,如进行字符串拼接:
String result = "Hello ";
for(int i = 0; i < 100; i++){
result += "Hello ";
}
上述代码等价于:
String result = "Hello ";
for(int i = 0; i < 100; i++){
result = new StringBuilder().append(result).append("Hello ");
}
可以看到每次循环都需要创建一个StringBuilder 使用其append
方法完成字符串拼接。频繁创建与回收对象会导致 “内存抖动” 问题,引发程序卡顿甚至OOM。
因此相对直接使用String进行字符串操作,应将代码优化为:
StringBuilder result = new StringBuilder("Hello ");
for(int i = 0; i < 100; i++){
result.append("Hello ");
}
而StringBuffer与StringBuilder的功能与实现原理一致,两者的区别在于,StringBuffer中的方法都被关键字synchronized
声明,这意味着其是线程安全的,但是因为每次执行方法都需要获取锁,因此效率比StringBuilder稍低。
在涉及到多线程环境下操作字符串时,应该使用StringBuffer;否则应该选择StringBuilder效率更高。
JVM DVM ART的区别
这道题想考察什么?
Android虚拟机与Java虚拟机的差异
考察的知识点
- JVM虚拟的基本知识
- DVM虚拟机的基本知识
- ART虚拟机的基本知识
考生应该如何回答
JVM
JVM是基于栈的虚拟机,对于基于栈的虚拟机来说,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史,每有一次方法调用,栈中便会多一个栈桢。最顶部的栈桢称作当前栈桢,其代表着当前执行的方法。基于栈的虚拟机通过操作数栈进行所有操作。
在JVM中执行字节码,将
int a = 1;
int b = 2;
int c = a + b;
编译为字节码,得到的指令为:
ICONST_1 #将int类型常量1压入操作数栈
ISTORE 0 #将栈顶int类型值存入局部变量0
ICONST_2
ISTORE 1
ILOAD 0 #从局部变量表加载0:int类型数据
ILOAD 1
IADD #执行int类型加法
ISTORE 2
数据会不断在操作数栈与局部变量表之间移动。
Dalvik
Dalvik虚拟机( Dalvik Virtual Machine ),简称Dalvik VM或者DVM。DVM是Google专门为Android平台开发的虚拟机,它运行在Android运行时库中。
与JVM区别
基于的架构不同
DVM是基于寄存器的虚拟机,并没有JVM栈帧中的操作数栈,但是有很多虚拟寄存器。其实和操作数栈相同,这些寄存器也存放在运行时栈中,本质上就是一个数组。与JVM相似,在Dalvik VM中每个线程都有自己的PC和调用栈,方法调用的活动记录以帧为单位保存在调用栈上。
与JVM版相比,Dalvik无需从栈中读写数据,所需的指令更少,数据也不再需要频繁的移动。
#int a = 1
const/4 v0, #int 1 // #1
#int b = 2
const/4 v1, #int 2 // #2
#int c = a + b
add-int v2, v0, v1
执行的字节码不同
- 在Java中,Java类会被编译成一个或多个.class文件,打包成jar文件,而后JVM会通过相应的.class文件和jar文件获取相应的字节码。
- DVM会用dx工具将所有的.class文件或者jar文件转换为一个.dex文件,然后DVM会从该.dex文件读取指令和数据。
.jar文件在中包含多个.class文件,每个.class文件里面包含了该类的常量池、类信息、属性等等。当JVM加载该.jar文件的时候,会加载里面的所有的.class文件,JVM的这种加载方式很慢,对于内存有限的移动设备并不合适。
而.dex文件中也包含很多类信息,但是dex将多个类信息整合在一起了,多个类复用常量池等区域。
ART
ART(Android Runtime)是Android 4.4发布的,用来替换Dalvik虚拟,Android 4.4默认采用的还是DVM,系统会提供一个选项来开启ART。在Android 5.0时,默认采用ART。
与DVM的区别
Dalvik下应用在安装的过程,会执行一次优化,将dex字节码进行优化生成odex文件。
ART能够兼容Dalvik中的字节码执行。但是ART 引入了预先编译机制(Ahead Of Time),在Android4.4到Android 7.0以下的设备中安装应用时,ART 会使用 dex2oat 程序编译应用,将应用中dex编译成本地机器码。但是此过程会导致应用安装变慢。
因此,从Android N(Android 7.0)开始,ART 混合使用AOT、JIT与解释执行:
1、最初安装应用时不进行任何 AOT 编译(避免安装过慢),运行过程中解释执行,对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。
2、当设备闲置和充电时,编译守护进程会运行,根据Profile文件对常用代码进行 AOT 编译。待下次运行时直接使用。
由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~
PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)
目录
第一章 Java方面
- Java基础部分
- Java集合
- Java多线程
- Java虚拟机
第二章 Android方面
- Android四大组件相关
- Android异步任务和消息机制
- Android UI绘制相关
- Android性能调优相关
- Android中的IPC
- Android系统SDK相关
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin方面
第三章 音视频开发高频面试题
- 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 怎么做到直播秒开优化?
- 直方图在图像处理里面最重要的作用是什么?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- 衡量图像重建好坏的标准有哪些?怎样计算?
第四章 Flutter高频面试题
- Dart部分
- Flutter部分
第五章 算法高频面试题
- 如何高效寻找素数
- 如何运用二分查找算法
- 如何高效解决雨水问题
- 如何去除有序数组的重复元素
- 如何高效进行模幂运算
- 如何寻找最长回文子串
第六章 Andrio Framework方面
- 系统启动流程面试题解析
- Binder面试题解析
- Handler面试题解析
- AMS面试题解析