前言:
金三银四的跳槽季过去了,大部分的程序员在这个时候已然找到了自己合适或还算满意的岗位公司。但也有大部分人仍在不断的重复面试,复试。然后淘汰还不能达到自己理想的企业公司,又或者被企业公司淘汰。在不断面试的过程中你就会发现,实际上Android程序员在这个过程中面临的挑战越来越大,初级程序员越来越难找到工作,中级程序员人数越来越多,高级程序员越来越吃香,但工资却越来越难有所提升,同一Android岗位的竞争越来越多,而培训班的简历年限也是越来越夸张。下面我总结了一些深圳各大中小型企业公司的面试题目,这些都学(背)起来,在深圳,面试招聘要求1-3年的Android 岗位,不用愁。
JAVA基础
1.java三大特性
封装,继承,多态(少说也要会扯一点概念性的东西出来)
2.基本数据类型及占用的字节数
基本类型有byte,short,int,long,float,double,boolean,char
引用类型有 对象(包括String)、数组
类型 | 包装类 | 所占位数(二进制) | 所占字节数 |
---|---|---|---|
byte(字节) | Byte | 8 | 1 |
short(短整型) | Short | 16 | 2 |
int(整型) | Integer | 32 | 4 |
long(长整型) | Long | 64 | 8 |
float(浮点型) | Float | 32 | 4 |
double(双精度) | Double | 64 | 8 |
char(字符型) | Character | 16 | 2 |
boolean(布尔型) | Boolean | 1 |
3.进程与线程
一个程序至少有一个进程,一个进程至少有一个线程
4.java的四种引用?
强引用、弱引用、软引用、虚引用(了解,并知道如何使用)
5.equals与==的区别
==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相等
6.java反射机制
java反射机制是在运行时,对于任意一个类,都能够知道这个类所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法等功能称为java语言的反射机制。java反射机制主要提供了一下功能:a)在运行时判断任意一个对象所属的类;b)在运行时构造任意一个类的对象;c)在运行时判断任意一个类所具有的成员变量和方法;d)在运行时调用任意一个对象的方法,生成动态代理
7.Maven 和ANT 有什么区别
虽然两者都是构建工具,都用于创建java应用,但是Maven做的事情更多,在基于“约定优于配置”的概念下,提供标准的java项目结构,同时能为应用自动管理依赖应用中所依赖的jar文件。
8.进程间通信方式
intent,bind机制(IPC - > AIDL),Messenger,broadcastReceiver广播
9.Dalvik虚拟机与JVM有什么区别
Dalvik基于寄存器,而JVM基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。Dalvik执行.dex格式的字节码,而JVM执行.class格式的字节码
网络篇:
1.http与https的区别:
https = http + ssl +加密算法+证书验证
http使用80 端口,https使用443端口
2.Http 中的Get和Post方法的区别
Get 从指定的服务器中获取数据,明文发送内容
Post 提交数据给指定的服务器处理
a)Post请求不能被缓存下来
b)Post请求不会保存在浏览器浏览记录中
c)以Post请求的URL无法保存为浏览器书签
d)Post请求没有长度限制
3.tcp与udp区别
(TCP)传输控制协议,是一种提供可靠数据传输的通用协议。
(UDP)用户数据报协议,是一个面向无连接的协议。采用该协议不需要两个应用程序先建立连接。UDP协议不提供差错恢复,不能提供数据重传,因此该协议传输数据安全性差。
4.常见的服务器错误代码
400 - 错误的请求
401 - 访问被拒绝
403 - 禁止访问
500 - 内部服务器错误
502 - 网关错误
Android 基础篇:
1.activity生命周期,fragment生命周期,broadcastReceiver生命周期,service生命周期
activity:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()
fragment:onAttach() -> onCreate() -> onCreateView() -> onActivityCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroyView() -> onDestroy ->onDetach()
broadcastReceiver:10秒左右,onReceive() 方法开始到结束
service:
a)startService(): onCreate() -> onStartCommand() -> service running -> onDestroy()
b)bindService():onCreate() -> onBind() -> Clients are bound to service -> onUnbind() -> onDestory()
2.service如何操作activity
a)直接把activity传给service,service通过activity实例随便操作activity
b)使用接口回调方式,activity实现相应的接口,service通过接口进行回调
c)使用广播
3.如何解决方法数65K的问题
使用Android Studio的 gradle 可以构建MutilDex
4.intent 可以传递哪些数据类型
1.Serializable
2.charsequence 主要用来传递String,char等
3.parcelable
4.Bundle
5.Activity的启动模式:
1.Standard:默认标准模式,每启动一个都会创建一个实例
2.SingleTop:栈顶服用,如果在栈顶就调用onNewIntent复用,从onResume()开始
3.SingleTask:栈内复用,本栈内只要用该类型Activity就会调到栈顶复用,从onResume()开始
4.SingleInstance:单例模式,除了3中的特性,系统会单独给该Activity创建一个栈
6.说说xml 三种解析方式
DOM:检索和更新效率高;对于特别大的文档,解析和加载整个文档将会很耗资源
SAX:解析速度快,占用内存小;代码量大,不能倒退
PULL:小巧轻便,解析速度快,简单易用,可随时停止解析,适用于XML文档较大但只需要文档的一部分时
7.Android线程间通信有哪几种方式
a)共享变量(内存)
b)管道
c)handler机制
8.子线程中能不能new handler?
当然可以,子线程可以new一个mainHandler,然后发送消息到UIThread
9.横竖屏切换时候Activity的生命周期
a)不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
b)设置Activity的android:configChanges=“orientation”时,切屏还是会重新调用各个生命周期,切横竖屏时只执行一次
c)设置Activity的android:configChanges=“orientation | keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
10.浅谈MVC、 MVP、 MVVM区别与联系
这个自由发挥,不会答的请看以下链接
浅谈MVC,MVP,MVVM区别与联系
11.什么是内存泄漏、内存溢出。两者之间的区别
内存泄露(Memory Leak)指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态内存泄露和硬件没有关系,它是由软件设计缺陷引起的。
内存溢出(Memory Overflow)指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。比如你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,就是溢出
相同点:都会导致应用程序运行出现问题,性能下降或挂起。
不同点:
- 内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出。
2)内存泄露可以通过完善代码来避免;内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。
12.广播的两种注册方法,有什么区别
动态注册:动态注册的优先级高于静态注册,Activity关闭不能接受广播,无需在清单文件注册
静态注册:Activity关闭还能接受广播,只要设备处于开启状态就能接收
Android 进阶篇:
1.为什么会出现ANR,如何避免ANR
出现的原因有三种:
a)KeyDispatchTimeout(5 seconds)主要类型按键或触摸事件在特定时间内无响应
b)BroadcastTimeout(10 seconds)BoradcastReceiver在特定的时间内无法处理
c)ServiceTimeout(20 seconds)小概率类型Service在特定的时间内无法处理完成
避免ANR最核心的一点就是在主线程减少耗时操作。通常需要从那个以下几个方案下手:
a)使用子线程处理耗时IO操作
b)降低子线程优先级,使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同
c)使用Handler处理子线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程
d)Activity的onCreate和onResume回调中尽量避免耗时的代码
e)BroadcastReceiver中onReceiver代码也要尽量减少耗时操作,建议使用intentService处理。intentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题
2.什么是三级缓存?三级缓存的原理
网络加载,不优先加载,速度慢,浪费流量
本地缓存,次优先加载,速度快
内存缓存,优先加载,速度最快
首次加载Android App时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中,之后运行APP时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中图片,最后选择访问网络
3.ListView卡顿的原因以及优化策略
重用converView
减少findViewById()操作
避免在getView()方法中做耗时的操作
item的布局层次结构尽量简单,避免布局太深或者不必要的重绘
尽量能保证Adapter的hasStablelds()返回true
在一些场景中,ScollView内会包含多个ListView,可以把ListView的高度写死固定下来
使用RecycleView代替ListView
ListView中元素避免半透明
尽量开启硬件加速
4.View的绘制过程
一个View要显示在界面上,需要经历一个 View树的遍历过程,这个过程又可以分为三个过程,也就是自定义View中的三要素:大小,位置,画什么,即onMesure() , onLayout() , onDraw()
1.onMesure()确定一个View的大小
2.onLayout()确定View在父节点上的位置
3.onDraw()绘制View的内容
5.简述AIDL机制
AIDL(Android Interface Definition Language),Android 接口定义语言,Android 提供的IPC(InterProcess Communication,进程间通信)的一种独特实现。
使用AIDL只有在你允许来自不同应用的客户端夸进程通信访问你的service,并且想要在你的service中处理多线程的时候才时必要的。如果你不需要执行不同应用之间的IPC并发,你应该通过实现Binder建立你的接口,或者如果你想执行IPC,但是不需要处理多线程。那么使用Messenger实现你的接口
a)建立.aidl文件
b)实现这个接口
c)暴露这个接口给客户端
6.简述android事件分发机制
android事件分发机制就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,最后被消费的过程,在android中还是比较复杂的传递流程。如下:
a)事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或者拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理
b)事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递
c)如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数
d)如果View没有对ACTION_DOEN进行消费,之后其他的事件不会传递过来
e)onTouchListener优先于onTouchEvent()对事件进行消费
7.简述Handler机制
Handler的作用就是:调度消息和runnable对象去被执行;使动作在不同的线程中被执行
Handler机制上android中异步消息处理机制,也就是异步消息处理线程启动后会进入一个无限循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。而它们之间的关系是,消息循环Looper负责创建一个消息队列MessageQueue,而消息队列MessageQueue是消息Message的容器,也是装消息Message的地方,然后进入一个无限循环体不断从该消息队列MessageQueue中读取消息,而消息的创建者和处理者就是一个或多个Handler
8.你是如何进行性能优化的
这个自己根据实际情况回复。
这里推荐一下内存泄漏检测框架 Leakcanary,不会用的可以看下我写过这样的一篇文章
LeakCanary直面项目中的内存泄露
逻辑题:
1.有两个杯子,一个5升一个6升,很多水,请问如何取得3升水
先装满5升的倒进6升的,再装满五升的把五升的往刚刚有五升水的六升杯子里装,得到4升水和6升满的水,倒掉6升满的把4升往6升里到再装满5升的往刚刚倒4升的6升杯子里倒。得到3升水
2.有27个人要买水,每3瓶矿泉水瓶子可以换1瓶矿泉水,请问要买多少瓶水刚好够27人喝
设应买X瓶水
则X+X/3+X/9=27 13X=243 X=18.6 X取整数为19
买19瓶水,换19/3=6瓶余1瓶 6瓶可以再换2瓶 2瓶加上刚余的一瓶可再换1瓶
一共可以换19+6+2+1=28瓶
3.小吴小张小赵3人是好朋友,他们一个人经商,一个人上大学,一个人当兵,小赵的年龄比士兵大,大学生的年龄比小张小,小吴的年龄和大学生的年龄不一样。那他们谁是商人,谁是大学生,谁是士兵
小王是士兵,张是商人,赵是大学生(结论自己推)
4.已知:有五位小姐排成一列 所有小姐穿的衣服颜色都不一样 所有小姐的姓也不同 所有的小姐都养不同的宠物,喝不同的饮料,吃不同的水果 钱小姐穿红色的衣服 翁小姐养了一只狗 陈小姐喝茶 穿绿衣服的站在穿白衣服的左边穿绿衣服的小姐喝咖啡 吃西瓜的小姐养鸟 穿黄衣服的小姐吃橙子 站在中间的小姐喝牛奶 赵小姐站在最左边 吃橘子的小姐站在养猫的隔壁 养鱼的小姐隔壁吃橙子 吃苹果的小姐喝香槟 江小姐吃香蕉 赵小姐站在蓝衣服的隔壁 只喝开水的小姐站在吃橘子的隔壁
问:哪位小姐养蛇
答:题目源自1981年柏林的德国逻辑思考学院改编的,98%的测试者无法解题 (国内某家半导体设计公司曾以此题目招考员工)
逻辑思维好的可以做着试试看,下面是答案及推理过程
http://blog.csdn.net/georgechen_ena/article/details/6726735
▲写在之后的话:
目前的话,能想到的就是这些。还有一些,简短的文字并不能很好的表达出来,还是要靠自己去理解。比如面试中,handler相关的问题总是会被人追根究底,handler的源码还是有必要了解。项目中如果使用了网络框架(包括OkHttp、Retrofit、NoHttp、xUtils3等),响应式编程rx系列(RxJava,RxAndroid,RxBinding等),事件总线框架(EventBus、otto等),至少在面试的时候能清楚的说出任意一个的源码。并且写在简历上的项目,其中包含的技术,能清晰使用语言表达并熟练的使用。
最后推荐一个简书面试专辑,其中收录了大量的面试题,面试题经验,老司机给新人的建议,非常值得关注。
code小生《Android面试专辑》
关于我:
- Android开发交流QQ群:537891203
- 邮箱:donkor@yeah.net