Android面试备忘录(数据结构和算法+核心Android)

作者 : 开心源码 本文共5801个字,预计阅读时间需要15分钟 发布时间: 2022-05-13 共205人阅读

数据结构和算法

关于数据结构和算法主题的问题水平完全取决于你应聘的公司水平。

  • 排列

    • 数组由一组具备相同数据类型的元素组成。它连续存储在内存中,通过使用其索引,您可以找到基础数据。阵列可以是一维的和多维的。一维数组是最简单的数据结构,也是最常用的数据结构。值得注意的是,在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条目。
  • 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

  • 解释ActivityFragment生命周期。(完整的图表GitHub,Activity,Fragment的简化图),Activity生命周期和Fragments生命周期

  • 什么是“发射模式”?MindOrks

片段

  • 什么是Fragment?MindOrks

  • a Fragment和an有Activity什么区别?解释两者之间的关系。

  • 为什么建议仅使用默认构造函数来创立Fragment?堆栈溢出

  • 你会如何在两个碎片之间进行通信?Android官方

  • 保留Fragment什么?AndroidDesignPatterns

视图和ViewGroups

  • 什么是ViewAndroid?MindOrks

  • 区别View.GONEView.INVISIBLE?堆栈溢出

  • 你能创立自己设置视图吗?怎样样?MindOrks

  • 什么是ViewGroups以及它们与Views的不同之处?

  • 什么是画布?

  • 什么是SurfaceView

  • 相对布局与线性布局。MindOrks

  • 讲述束缚布局MindOrks

  • 你知道什么是视图树吗?你怎样能优化它的深度?

显示内容列表

  • ListView和之间有什么区别RecyclerView

  • 什么是ViewHolder模式?我们为什么要使用它?

  • 什么是SnapHelper?MindOrks

Dialogs and Toasts

  • 什么是DialogAndroid?

  • 什么是ToastAndroid?

  • Dialog和之间有什么区别Dialog Fragment

Intents and Broadcasting

  • 什么是Intent?堆栈溢出

  • 什么是隐含的Intent? 堆栈溢出

  • 什么是明确的Intent

  • 什么是BroadcastReceiver?堆栈溢出

  • 什么是LocalBroadcastManager?开发者Android

  • 一个人的功能是IntentFilter什么?堆栈溢出

  • 什么是粘性Intent?AndroidInterview

  • 形容广播和用意如何在您的应用中传递消息?

  • 什么是PendingIntent

  • 什么是不同类型的广播?

服务

  • 什么是Serivce?开发者Android

  • ServiceVS IntentService。堆栈溢出

  • 什么是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?这会导致什么问题?如何避免这些问题?

  • 解释LooperHandlerHandlerThread。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

支持不同的屏幕尺寸

  • 你是如何支持不同类型的决议的?

权限

  • 许可中有哪些不同的保护级别?

本地编程

  • 什么是NDK,为什么它有用?MindOrks

  • 什么是renderscript?MindOrks

Android系统内部

  • 什么是Dalvik虚拟机?

  • JVM,DVM和ART有什么区别?

  • Dalvik和ART之间有什么区别?

  • 什么是DEX?

  • 你能手动调用垃圾收集器吗?

调试和编程工具

  • 什么是亚行?

  • 什么是DDMS,你能用它做什么?

  • 什么是StrictMode?MindOrks

  • 什么是Lint?它是干什么用的?

其余

  • 为什么Bundle类用于数据传递,为什么我们不能使用简单的Map数据结构

  • 你如何处理崩溃的应用程序?

  • 解释Android通知系统?

  • Serializable和Parcelable有什么区别?Android中哪种方法最好?

  • 你开发了小部件吗?形容。MindOrks

  • 什么是AAPT?

  • 定期升级屏幕的最佳方法是什么?

  • FlatBuffers vs JSON。MindOrks

  • HashMapArrayMapSparseArray MindOrks

  • 什么是注释?MindOrks,Link,Video

  • 如何在Android GitHub中解决多点触控

  • 如何实现XML命名空间?

  • 什么是支持库?为什么要详情?MartianCraft

  • 什么是Android数据绑定?开发者Android

  • 什么是Android架构组件?MindOrks

  • 如何使用RxJava运算符实现搜索?MindOrks

总结

花了少量功夫编写这篇文章,谢谢大家有耐心看完,由于篇幅起因,没能全放上来,有需要的朋友可以

关注+加群:

Android进阶技术交流 (895077617 )免费获取整理版的资料

群里可以与大神一起交流并走出迷茫。新手可进群免费领取学习资料,看看前辈们是如何在编程的世界里傲然前行!有想学习Android Java的,或者是转行,或者是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,ViewPager,Bitmap,组件化架构,四大组件等深入学习视频资料以及Android、Java全方面面试资料)

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android面试备忘录(数据结构和算法+核心Android)

发表回复