Android面试备忘录(数据结构和算法+核心Android)
数据结构和算法
关于数据结构和算法主题的问题水平完全取决于你应聘的公司水平。
-
排列
-
数组由一组具有相同数据类型的元素组成。它连续存储在内存中,通过使用其索引,您可以找到基础数据。阵列可以是一维的和多维的。一维数组是最简单的数据结构,也是最常用的数据结构。值得注意的是,在Java语言中,多维数组被实现为数组数组。例如,
int[10][5]
实际上是一个数组,其'单元格指向十个5元素数组。算法 平均 最糟糕的情况 空间 Θ(n)的 上) 搜索 Θ(n)的 上) 插入 Θ(n)的 上) 删除 Θ(n)的 上)
-
-
LinkedList链表
-
LinkedList就像树一样,与数组不同,由一组节点组成,这些节点一起表示一个序列。每个节点包含数据和指针。节点中的数据可以是任何内容,但指针是对LinkedList中下一项的引用。LinkedList包含头部和尾部。“Head”是LinkedList中的第一个项目,而“Tail”是最后一个项目。它不是一个循环数据结构,因此尾部没有指向头部的指针 - 指针就是这样
null
。每种基本方法的运行时复杂度如下:算法 平均 最糟糕的情况 空间 Θ(n)的 上) 搜索 Θ(n)的 上) 插入 Θ(1) O(1) 删除 Θ(1) O(1)
-
-
DoublyLinkedList
-
DoublyLinkedList基于LinkedList,但每个节点有两个指针,“previous”指针保存对前一个节点的引用,“next”指针保存对下一个节点的引用。它还有一个Head节点,头节点的下一个指针引用该DoublyLinkedList中的第一个节点。最后一个节点的“下一个”引用指向
()null
,但如果最后一个节点的下一个指针指向第一个节点,则此类DoublyLinkedList称为“Circular DoublyLinkedList”。如果您需要能够在两个方向上遍历存储的元素,则此数据结构非常方便。算法 平均 最糟糕的情况 空间 Θ(n)的 上) 搜索 Θ(n)的 上) 插入 Θ(1) O(1) 删除 Θ(1) O(1)
-
-
堆
- 堆栈是具有“后进先出”(LIFO)语义的基本数据结构。这意味着添加到堆栈的最后一项是从堆栈中出来的第一个项目。堆栈就像一堆书籍,为了获得堆栈中添加的第一本书(底部书籍),所有需要先删除后添加的书籍。添加到堆栈称为“推送”,从堆栈中删除称为“Pop”,并将最后一个项目插入堆栈而不删除它称为“顶部”。实现堆栈的最常用方法是使用LinkedList,但也有StackArray(用数组实现)不替换空条目,还有一个Vector实现替换
null
条目。
- 堆栈是具有“后进先出”(LIFO)语义的基本数据结构。这意味着添加到堆栈的最后一项是从堆栈中出来的第一个项目。堆栈就像一堆书籍,为了获得堆栈中添加的第一本书(底部书籍),所有需要先删除后添加的书籍。添加到堆栈称为“推送”,从堆栈中删除称为“Pop”,并将最后一个项目插入堆栈而不删除它称为“顶部”。实现堆栈的最常用方法是使用LinkedList,但也有StackArray(用数组实现)不替换空条目,还有一个Vector实现替换
-
Queue
-
PriorityQueue
-
Binary Tree Wikipedia
-
Binary Search Tree
-
Hash Table or Hash Map
-
Sorting Algorithms
使用最有效的排序算法(以及实现它的正确数据结构)对于任何程序都至关重要,因为数据操作可能是性能最重要的瓶颈之一,也是花费时间的主要目的,确定最佳算法工作,就是要大幅提高表现。算法的效率在其“Big O”中测量(StackOverflow) 得分了。非常好的算法在O(n log n)或甚至O(log n)时间内执行重要操作,其中一些甚至可以在O(1)时间内执行某些操作(例如,HashTable插入)。但总有一个权衡 - 如果某些算法真的很擅长向数据结构添加新元素,那么在数据访问方面,它肯定比其他算法更糟糕。如果你精通数学,你可能会注意到“大O”符号与“限制”有许多相似之处,你会是对的 - 它通过查看它的'函数来衡量一个算法的最佳,最差和平均性能限制。应该注意的是,当我们谈论O(1) - 恒定时间时 - 我们并不是说这个算法在一次操作中执行一个动作,相反,它可以使用相同数量的操作(粗略地)执行此操作,而不考虑它必须考虑的元素数量。值得庆幸的是,已经计算了很多“大O”分数,因此您不必猜测,哪种算法或数据结构在您的项目中表现更好。“大O”备忘单
Bubble sort
Bubble sort 是最简单的排序算法之一。它只是比较相邻元素,如果相邻元素之前的元素较小 - 它会改变它们的位置。因此,在数据列表上的一次迭代中,保证至少一个元素将处于其正确的位置(最大/最小的一个 - 取决于排序的方向)。这不是一个非常有效的算法,因为高度无序的数组将需要大量的重新排序(高达O(n ^ 2)),但该算法的一个优点是它的空间复杂性 - 只有两个元素同时进行比较没有必要分配更多的内存,而不是那两个占用。
Selection sort
首先,选择排序假定要排序的数组的第一个元素是最小的,但为了确认这一点,它迭代所有其他元素进行检查,如果找到一个,则将其定义为最小的元素。当数据结束时,当前发现最小的元素放在数组的开头。这种排序算法非常简单,但在较大的数据集上效率仍然不高,因为只需将一个元素分配给它的位置,它就需要遍历所有数据。
Insertion sort
插入排序是算法的另一个例子,它并不难实现,但效率也不高。为了完成它的工作,它“增长”数据的排序部分,通过将新遇到的元素“插入”数组的已经(内部)排序部分,该部分由先前遇到的元素组成。这意味着在最好的情况下(数据已经排序),它可以确认其作业是在Ω(n)操作中完成的,而如果所有遇到的元素都不符合O(n ^ 2)次操作所需的顺序可能需要。
Merge sort
这是一种“分而治之”的算法,意味着它递归地将给定数组“划分”为较小的部分(最多1个元素),然后对这些部分进行排序,将它们相互组合。这种方法允许合并排序实现非常高的速度,同时加倍所需的空间,当然,但今天的存储空间比几年前更容易获得,所以这种权衡被认为是可接受的。
Quicksort
Quicksort被认为是非常快的。如果实施得当,它可能比其主要竞争对手快很多倍。这个算法也是“分而治之”的家族,它的第一步是选择一个“枢轴”元素(从统计上随机选择,最小化获得最差性能的机会),然后通过比较元素到这个支点,移动它越来越接近它的'最终位置。在此过程中,较大的元素移动到它的右侧,较小的元素移动到左侧。完成此操作后,quicksort会对放置的pivot的每一侧的子数组重复此过程(首先递归执行),直到对数组进行排序。
当然,还有更多的排序算法及其修改。我们强烈建议所有读者熟悉其他几个,因为了解算法是候选人非常重要的素质,申请工作并且能够“了解”正在发生的事情。
-
Dynamic Programming
-
Greedy Algorithm
-
String Manipulation
-
Pathfinding algorithms
Dijkstra算法
A *算法
广度优先搜索
深度优先搜索
核心Android
基础
-
告诉所有Android应用程序组件。Android官方
-
Android应用程序的结构是什么?
-
什么是
Context
?怎么用?MindOrks -
什么是
AndroidManifest.xml
?Android官方 -
什么是
Application
课?
活动
-
什么是
Activity
?MindOrks -
解释
Activity
和Fragment
生命周期。(完整的图表GitHub,Activity,Fragment的简化图),Activity生命周期和Fragments生命周期 -
什么是“发射模式”?MindOrks
片段
-
什么是
Fragment
?MindOrks -
a
Fragment
和an有Activity
什么区别?解释两者之间的关系。 -
为什么建议仅使用默认构造函数来创建
Fragment
?堆栈溢出 -
你会如何在两个碎片之间进行通信?Android官方
-
保留
Fragment
什么?AndroidDesignPatterns
视图和ViewGroups
-
什么是
View
Android?MindOrks -
区别
View.GONE
和View.INVISIBLE
?堆栈溢出 -
你能创建自定义视图吗?怎么样?MindOrks
-
什么是ViewGroups以及它们与Views的不同之处?
-
什么是画布?
-
什么是
SurfaceView
? -
相对布局与线性布局。MindOrks
-
讲述约束布局MindOrks
-
你知道什么是视图树吗?你怎么能优化它的深度?
显示内容列表
-
ListView
和之间有什么区别RecyclerView
? -
什么是ViewHolder模式?我们为什么要使用它?
-
什么是
SnapHelper
?MindOrks
Dialogs and Toasts
-
什么是
Dialog
Android? -
什么是
Toast
Android? -
Dialog
和之间有什么区别Dialog Fragment
?
Intents and Broadcasting
-
什么是
Intent
?堆栈溢出 -
什么是隐含的
Intent
? 堆栈溢出 -
什么是明确的
Intent
? -
什么是
BroadcastReceiver
?堆栈溢出 -
什么是
LocalBroadcastManager
?开发者Android -
一个人的功能是
IntentFilter
什么?堆栈溢出 -
什么是粘性
Intent
?AndroidInterview -
描述广播和意图如何在您的应用中传递消息?
-
什么是
PendingIntent
? -
什么是不同类型的广播?
服务
-
什么是
Serivce
?开发者Android -
Service
VSIntentService
。堆栈溢出 -
什么是
JobScheduler
?Vogella
进程间通信
-
两个不同的Android应用程序如何交互? 开发者Android
-
是否可以在多个进程中运行Android应用程序?怎么样?
-
什么是AIDL?枚举通过AIDL创建有界服务的步骤。开发者Android
-
您可以在Android中使用什么进行后台处理? 开发者Android
-
什么是
ContentProvider
它通常用于什么?开发者Android Developer Android
长期运营
-
您将如何在应用程序中执行长时间运行的操作?
-
为什么要避免在主线程上运行非ui代码?
-
什么是ANR?如何预防ANR?开发者Android
-
什么是
AsyncTask
? 开发者Android -
asynctask有什么问题?
-
你什么时候使用java线程而不是asynctask?
-
什么是
Loader
?(Depricated)开发者Android -
a
AsyncTask
和a 的生命周期之间有什么关系Activity
?这会导致什么问题?如何避免这些问题? -
解释
Looper
,Handler
和HandlerThread
。MindOrks和MindOrks视频
使用多媒体内容
-
你如何处理Android中的位图,因为它需要太多的内存?开发者Android Developer Android
-
普通
Bitmap
图像和九图像图像有什么区别? -
讲述
Bitmap
游泳池。MindOrks -
如何在Android中播放声音?Vogella
数据保存
-
如何在Android应用中保留数据?MindOrks
-
什么是ORM?它是如何工作的?
-
如何
Activity
在屏幕旋转期间保留状态?堆栈溢出 -
在Android应用中存储数据的方法有哪些?开发者Android
外观和感觉
-
什么是
Spannable
?介质 -
什么是
SpannableString
?- SpannableString具有不可变文本,但其span信息是可变的。当您的文本不需要更改但样式确实需要时,请使用SpannableString。跨度是文本的范围,包括颜色,突出显示,斜体,链接等样式信息
内存优化
-
onTrimMemory()
方法是什么?- 当操作系统确定进程从其进程中删除不需要的内存时,调用此方法。例如,当它进入后台并且没有足够的内存来保持尽可能多的后台进程运行时,就会发生这种情况
-
OutOfMemory如何发生?
- 当Java虚拟机因内存不足而无法分配对象时抛出,并且垃圾收集器不再提供更多内存
内存优化
-
onTrimMemory()
方法是什么?开发者Android -
OutOfMemory如何发生?Geeksforgeeks
-
你如何在Android应用程序中发现内存泄漏?MindOrks
电池寿命优化
-
如何减少Android应用程序中的电池使用量?MindOrks
-
什么是Doze?App Standby怎么样?开发者Android
-
什么是
overdraw
?开发者Android
支持不同的屏幕尺寸
- 你是如何支持不同类型的决议的?
权限
- 许可中有哪些不同的保护级别?
本地编程
Android系统内部
-
什么是Dalvik虚拟机?
-
JVM,DVM和ART有什么区别?
-
Dalvik和ART之间有什么区别?
-
什么是DEX?
-
你能手动调用垃圾收集器吗?
调试和编程工具
-
什么是亚行?
-
什么是DDMS,你能用它做什么?
-
什么是StrictMode?MindOrks
-
什么是Lint?它是干什么用的?
其他
-
为什么Bundle类用于数据传递,为什么我们不能使用简单的Map数据结构
-
你如何解决崩溃的应用程序?
-
解释Android通知系统?
-
Serializable和Parcelable有什么区别?Android中哪种方法最好?
-
你开发了小部件吗?描述。MindOrks
-
什么是AAPT?
-
定期更新屏幕的最佳方法是什么?
-
FlatBuffers vs JSON。MindOrks
-
HashMap
,ArrayMap
和SparseArray
MindOrks -
如何在Android GitHub中处理多点触控
-
如何实现XML命名空间?
-
什么是支持库?为什么要介绍?MartianCraft
-
什么是Android数据绑定?开发者Android
-
什么是Android架构组件?MindOrks
-
如何使用RxJava运算符实现搜索?MindOrks
总结
花了一些功夫编写这篇文章,谢谢大家有耐心看完,因为篇幅原因,没能全放上来,有需要的朋友可以
关注+加群:
Android进阶技术交流 (895077617 )免费获取整理版的资料
群里可以与大神一起交流并走出迷茫。新手可进群免费领取学习资料,看看前辈们是如何在编程的世界里傲然前行!有想学习Android Java的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,ViewPager,Bitmap,组件化架构,四大组件等深入学习视频资料以及Android、Java全方面面试资料)