Android面试整理

作者: 挨踢小能手 | 来源:发表于2017-01-03 00:23 被阅读209次

    一、java部分


    String、StringBuffer与StringBuilder之间区别
    http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html

    ArrayList、Vector、LinkedList的存储性能和特性
    http://www.cnblogs.com/jiangyi-uestc/p/5682699.html

    理解java的三大特性之多态
    http://www.cnblogs.com/chenssy/p/3372798.html

    java抽象类的使用
    http://www.cnblogs.com/liangqiyuan/p/5568464.html

    Java内存管理
    http://www.cnblogs.com/andy-zhou/p/5316084.html

    HashMap和HashTable的区别
    http://www.cnblogs.com/lintong/p/4363533.html

    heap(堆)和stack(栈)的区别
    Java内存分为两类,一类是栈内存,一类是堆内存,栈内存是指程序进入一个方法时,会为这个方法单独分配一块存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈也会释放,这个栈中的变量也随之释放。
    堆一般用于存放对象,或final修饰的局部变量。

    ****wait()和sleep()的区别****
    1.sleep来自Thread类,和wait来自Object类
    2.调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
    3.sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU
    4.sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒,wait需要notify或notifyAll才能唤醒。

    ArrayList源码分析
    http://blog.csdn.net/jzhf2012/article/details/8540410

    垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法通知虚拟机进行垃圾回收?
    http://www.cnblogs.com/zhangxiaopeng/p/5001171.html

    线程池概念及使用
    http://www.cnblogs.com/dolphin0520/p/3932921.html

    JVM中的垃圾收集算法和Heap分区
    http://www.cnblogs.com/caca/p/jvm_gc_algorithm_heap_space.html

    内存泄露-基础知识
    http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=21&extra=page%3D1%26filter%3Ddigest%26digest%3D1

    内存泄露-排查方法
    http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=62&extra=page%3D6

    内存泄露-常见原因
    http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=125&extra=page%3D3

    算法
    http://www.jianshu.com/p/ae97c3ceea8d

    二、Android部分


    Handler异步处理信息机制
    http://blog.csdn.net/lmj623565791/article/details/38377229/

    View 事件传递
    http://a.codekk.com/blogs/detail/54cfab086c4761e5001b253e

    Parcelable和Serializable的区别
    http://blog.csdn.net/djun100/article/details/9667283

    View 绘制流程
    http://a.codekk.com/blogs/detail/54cfab086c4761e5001b253f

    多线程
    http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1022&extra=page%3D1%26filter%3Ddigest%26digest%3D1

    android存储数据方式
    1.sharePreference,它是android提供的用来存储一些简单配置信息的机制,采用了xml格式将数据存储到设备中。
    2.文件存储,即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
    3.SQLite存储,SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
    4.使用ContentProvider存储,主要用于应用程序之间的数据交换,从而能够让其他应用保存或读取此ContentProvider的数据。
    5.网络存储,通过网络上提供给我们的存储空间来上传和下载我们在存储空间的数据信息。

    view、surfaceView、GLSurfaceView的关系和区别
    view是最基础的,必须在UI主线程内更新画面,速度较慢。
    SurfaceView是view的子类,使用双缓机制,在新的线程中更新画面,刷新速度比View快。
    GLSurfaceView是SurfaceView的子类,openGL专用。

    横竖屏切换时,activity的生命周期
    1.不设置activity的android:configchanges时,切屏会重新调用各个生命周期,切横屏执行一次,切竖屏执行两次。
    2.设置activity的android:configchanges="orientation"时,切屏会重新调用各个生命周期,切横、竖屏只会执行一次。
    3.设置activity的android:configchanges="orientation|ketboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigChanged方法。

    何如打开raw目录中的数据库文件?
    在android中不能直接打开raw目录中的数据库文件,需要在程序第一次启动时,将文件复制到手机内存中或SD卡中,然后再打开数据库文件,复制的基本方法是使用getResources().openRawResource获得raw目录中资源的InputStream,然后将InputStream的数据写入其他目录中的相应文件,然后使用SQLiteDatabase打开。

    android四种启动模式
    standard:每启动一个新的activity,它就会在返回栈中入栈,并处于栈顶的位置。
    singleTop:栈顶复用模式,如果新activity已经位于任务栈的栈顶,那么此activity不会被重新创建,同时它的onNewIntent方法会被调用,如果不是则仍会创建。
    singleTask:栈内复用模式,这是一种单例模式,只要activity在一个栈内存在,那么多次启动此activity都不会被重新创建实例,会调用onNewIntent,并把次activity上的所有activity出栈。
    singleInstance:启动一个新的返回栈来管理这个activity,这个返回栈只有这个实例,不允许有别的activity存在。

    android内存优化
    1.循环内尽量不要使用局部变量。
    2.不用的对象即时释放。
    3.数据库的cursor及时关闭。
    4.构造adapter时,使用缓存的converview。
    5.即时关闭InputStream / OutputStream。
    6.对于service调用registReceiver()后,对应的生命周期方法中调用unRegistReceiver。
    7.图片尽量使用软引用,较大的图片可以通过BitmapFactory缩放后再使用,并及时recycle。

    加载大图片时如何防止内存溢出
    1.尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,通过BitmapFactory.decodeStream创建出一个bitmap,再将其设为ImageView的source。
    2.使用BitmapFactory.Options对图片进行压缩。
    3.运用java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免重复加载,及时销毁不再使用的bitmap对象。

    屏幕适配
    1.图片适配:不同手机分辨率会找到不同drawable对应的目录,在做屏幕适配时,会把一些对应分辨率的图片放在drawable中。
    2.布局适配:不同手机屏幕的大小不一样,可以让布局的展示也不一样,在res目录下创建layout-1280 *720文件夹,里面创建的布局文件会加载在1280 * 720 的手机屏幕上。
    3.尺寸适配:在res下创建values - 1280 * 720 文件夹,dimens代码用@dimen/imagewidth 调用。

    Application Not Responding(ANR)定位和修复
    1.主线程中存在耗时的计算。
    2.主线程中错误的操作(如Thread.wait或Thread.sleep)。
    3.BroadcastReceiver未在10秒内完成相关处理。
    4.Activity的onCreate和onResume回调中尽量避免耗时的代码

    如何避免OOM
    1.使用更加轻量的数据结构,如使用ArrayMap/SparseArray而不是HashMap等传统数据结构。
    2.避免在Android中使用Enum。
    3.减少bitmap对象的内存占用,通常有2个方法,inSampleSize缩放比例,把图片载入内存之前,我们需要计算出一个合适的缩放比例,避免不必要的大载入。 decode format:解码格式,选择ARGB_8888 / RBG_565 等存在很大差异。
    4.使用更小的图片,在涉及到资源图片时,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用更小的图片。
    5.内存对象的重复利用

    • 复用系统自带的资源,Android系统本身内置了很多的资源,如字符串、颜色、图片、动画、样式等,这些资源都可以在程序中直接引用。
    • 注意在listview等出现大量重复子组件的视图里堆ConvertView的复用。
    • Bitmap对象复用,在listview等显示大量图片的控件里,需要使用LRU的机制来缓存处理bitmap。

    6.避免对象的内存泄露,内存对象的泄漏,会导致一些不再使用的对象无法及时释放,这样一方面占用了宝贵的内存空间,很容易导致后续需要分配内存的时候,空闲空间不足而出现OOM。

    • 注意activity的泄露, 1.内部类引用导致activity的泄露(如Handler)。2.activity的context被传递到其他实例中。
    • 考虑使用Application Context而不是activity context

    7.谨慎使用static对象,因为static的生命周期过长,和应用程序保持一致,使用不当很可能导致对象泄漏。
    8.优化布局层次,减少内存消耗。

    Android常见的内存泄漏
    1.单例造成的内存泄漏:由于单例的静态特性使得其生命周期跟应用的生命周期一样长,如果使用不当很容易造成内存泄漏。(要传入context时,不要传入activity的context)
    2.匿名内部类,非静态内部类:都持有外部类的引用。
    3.Handler造成内存泄漏:如果Acitivty被finish,但延时任务还没处理完成,它会持有activity的引用而造成泄漏。 解决方法:声明Handler为静态的,则其存活期跟activity无关,同时通过弱引用方式传入activity,最后在activity的onDestory时应移除消息队列中的消息。
    4.尽量避免使用static成员变量。
    5.资源未关闭造成的内存泄漏:对于使用了BraodcastReceiver,File,游标 ,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

    AsyncTask原理及不足
    线程池有限,太多异步会满线程池,导致ANR(应用没反应)
    会开大量线程消耗系统资源导致应用FC(强制关闭)
    一旦doingbackground,cancel不了

    如何退出Activity?如何安全退出已调用多个Activity的Application?
    1.记录打开的Activity,定义一个活动集合类,对所有的活动进行管理。
    2.发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
    3.递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

    相关文章

      网友评论

        本文标题:Android面试整理

        本文链接:https://www.haomeiwen.com/subject/wedgvttx.html