2024新型面试题-血虐面试官斩获字节跳动Offer!Android 精选版面试题级答案(Android

  • 分代回收发: 把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采取标记-压缩算法

集合、数据结构相关
1.你用过哪些集合类

数据结构中用于存储数据的有哪些

  • 数组

数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;

  • 链表

链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

2.说说hashMap是怎样实现的

哈希表:由数组+链表组成的

当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标)

如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。

如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

3.ArrayList,LinkedList的区别
  • ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

  • 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

  • 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

4.ArrayList和Vector的主要区别是什么?

ArrayList 和Vector底层是采用数组方式存储数据

  • Vector:

  • 线程同步

  • 当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍,

  • ArrayList:

  • 线程不同步,但性能很好

  • 当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小

5.HashMap和 HashTable 的区别:
  • HashTable比较老,是基于Dictionary 类实现的,HashTable 则是基于 Map接口实现的

  • HashTable 是线程安全的, HashMap 则是线程不安全的

  • HashMap可以让你将空值作为一个表的条目的key或value

算法相关

1.排序算法和稳定性,快排什么时候情况最坏?
2.给最外层的rootview,把这个根视图下的全部button背景设置成红色,手写代码,不许用递归

算法原理:

  • Android的view视图是按树形结构分布,所以按树形结构遍历

  • 循环判断每一层的ViewGroup元素,将其入栈;否则判断当前view是否是Button类实例,是则改写背景色

  • 当前ViewGroup检查childView完成后,判断栈是否非空,取出栈顶元素ViewGroup重复步骤2直至栈为空。

Thread、AsynTask相关


1.wait()和sleep()的区别
  • sleep来自Thread类,和wait来自Object类

  • 调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁

  • sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU

  • sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒

2.若Activity已经销毁,此时AsynTask执行完并且返回结果,会报异常吗?
  • 当一个App旋转时,整个Activity会被销毁和重建。当Activity重启时,AsyncTask中对该Activity的引用是无效的,因此onPostExecute()就不会起作用,若AsynTask正在执行,折会报 view not attached to window manager 异常

  • 同样也是生命周期的问题,在 Activity 的onDestory()方法中调用Asyntask.cancal方法,让二者的生命周期同步

3.Activity销毁但Task如果没有销毁掉,当Activity重启时这个AsyncTask该如何解决?

还是屏幕旋转这个例子,在重建Activity的时候,会回掉Activity.onRetainNonConfigurationInstance()重新传递一个新的对象给AsyncTask,完成引用的更新

4.Android 线程间通信有哪几种方式(重要)
  • 共享内存(变量);

  • 文件,数据库;

  • Handler;

  • Java 里的 wait(),notify(),notifyAll()

5.请介绍下 AsyncTask的内部实现,适用的场景是
  • AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来

  • 执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务,

  • 比如 HTTP 请求,大规模的下载和数据库的更改不适用于 AsyncTask,因为会导致线程池堵塞,没有

  • 线程来执行其他的任务,导致的情形是会发生 AsyncTask 根本执行不了的问题。

网络相关


1.TCP三次握手
2.为什么TCP是可靠的,UDP早不可靠的?为什么UDP比TCP快?
  • TCP/IP协议高,因为其拥有三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。

  • UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。

  • 但是就速度来说,还是UDP协议更高,毕竟其无需重复返回验证,只是一次性的

3.http协议了解多少,说说里面的协议头部有哪些字段?
  • http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议;http请求由三部分组成,分别是:请求行、消息报头、请求正文。

  • HTTP消息报头包括普通报头、请求报头、响应报头、实体报头

4.https了解多少

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

5.谈谈 HTTP 中Get 和 Post 方法的区别
  • GET - 从指定的服务器中获取数据,明文发送内容

  • POST - 提交数据给指定的服务器处理

  • POST请求不能被缓存下来

  • POST请求不会保存在浏览器浏览记录中

  • 以POST请求的URL无法保存为浏览器书签

  • POST请求没有长度限制

6.推送心跳包是TCP包还是UDP包或者HTTP包

心跳包的实现是调用了socket.sendUrgentData(0xFF)这句代码实现的,所以,当然是TCP包。

7.如何实现文件断点上传

在 Android 中上传文件可以采用 HTTP 方式,也可以采用 Socket 方式,但是 HTTP 方式不能上传

大文件,这里介绍一种通过 Socket 方式来进行断点续传的方式,服务端会记录下文件的上传进度,

当某一次上传过程意外终止后,下一次可以继续上传,这里用到的其实还是 J2SE 里的知识。

这个上传程序的原理是:客户端第一次上传时向服务端发送

“Content-Length=35;filename=WinRAR_3.90_SC.exe;sourceid=“这种格式的字符串,服务端 收到后会查找该文件是否有上传记录,如果有就返回已经上传的位置,否则返回新生成的 sourceid 以及 position 为 0,类似 sourceid=2324838389;position=0“这样的字符串,客户端收到返回后 的字符串后再从指定的位置开始上传文件。

Fragment相关


1.Fragment 如何实现类似 Activity 栈的压栈和出栈效果的?

Fragment 的事物管理器内部维持了一个双向链表结构,该结构可以记录我们每次 add 的

Fragment 和 replace 的 Fragment,然后当我们点击 back 按钮的时候会自动帮我们实现退栈操作。

2.Fragment 在你们项目中的使用
  • Fragment 是 android3.0 以后引入的的概念,做局部内容更新更方便,原来为了到达这一点要

  • 把多个布局放到一个 activity 里面,现在可以用多 Fragment 来代替,只有在需要的时候才加载

  • Fragment,提高性能。

Fragment 的好处:
  • Fragment 可以使你能够将 activity 分离成多个可重用的组件,每个都有它自己的生命周期和UI。

  • Fragment 可以轻松得创建动态灵活的 UI 设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。

  • Fragment 是一个独立的模块,紧紧地与 activity 绑定在一起。可以运行中动态地移除、加入、交换等。

  • Fragment 提供一个新的方式让你在不同的安卓设备上统一你的 UI。

  • Fragment 解决 Activity 间的切换不流畅,轻量切换。

  • Fragment 替代 TabActivity 做导航,性能更好。

  • Fragment 在 4.2.版本中新增嵌套 fragment 使用方法,能够生成更好的界面效果

3.如何切换 fragement,不重新实例化

正确的切换方式是 add(),切换时 hide(),add()另一个 Fragment;再次切换时,只需 hide()当前, show()另一个

四大组件相关

1.Activity和Fragment生命周期有哪些?

Activity——onCreate->onStart->onResume->onPause->onStop->onDestroy

Fragment——onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach

2.广播的两种注册方式及有什么区别
3.内存不足时,怎么保持Activity的一些状态,在哪个方法里面做具体操作?

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。除非该activity是被用户主动销毁的,通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

4.启动service的两种方法?有什么区别?

一种是startService(),另一种是bindService()。这两者的区别是第一种方式调用者开启了服务,即会与服务失去联系,两者没有关联。即使访问者退出了,服务仍在运行。如需解除服务必须显式的调用stopService方法。主要用于调用者与服务没有交互的情况下,也就是调用者不需要获取服务里的业务方法。比如电话录音。而后者调用者与服务绑定在一起的。当调用者退出的时候,服务也随之退出。用于需要与服务交互。

5.Android中的Context, Activity,Appliction有什么区别?

相同:Activity和Application都是Context的子类。

Context从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的总用,方便我们可以简单的访问到各种资源。

不同:维护的生命周期不同。 Context维护的是当前的Activity的生命周期,Application维护的是整个项目的生命周期。

使用context的时候,小心内存泄露,防止内存泄露,注意一下几个方面:

不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的。

对于生命周期长的对象,可以使用application,context。

避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。

6.Context是什么?

它描述的是一个应用程序环境的信息,即上下文。

该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(ContextIml)。

通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent,信息,等。

7.Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?

默认情况,如果没有显示的指 servic 所运行的进程, Service 和 activity 是运行在当前 app 所在进

程的 main thread(UI 主线程)里面。

service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )

特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让 service 在另外的进程中执行 ? 1 2 3 4 5

8.Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的Service?

Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 进行绑定,当绑定成功的时候 Service 会将代理对象通过回调的形式传给 conn,这样我们就拿到了Service 提供的服务代理对象。

在 Activity 中可以通过 startService 和 bindService 方法启动 Service。一般情况下如果想获取Service 的服务对象那么肯定需要通过 bindService()方法,比如音乐播放器,第三方支付等。如果仅仅只是为了开启一个后台任务那么可以使用 startService()方法。

9.说说 Activity、Intent、Service 是什么关系

他们都是 Android 开发中使用频率最高的类。其中 Activity 和 Service 都是 Android 四大组件之一。他俩都是 Context 类的子类 ContextWrapper 的子类,因此他俩可以算是兄弟关系吧。不过兄弟俩各有各自的本领,Activity 负责用户界面的显示和交互,Service 负责后台任务的处理。Activity和 Service 之间可以通过 Intent 传递数据,因此可以把 Intent 看作是通信使者。

10.请描述一下 BroadcastReceiver

BroadCastReceiver 是 Android 四大组件之一,主要用于接收系统或者 app 发送的广播事件。

广播分两种:有序广播和无序广播。

内部通信实现机制:通过 Android 系统的 Binder 机制实现通信。

无序广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不

能将处理结果传递给下一个接收者,并无法终止广播 intent 的传播。

11.为什么要用 ContentProvider?它和 sql 的实现上有什么差别?

ContentProvider 屏蔽了数据存储的细节,内部实现对用户完全透明,用户只需要关心操作数据的uri 就可以了,ContentProvider 可以实现不同 app 之间共享。

Sql 也有增删改查的方法,但是 sql 只能查询本应用下的数据库。而 ContentProvider 还可以去增删改查本地文件. xml 文件的读取等。

12.说说 ContentProvider、ContentResolver、ContentObserver 之间的关系

a. ContentProvider 内容提供者,用于对外提供数据

b. ContentResolver.notifyChange(uri)发出消息

c. ContentResolver 内容解析者,用于获取内容提供者提供的数据

d. ContentObserver 内容监听器,可以监听数据的改变状态

e. ContentResolver.registerContentObserver()监听消息。

View 相关
1.onInterceptTouchEvent()和onTouchEvent()的区别

onInterceptTouchEvent()用于拦截触摸事件

onTouchEvent()用于处理触摸事件

2.RemoteView在哪些功能中使用

APPwidget和Notification中SurfaceView和View的区别是什么?

SurfaceView中采用了双缓存技术,在单独的线程中更新界面View在UI线程中更新界面

4.View的绘制过程

一个View要显示在界面上,需要经历一个View树的遍历过程,这个过程又可以分为三个过程,也就是自定义View中的三要素:大小,位置,画什么,即onMesure(),onLayout(),onDraw()。

1.onMesure()确定一个View的大小;

2.onLayout()确定View在父节点上的位置;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

总而言之,Android开发行业变化太快,作为技术人员就要保持终生学习的态度,让学习力成为核心竞争力,所谓“活到老学到老”只有不断的学习,不断的提升自己,才能跟紧行业的步伐,才能不被时代所淘汰。

在这里我分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-heJ4i8Vb-1712676485436)]

最后

总而言之,Android开发行业变化太快,作为技术人员就要保持终生学习的态度,让学习力成为核心竞争力,所谓“活到老学到老”只有不断的学习,不断的提升自己,才能跟紧行业的步伐,才能不被时代所淘汰。

在这里我分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

[外链图片转存中…(img-vFtKHHW2-1712676485437)]

[外链图片转存中…(img-M7H0VaSd-1712676485437)]

[外链图片转存中…(img-amjTAIUG-1712676485437)]

还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-er2ibbtJ-1712676485438)]

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值