您的位置:首页 > 职场人生

Android面试遇到的问题(1)

2017-02-14 10:13 267 查看

数据结构和算法类

顺序表和链表的区别?

顺序表随机访问快,插入删除慢;链表插入删除快,随机访问慢。

栈和队列的区别?

栈:先进后出,队列:先进先出

常用的排序算法有哪些?

冒泡排序、选择排序、快速排序、堆排序等。

快速排序的实现思想是怎样?快速排序的时间复杂度是多少?

划分,在待排序的数列中随机选择一个x,然后通过比较最终确定它在数列中的最终位置。这个数将原数列分成三部分:比x小的数、x、比x大的数。

在“比x小的数”和“比x大的数”中递归使用1的方法进行划分。直到每一个数都确定最终位置。

因为是不断地折半,所以时间复杂度是O(Log2 N)

冒泡排序的时间复杂度是多少?

O(n^2)

堆排序的原理是怎样?

需要先解释堆这种数据结构(完全二叉树),对每个非叶子节点,都有:左孩子比父节点小,右节点比父节点大。

将堆调整为大根堆或者小根堆的过程。

时间复杂度是O(N*LogN)

树有哪几种遍历方式?

前序遍历、中序遍历、后续遍历

对称加密算法有哪几种?

对称加密:加密和解密使用同一个密钥。有DES、3DES、AES等。

非对称加密:加密和解密需要两个Key:公钥和私钥。有RSA、DSA等

Hash算法是怎样的?

Hash算法(摘要算法)

Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA

哈希(Hash)算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。

画出HashMap的数据结构实现

网上找到一篇帖子:HashMap实现原理分析 ,感谢作者!

设计模式类

熟悉哪些设计模式,说明面试官指定的某个模式的具体的实现及原理。

单例、工厂、观察者、组合、代理、适配器、装饰者、Builder等。说自己理解的,不要给自己挖坑。面试官会继续问实现和使用的。

观察者模式可参考Android源码中的观察者模式

装饰者模式可参考理解装饰者模式

单例模式的缺点是什么?

单例模式在Android中生命周期较长,如果单例持有activity的引用,容易引发内存泄露问题。比如将登录模块的所有动作封装成的单例LoginBiz。

找到一篇博客单例模式优缺点

工厂模式有哪几种?简单工厂模式和工厂方法模式的区别是什么?

简单工厂模式、工厂方法模式、抽象工厂模式

适配者模式有哪几种?

静态代理和动态代理的区别是什么?

根据代理类的生成时间不同分为静态代理动态代理

静态代理:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

动态代理类:在程序运行时,运用反射机制动态创建而成。

Java基础类

什么是多态?多态的实现机制/原理是什么?

在面向对象语言中,接口的多种不同的实现方式即为多态。

父类的指针可以指向子类的对象

多态性在C++中都是通过虚函数实现的

多态的实现基础是动态绑定

HashCode相等的两个对象是否一定equals?



如果对象equals 是true,hashCode需要相同;但是hashCode相同的对象不一定equals。因为:

hashCode方法可以被重载,可能导致不同的对象拥有相同的哈希值。

Java中的hash函数返回的是int类型,最多允许存在2^32个,是有限的,所以两个不同的对象有可能恰好拥有相同的哈希值

一个对象什么时候会被垃圾回收器回收?

内存不足,且这个对象GC Root不可达时

Java虚拟机中的内存分哪几个区?GC垃圾回收机制是怎样的?

方法区、栈、堆、本地方法区等。

内存泄露和内存溢出的区别和联系?

内存泄露:本该释放的内存没有释放,并且自己也无法访问了。

内存溢出:申请的内存大于系统剩余可分配的内存。精满自溢。

内存泄露容易引发内存溢出。

怎样解决并发问题?有哪些关键字?2个线程间的并发问题和10个线程间的并发问题复杂度是否一样?

synchronize,volatile

线程越多,等待资源的问题越严重。

什么是死锁?

是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

Concurrent包中有哪些类?

BlockingQueue接口

ArrayBlockingQueue

DelayQueue

LinkedBlockingQueue

PriorityBlockingQueue

SynchronousQueue

ConcurrentMap

ConcurrentHashMap

ExecutorService接口

ThreadPoolExecutor

ScheduledExecutorService

可参考老外的博客系列Java Concurrency Utilities以及中文翻译 Java 并发工具包 java.util.concurrent 用户指南

RuntimeException有哪些常见的子类?

NullPointerException - 空指针引用异常

IndexOutOfBoundsException - 下标越界异常

IOException - 输入输出异常

ClassCastException - 类型强制转换异常

可参考常见的几种RuntimeException

RuntimeException和Exception的区别是什么?

Exception:在程序中必须使用try…catch进行处理。

RuntimeException:可以不使用try…catch进行处理,如果有异常产生,将由JVM进行处理。

关键字throw和throws的区别是什么?

throws:写在方法声明中,表示这个方法可能会抛出这些异常,调用者可能要处理这些异常。

throw: 写在方法体内,明确了这个地方要抛出这个异常。

有没有使用过未捕获的异常?

Android中使用UncaughtExceptionHandler捕获全局异常。

后期不用UncaughtExceptionHandler,直接使用友盟统计线上崩溃。

集合有哪些?Collection有哪些子类?

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set-HashSet

Map

├Hashtable

├HashMap

Collection和Collections的区别?

Collection是集合接口

Collections是工具类,含有sort、binarySearch、reverse等方法。

HashMap怎么遍历?

迭代器

可参考遍历HashMap的四种方法

Android基础类

消息推送的原理是什么?

维持一个长连接

ContentProvider和SQLite的区别和联系是什么?

SQLite:android平台上的轻量级数据库

ContentProvider:向其他应用暴露接口访问自己的数据,接口内容由自己定义,一般通过SQLite方式,也可以文件方式等!

IntentService和Service的区别是什么?

一个Activity启动另一个Activity时,调用了各自的哪些生命周期函数?

Activity和Fragment之间怎么相互通信?

Activity 传给Fragment:setArgument()

Fragment传给Activity: Fragment中有Activity的引用,直接修改Activity的属性或者调用Activity的成员方法。

ViewPager+Fragment怎样实现懒加载?

怎样弹出像QQ在别处登录时弹出的那种全局对话框?

你的App开发中有哪些单例?什么时候初始化?

UserInfo、PathManager等,Application中初始化。

有没有使用过多进程开发?进程间有哪几种通信方式?

进程间通信的方式:Content Provider、Broadcast、AIDL、Messenger、文件共享、Socket等

Binder机制是什么?

View的绘制流程是怎样?三个流程方法的时序是怎样?onMeasure中有哪几种测量模式?

onMeasure()、onLayout()、onDraw()

3种测量模式:EXACTLY、AT_MOST、UNSPECIFIED

View的事件分发流程是怎样?主要有哪几个函数,他们的调用先后顺序是怎样?

DispatchTouchEvent()、OnInterceptTouchEvent()、onTouchEvent(),责任链模式

Android开发中哪些情况容易造成内存泄露?怎样解决?

有没有做过JNI?System.gc能不能把C++层面的对象给回收掉?

你在实际开发中遇到哪些内存泄露的例子?是怎么解决的?

内存泄露的工具使用?内存泄露的检测。MAT怎样查看具体哪个对象泄露?

MAT

leakCanary 参考 LeakCanary使用指南(1)

开发中是否遇到过ANR问题,是怎么排查的?

首先分析log

从trace.txt文件查看调用栈,adb pull data/anr/traces.txt ./mytraces.txt

看代码

仔细查看ANR的成因(iowait?block?memoryleak?)

1、在activity中超过5秒的时间未能响应下一个事件。

2、BroadcastReceive超过10秒

你选择一个网络框架的标准是什么?怎样才算一个合格的网络请求框架?你封装一个网络请求框架的要点是什么?

看过哪些框架的源码?

EventBus和ButterKnife是作什么用的?

使用过哪些图片框架?什么是三级缓存?LRU策略是什么?Glide可以设置哪些东西?

有没有使用过MVP模式?

使用过哪些布局辅助工具?

需要强记的Android基础知识

Activity、Fragment生命周期

Activity: onCreate(), onStart(), onResume(), onPause(), onStop(), onStop(), onRestart()

Fragment: 与Activity相比,没有onRestart(), 多了onAttach(), onCreateView(), >onActivityCreated(), onDestroyedView, onDetach(), onViewCreated()

Activity的四种启动模式和区别。Standard和SingleInstance好说,都是极端,SingleTop和SingleTask要区分。SingleTop是顶部复用,即A->B->C->C,结果是复用C,不会再重新启动C。而SingleTask是A->B->C->A,结果是A,会把BC清掉。

通过Acitivty的xml标签来改变任务栈的默认行为

使用android:launchMode=”standard|singleInstance|singleTask|singleTop”来控制Acivity任务栈。

任务栈是一种后进先出的结构。位于栈顶的Activity处于焦点状态,当按下back按钮的时候,栈内的Activity会一个一个的出栈,并且调用其onDestory()方法。如果栈内没有Activity,那么系统就会回收这个栈,每个APP默认只有一个栈,以APP的包名来命名.

standard : 标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动三回调(onCreate()->onStart()->onResume())都会执行。

singleTop : 栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以它的启动三回调就不会执行,同时Activity的onNewIntent()方法会被回调.如果Activity已经存在但是不在栈顶,那么作用与standard模式一样.

singleTask: 栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,onNewIntent(),并且singleTask会清理在当前Activity上面的所有Activity.(clear top)

singleInstance : 加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了

Handler原理

AsyncTask原理?AsyncTask中的线程池是串行还是并行?

看版本

Recycler和List的区别,ListView的优化,重用机制

上帝视角类

什么是64k问题?为什么有这个问题?

是否随时关注着Google在Android方面的新动向?

Android5.0以后有哪些新特性?

对Android的前景怎么看?你个人的近期(一年)规划是怎样?

有没有开源过项目?

对各种开源组件怎么技术选型?

APP如何调优?

怎样设计Android和iOS统一的接口,屏蔽掉Context,因为iOS中没有Context。

面试者可能想听到的回答是Hybrid开发。

请举一个你实际解决问题的实例。

生产环境和测试环境频繁切换,需要重新打包。在App中增加后门,可配置环境。

你的优势是什么?

计算机专业基础、学历、英语(直接阅读英文技术文档的能力)、学习能力(从Java迅速转Android、有从0到1的项目经历)等

怎样使用EditText在不本地缓存的情况下实现快速搜索的联想功能?可以网络请求,但是用户的输入很快,需要实时响应。不能使用AutoCompleteTextView。

有可能是他们实际开发中无法解决的问题拿出来考面试者
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息