查看原文
其他

最新2017(Android)安卓面试题级答案(精选版)

2017-05-03 androidstarack 终端研发部

java相关



静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?

  • 静态内部类:使用static修饰的内部类

  • 内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类

  • 匿名内部类:使用new生成的内部类

  • 因为内部类的产生依赖于外部类,持有的引用是类名.this


Java中try catch finally的执行顺序


先执行try中代码,如果发生异常执行catch中代码,最后一定会执行finally中代码



equals与==的区别:


==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相


Object有哪些公用方法?

  • 方法equals测试的是两个对象是否相等

  • 方法clone进行对象拷贝

  • 方法getClass返回和当前对象相关的Class对象

  • 方法notify,notifyall,wait都是用来对给定对象进行线程同步的


String、StringBuffer与StringBuilder的区别

  • String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象

  • StringBuffer和StringBuilder底层是 char[]数组实现的

  • StringBuffer是线程安全的,而StringBuilder是线程不安全的



Java的四种引用的区别

  • 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象

  • 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

  • 弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象

  • 虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。


    介绍垃圾回收机制


    • 标记回收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象,一般使用单线程工作并且可能产生内存碎片

    • 标记-压缩回收法:前期与第一种方法相同,只是多了一步,将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域,提高了内存利用率

    • 复制回收法:把现有内存空间分成两部分,gc运行时,它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。

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


    集合数据框架



    你用过哪些集合类

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

    • 数组

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

    • 链表

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


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

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

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

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


    ArrayList,LinkedList的区别

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

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

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


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

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

    • Vector:

      • 线程同步

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

    • ArrayList:

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

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


    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相关别:



    wait()和sleep()的区别

    • sleep来自Thread类,和wait来自Object类

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

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

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


    若Activity已经销毁,此时AsynTask执行完并且返回结果,会报异常吗?

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

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


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


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


    Android 线程间通信有哪几种方式(重要)

    • 共享内存(变量);

    • 文件,数据库;

    • Handler;

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


    请介绍下 AsyncTask的内部实现,适用的场景是

    • AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来

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

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

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

    网络相关



    1.TCP三次握手

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

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

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


    http协议了解多少,说说里面的协议头部有哪些字段?

    • http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议;http请求由三部分组成,分别是:请求行、消息报头、请求正文。

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


    https了解多少


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


    谈谈 HTTP 中Get 和 Post 方法的区别

    • GET - 从指定的服务器中获取数据,明文发送内容

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

    • POST请求不能被缓存下来

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

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

    • POST请求没有长度限制


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

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


      Fragment相关



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

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

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


      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 使用方法,能够生成更好的界面效果


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


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


        请参考Java面试题:

                Android经典面试题汇总


        让心,在阳光下学会舞蹈

        让灵魂,在痛苦中学会微笑

        —终端研发部—



        博客地址

            http://blog.csdn.net/androidstarjack


        如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809   

        微信公众号:终端研发部


                    

        Hello,伙伴们

        长按二维码就可以关注我们啦


        您可能也对以下帖子感兴趣

        文章有问题?点此查看未经处理的缓存