欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Android中高级面试题目整理.docx

    • 资源ID:68226893       资源大小:192.92KB        全文页数:57页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Android中高级面试题目整理.docx

    、Java部分1、java 中=和 equals 和 hashCode 的区别基本类型:=比较的是值,引用类型:=比较的是内存地址equals在没i被相説的情况下比较的都是地址hashCode比较的是集合,hashCode返回的是hash地址long各占多少字节数Byte:1个字节boolean:至少个字节,short:2个字节.char:2个字行,int:4个字节, f】oat:4个字节,long:8个字节,double:8个字节3、String、Strinuffer、StringBuiIder 区别string对象不可变,后两者是可变:string因为不可变所以线程安全,StringBuffer对 方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,StringBuilder并没有 对方法进行加同步锁,所以是非线程安全的.如何程序不是多线程的,StringBuilder效 率高于 StringBuffer.4、什么是内部类?内部类的作用在java语言中,可以把个类定义到另外一个类的内部,在类里面的这个类就叫内部类, 外面的类就叫外部类.作用,1 .隠就你不想让别人知道的操作,也即封装性.2 .个内部类对象可以访问创建它的外部类对象的内容.甚至包括私有变量!内部类可以分为多种:主要以下4种:静态内部类.成员内部类.局部内部类.匿名内部类态内部类静态内部类是指被声明为static的内部类.他可以不依赖内部类而实例.而通常的内 部类需要实例化外部类.从血实例化.静态内部类不可以有与外部类有相同的类名.不能 访问外部类的普通成员变量.但是可以访问静态成员变量和静态方法(包括私有类型)成员内部类个静态内部类去掉static就是成员内部类,他可以f!由的引用外部类的属性和方 法.无论是静态还是非静态.但是不可以有静态属性和方法局部内部类定义在个代码块的内类,他的作用范围是所在代码块,是内部类中最少使用的类型. 局部内部类跟局部变量样,不能被public . protected, private以及static修饰.只 能访问方法中定义final类型的局部变量匿名内部类匿名内部类是种没有类名的内部类,不使用class, extends, implements.没有构 造函数,他必须继承其他类或实现其他接口.匿名内部类的好处是使代码更加简洁,紧凑, 但是带来的问题是易读性降.5、抽发类和接口区别抽歡类:抽象方法必须用abstract关键字进行修饰.如果个类含有抽象方法.则称这个类为抽象 类.抽象类必须在类前用abstract关键字修饰.抽象类就是为了继承而存在的如果个类维承干个抽象类.则子类必须实现父类的抽象方法.如果子类没有实现父类 的抽象方法,则必须将子类也定义为为abstract类.接口i接口中的变殳会被院式地指定为public static fina!变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract 方法且只能是public abstract方法(用其他关键字.比如private, protected, static, fina!等修饰会报编译错误),并且接口中所有的方法不 能有具体的实现,也就是说,接口中的方法必须都是抽象方法.区别,抽象类可以提供成员方法的实现细賛,而接口中只能存在public abstract方法:抽象类中的成员变量可以是各种类型的.而接口中的成员变量只能是public staticfinal类型:接口中不能含有静态代码块以及静态方法,血抽农类可以有静态代码块和静态方法:个类只能继承一个抽象类,而个类却可以实现多个接口.6、事些情况下的对歡会被垃圾回收机制处理掉?1 .没有引用指向2 .只有弱引用指向并且不回收弱引用对象的话存储区无空间3 .虚引用指向的对象满足以上任意条件则在gc时会回收7、讲一下常见编码方式?ASCII, ISO-8859-k GB2312. GBK. UTF-8、 UTF-16 等8、»态代理和动态代理的区别,什么场景使用?A态代理:由程序员创建或由特定工具力动生成源代码,再对其编译在程序运行前,代 理类的.class文件就已经存在了.动态代理:在程序运行时,运用反射机制动态创建而成.10、final, finally, finalize 的区别final:修饰类、成员变量和成员方法,类不可被承承,成员变量不可变,成员方法不可重 写finally:与try. catch.共同使用,确保无论是否出现异常都能被调用到finalize:类的方法,垃圾回收之前会调用此方法,子类可以重'弓finalize。方法实现对资 源的回收11、Serializable 和 Parcelable 的区别Serializable: Java序列化接口在硬盘上读写读写过程中有大量临时变量的生成,内 部执行大盘的"。操作,效率很低.Parcelable: Android序列化接L!效率高使用麻烦在内存中读写(AS有相关插件 健生成所需方法),対象不能保存到磁盘中12、舞些情况下的对霰会被垃圾回收机制处理掉?1 .所有实例都没有活动线程访问.2 .没有被其他任何实例访问的循环引用实例.3 . Java中有不同的引用类型判断实例是否符合垃圾收集的条件都依赖F它的引用类型.要判断怎样的对象是没用的对象.这里有2种方法:1 .采用标记计数的方法:给内存中的对象给打上标记,対象被引用一次计数就加I,引用被拜放了,计数就减, 当这个计数为的时候,这个対象就可以被冋收了.当然,这也就引发了一个问题:循环 引用的対象是无法被识别出来并且被回收的.所以就有了第二种方法:2 .采用根搜索算法:从一个根出发.搜索所有的可达対鈑.这样剰的那些対象就是需要被冋收的13、说说你对Java反射的理解JAVA反射机制是在运行状态中,対于任意个类,都能够知道这个类的所有属性和方法: 対任意个対象,都能够调用它的任意个方法和属性.从対象出发.通过反射(Class类)可以取得取得类的完整信息(类名Class类型.所在包、具有的所有方法 Method口类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所 有属性Field口、某个属性的完整信息、构造器Constructors),调用类的属性或方法白 己的总结:在运行过程中获得类、対毂、方法的所有信息.14、String为什么要设计成不可变的?1、字符串池的需求字符串池是方法区(Method Area)中的块特殊的存储区域.当一个字符串已经被创建并 且该字符串在池中,该字符串的引用会立即返回给变量,而不是重新创建一个字符串再将 引用返回给变量.如果字符串不是不可变的.那么改变个引用(如:string2)的字符串 将会导致另个引用(如:stringl)出现脏数据。2、允许字符串量存哈希码在java中常常会用到字符串的哈希码.例如:HashMap . String的不变性保证哈希码始 终.因此.他可以不用担心变化的出现.这种方法意味着不必毎次使用时都重新计算 次哈希码这样.效率会高很.3、安全String广泛的用于java类中的参数.如:网络连接(Network connetion)»打开文件 (opening files )等等.如果String不是不可变的.网络连接、文件将会被改变这将会导致系列的安全威胁.操作的方法本以为连接上了一台机器,但实际上却不是由 于反射中的参数都是字符串,同样也会引起一系列的安全问题15、List, Set, Map 的区别Set«是最简单的种集合.集合中的对象不按特定的方式排序.并且没有重复对蒙.Set 接口主要实现了两个实现类:HashSet: HashSet类按照哈希克法来存取集合中的对象. 存取速度比较快TreeSet t TreeSet类实现了 SortedSet接口,能够对集合中的对象进行排序.List的特征是其元素以线性方式存储,集合中可以存放重豆对象.ArrayListO :代表长度可以改变得数组.可以对元素进行随机的访问.向ArrayListO 中插入与删除元素的速度慢.LinkedListO:在实现中釆用链表数据结构.插入和删)除速度快.访问速度慢.Map.是一种把键对象和值对象映射的集合.它的毎一个元素都包含对键対象和值对象.Map没有继承于Collection接口从Yap集合中检索元素时.只要给出键対象,就会返回 对应的值対象.HashMap: Map基做列表的实现.插入和査询“键值対”的开情是固定的.可以通过构造 器设置容量capacity和负我因子load factor,以调整容器的性能.LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值対”的顺序是其插入次 序,或者是最近最少使用(LR的次序.只比HashMap慢一点.而在迭代访问时发而更快, 因为它使用腔表维护内部次序.TreeMap«基于红黑树数据结构的实现.査看“键”或“键值対”时,它们会被排序(次序 由Comparabel或Comparator决定).TreeVap的特点在 于,你得到的结果是经过挿序的. TreeMap是唯一的带有subMapO方法的Map,它可以返回一个子树.VeakHashMao:弱键(*eak key)Map. Map中使用的対象也被允许糅放:这是为解决特殊问 题设计的.如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收.16、ArrayList和LinkedLi8t的区别,以及应用场景ArrayList:是基广数组实现的,ArrayList线程不安全.LinkedListt是基双链表实现的:使用场景<1)如果应用程序对各个索引位置的元素进行大fit的存取或删除操作,ArrayList对象要 远优LinkedList对象:(2 )如果应用程序主要是对列表进行循环,并且循环时候进行插入或者刪除操作, LinkedList対源要远优于ArrayList対象:17、数组和链表的区别数组:是将兀素在内存中连续存储的:它的优点:因为数据是连续存储的,内存:地址连续, 所以在査找数据的时候效率比较高:它的缺点:在存储之前,我们需要申请块连续的内 存空间,并且在编译的时候就必须确定好它的空间的大小在运行的时候空间的大小是无 法随着你的需要迸行增加和减少而改变的.当数据两比较大的时候.有可旋会出现越界的 情况,数据比较小的时候.又有可能会浪费掉内存空间.在改变数据个数时.増加、插入、 删除数据效率比较低.雒表:是动态申请内存空间.不需要像数组需要提前申请好内存的大小.链表只需在用的 时候中清就可以.根据需要来动态申请或者删除内存空间.对于数据增加和删除以及插入 比数组织活.还有就是链表中数据在内存中可以在任意的位置.通过应用来关联数据(就 是通过存在元素的指针来联系)18、run 0和start 0方法区别这个问题经常被问到.但还是能从此区分出面试者対Java线程模型的理解程度.start0 方法被用来启动新创建的线程.而且start。内部调用了 run。方法.这和直接调用run。 方法的效果不样.当你调用run。方法的时候.只会是在原来的线程中调用,没有新的 线程启动.start。方法会自动新线程.19、如何控制某个方法允许并发访问线程的个数?semaphore.acquire0请求一个信号駅.这时候的信号量个数一1 (一旦没有可使用的信号 fi.也即信号量个数变为负数时.再次请求的时候就会阻塞.直到其他线程邸放了信号St)semaphore, re 1 ease0和放个信号量.此时信号量个数+120、在J&va中wait和seelp方法的不同Java程序中wait和sleep都会造成某种形式的暂停.它们可以满足不同的需要.waitO 方法用于线程间通信.如果等待条件为真且其它线程被唤醒时它会和放锁,而sleep。方 法仅仅詳放CPU资源或者让当前线程停止执行段时间.但不会新放锁.21、谈wait/notify关催字的理解等待对象的同步锁,需要莪得该对鈑的同步锁可以调用这个方法.否则编译可以通过.但 运行时会收到个异常:11 legalMonitorStateException.调用任意対农的»aitO方法导致该线程阻塞.该线程不可继续执行.并且该对鉅上的领 被释放.唤醒在等恃该对象同步锁的线程(只唤醒个,如果有多个在等待),注意的是在调用此方法 的时候.并不能确切的唤醒某个等待状态的线程.而是由JVM确定喚醒哪个线程.而且 不是按优先级.调用任意对象的notify。方法则导致因调用该对象的wait。方法向阻塞的线程中随机选 择的个解除阻塞(但要等到获得犠后真正可执行).22、什么导致线程阻塞,货程如何关闭?阻塞式方法是指程序会一直等待谈方法完成期间不做其他事情,Serversocket的accept。 方法就是一直等待客户端连接.这里的阻塞是指调用结果返回之前当前线程会被挂起. 直到得到结果之后会返回.此外.还有异步和非阻塞式方法在任务完成前就返回.一种是调用它里面的stop。方法另种就是你白己设置个停止线程的标记(推荐这种)23、如何保证銭程安全?1.synchronized:2. Object 方法中的 ait, notify:3. ThreadLocal机制来娱现的.24、如何实现线程同步?1、synchronized关键字修改的方法.2、synchronized关键字修饰的语句块3、使用特殊域变量(volatile)实现线程同步25、淡淡对Synchronized关健字,类锁,方法候,重入做的理解java的对厳俊和美供:java的対象锁和类锁在锁的概念上基本上和内置锁是一致的,但是, 两个锁实际是有很大的区别的.対象锁是用于对象实例方法.或者个对鉄实例上的,类 镣是用于类的静态方法或者个类的class対象上的.我们知道,类的対领实例可以有很 多个,但是每个类只有一个class対望.所以不同対鉄实例的対象锁是互不干扰的,但是 每个类只有一个类锁.但是有一点必须注意的是,其实类锁只是个概念上的东西,并不 是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的26、synchronized 和 volatile 关字的区别1. volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从 主存中读取:synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程 被阻塞住.2. volatile仅能使用在变量级别:synchronized则可以使用在变量、方法、和类级别的3. volatile仅能实现变量的修改可见性,不能保证原子性:而synchronized则可以保证 变量的修改可见性和原子性4. volatile不会造成线程的阻塞:synchronized可能会造成线程的阻塞.5. volatile标记的变量不会被编译器优化:synchronized标记的变量可以被编译器优化27、ReentrantLock synchronized 和 volatile 比较ava在过去很长一段时间只能通过synchronized关键字来实现互斥,它有一些然点.比如 你不能扩展镣之外的方法或者块边界,尝试获取锁时不能中途取消等.Java 5通过ock 接口提供了更复杂的控制来解决这些问题.ReentrantLock类实现了 Lock,它拥有与 synchronized相同的并发性和内存语义且它还具有可扩展性.28、死価的四个必要条件?死殖产生的原因1 .系统資源的竞争系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁.2 .进程运行推进顺序不合适互斥条件,个资源每次只能被个进程使用,即在一段时间内某资源仅为个进程所占 有.此时若有其他进程请求该资源.则请求进程只能等待.请求与保持条件,进程已经保持了至少个资源,但乂提出了新的资源请求,而该资源已 被其他进程占有此时请求进程被阻塞,但对自己已获得的资源保持不放.不可剝夺条件:进程所获得的资源在未使用完毕之前不能被其他进程强行夺走.即只能 由获得该资源的进程白己来释放(只能是主动料放).循环答格条件:若干进程间形成首尾相接循环等待资源的关系这四个条件是死锁的必要条件.只要系统发生死锁.这些条件必然成立,而只要上述条件 之一不满足.就不会发生死锁.死供的克与預防:死傲建免的基本思想:系统对进程发出每一个系统能弊满足的资源申请进行动态检査,并根据检査结果决定是否分 配资源,如果分配后系统可能发生死锁,则不,分配,否则F以分配.这是一种保证系统不进 入死锁状态的动态策略.理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最 大可能地避免、预防和解除死锁.所以,在系统设计、进程调度等方面注意如何让这四个 必要条件不成立,如何确定资源的合理分配算法.避免进程永久占据系统费源.此外.也 要防止进程在处于等待状态的情况占用资源.因此.対资源的分配要给予合理的规划.死像重免和死幀預防的区别:死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的岀现,而死锁避 免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一 定发生死锁.死锁避免是在系统运行过程中注意避免死锁的最终发生.29、什么是线程池,如何使用?创建线程要花费昂贵的资源和时间如果任务来了创建线程那么响应时间会变长,而且 个进程能创建的线程数有限.为了避免这些问题,在程)启动的时候就创建若干线程来 响应处理,它们被称为线程池,里面的线程叫工作线程.从JDK1.5开始,Java API提供 了 Executor框架止你可以创建不同的线程池.比如单线程池,每次处理一个任务:数目固 定的线程池或者是缓存线程池(个适合很多生存期短的任务的程序的可扩展线程池).30、Java中堆和栈有什么不同?为什么把这个问题归类在多线程和并发面试题里?因为栈是块和线程紧密相关的内存区 域.每个线程都有门己的桟内存,用于存储本地变量.方法参数和栈调用,个线程中存 储的变量对其它线程是不可见的.而堆是所有线程共享的一片公用内存区域.对象都在堆 里创建.为了提升效率线程会从堆中弄个緩存到己的栈,如果多个线程使用该变量就 可能引发问题,这时volatile变量就可以发挥作用了它要求线程从主存中读取变量:的 值.31、有三个线程Tl, T2, T3.怎么确保它们按序执行?在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join。方法在个线程 中自动另个线程,另外一个线程完成该线程继续执行.为了确保三个线程的顺序你应该 先月动最后一个(T3调用T2. T2调用T1).这样TI就会先完成向T3月后完成.线程间通信我们知道线程是CP调度的最小単位.在Android中主线程是不能够做耗时操作的.子线 程是不能够更新UI的曲线程间通信的方式有很多,比如广播.Eventbus.接口回掉.在 Android中主要是使用handler, handler通过调用sendmessage方法,将保存消息的 Message发送到Messagequeue中,而looper对象不断的调用loop方法,从aiessageueue 中取出message,交给handler处理,从而完成线程间通信.32、说下你对Collection这个类的理解.Collection是集合框架的顶层接口,是存储对领的容器,Colloction定义了接口的公用方 法如add remove clear等等,它的子接口有两个,List和Set, List的特点有尤素有序 元素可以重更元素都有索引(角标),典型的有Vector:内部是数组数据结构.是同步的(线程安全的).增删査询都很慢.ArrayList:内部是数组数据结构.是不同步的(线程不安全的).替代了 Vector.査询速 度快增删比较慢.LinkedList:内部是依表数据结构,是不同步的(线程不安全的).增删元素速度快.血Set的是特点元素无序,元素不可以重复HashSet:内部数据结构是哈希表.是不同步的.Set集合中元素都必须是唯一的.HashSet作为其子类也需保证元素的唯一性.判断元素唯一性的方式:通过存储对象(元素)的hashCode和equals方法来完成対象唯一性的.如果対象的hashCode值不同,那么不用调用equals方法就会将対象直接存储到集合中: 如果対象的hashCode值相同,那么需调用equals方法判断返回值是否为true, 若为false.则视为不同元素,就会直接存储:若为true.则视为相同元素,不会存储.如果要使用HashSet集合存储元素.该元素的类必须覆説hashCode方法和equals方法.一般情况下,如果定义的类会产生很多对象.通常都需要覆蛊equals. hashCode方法建 立对象判断是否相同的依据.TreeSet:保证元素唯一性的同时可以对内部元素进行排序是不同步的.判断元素唯一性的方式:根据比较方法的返冋结果是否为.如果为视为相同元素.不存:如果非初为不同元 素.则存.TreeSet对元素的排序有两种方式:方式:使元素(对象)对应的类实现Comparable接口,用盅compareTo方法.这样元素 力身具有比较功能.方式二:使TreeSet集合白身具有比较功能,定义个比较器Comparator.将该类对象作 为参数传递给TreeSet集合的构造函数2、Android 部分1、Activity各种情况下的生命周期Situationl:正常自动:onCreateO - onStart () - onResuae0;返冋健退出:onPauseO 一 onStopO - onDestory():Situation2:正常自动:onCreateO onStart 0 onResume();按 home 健:onPauseO onStopO ;正常冃动:onRestart () onStart ()- onResume 0 :Situations:正常自动:onCreateOonStart 0- onResume ():横登屏切换:onPause () 一 onStopO - onDestoryO onCreateO - onStart0 - onResume0:Situation4:前提条件:Activity 的 AndroidManifest. xml 中设置android:configChanges=*orientation IkeyboardHiddenlscreenSizew正常启动:onCreateO 一 onStart 0- onResume0 :横竖屏切换:onConf igurationChanged 0 :结论I设置 Activity 的 android:configChanges=*orientation |keyboardHidden|screensize* 时切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法:自从 Android3.2 (API13) 在设置 Activity 的 android:configChanges=*orientation IkeyboardHidden"后,还是样会重新调用各个生命周期的.因为screensize也开始跟 着设备的横竖切换向改变.所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于!3的情况,如果你想阻止程序在运行时重新加我 Activity,除了 设置"orientation",你还必须设置"ScreenSize".2、橫竖屏切换的时候,Activity各种情况下的生命周期分两种情况:1 .不设置 Activity 的 android:configChanges,或设置 Activity 的android:configChanges=*orientation". 或设置 Activity 的android:configChanges="orientation|keyboardHidden",切屏会重新调用各个生命周期, 切横屏时会执行次.切竖屏时会执行次横整屏切换造成activity的生命周期 onPause() -onSaveInst anc eState()-onStop()-onDestroy()-onCreat()-onStart()- onRestoreInstanceState()-onResume()即会导致 activity 的销毁和重建.2 .配置 andrid:configChanges=*orientat ion|keyboardHidden| screenSize*,不会销 毁 activity,且只调用 onConfiguralionChanged 方法.onSavelnstanceStateO与onRestorelntanceStateO资源相关的系统配置发生改变或者 资源不足时(例如屏幕旋转),当前Activity会销毁,并且在onStop之前回调 onSavelnstanceState保存数据.在重新创建Activity的时候在onSlarl之后回调 onRestorelnstanceState其中 Bundle 数据会传到 onCreate (不一定有数据)和 onRestorelnstanceState (一定有数据)用户或者程序员主动去箱毁个Activity的时候不会回调(如代码中finish 或用户 按back,不会回调),其他情况都会调用,来保存界面信息.3、Activity与Fragnent之间生命周期比较Activity StateFragment CallbacksCreatedonAttach。onCreate()onCreateView()StartedResumed一onResumeOonPauseOStoppedonD®stroyView()PausedDestroyed8DewoyOonDetachO,h4”,杀 阕提小4NNk “兩J” 君4、两个Activity之间跳转时必然会执行的是算几个方法?一般情况下比如说有两个activity,分别叫A, B.当在A里面激活B组件的时候,A会调 用 onPauseO方法,然后 B 调用 onCreateO , onStart(), onResumeO.这个时候 B 厦読了 A的窗体,A会调用。nStopO方法.如果B是个透明的窗口,或者是对话框的样式,就不会 调用A的onStop。方法.如果B已经存在于Activity栈中,B就不会调用onCreateO方 法.5、内存泄漏的场景和解决办法1 .非静态内部类的静态实例非静态内部类会持有外部类的引用,如果非静态内部类的实例是静态的,就会长期的维持 着外部类的引用,组织被系统回收,解决办法是使用静态内部类2 .多线程相关的匿名内部类和非静态内部类匿名内部类同样会持有外部类的引用,如果在线程中执行耗时操作就有可能发生内存泄漏. 导致外部类无法被冋收直到耗时任务结束.解决办法是在页面退出时结束线程中的任务 3. Handler内存泄漏Handler导致的内存泄漏也可以被归纳为非静态内部类导致的.Handler内部message是被 存储在MessageQueue中的.有些message不能马上被处理,存在的时间会很长,导致 handler无法被回收如果handler是非靜态的.就会导致它的外部类无法被回收,解决 办法是1.使用靜态handler.外部类引用使用弱引用处理2.在退出页面时移除消息队列中 的消息4 . Context导致内存漱漏根据场景确定使用Activity的Context还是Application的Context,因为二者生命周期 不同.对于不必须使用Activity的Context的场景(Dialog).一律采用Application的 Context,単例模式是最常见的发生此泄漏的场景,比如传入个Activity的Context被静 态类引用.导致无法冋收5 .静态View导致泄漏使用静态View可以避免毎次自动Activity都去读取并渲染View,但是静态View会持有 Activity的引用,导致无法回收,解决办法是在Activi销毁的时候将静态View设置为 null (View一旦被加我到界面中将会挣有一个Context对象的引用,在这个例子中,这个 context対鼓是我们的Activity.声明一个靜态变量引用这个View,也就引用了 activity)6 . WebView导致的内存泄漏WebView只要使用一次.内存就不会被鄆放.所以HebVie,都存在内存泄漏的问题,通常 的解决办法是为WebView単开个进程.使用AIDL进行通信.根据业务需求在合适的时机 料放掉7 .资源对象未关闭导致如Cursor. File等.内部往往都使用了缓冲.会造成内存泄漏.一定要确保关闭它并将引 用置为null8 .集合中的对象未清理集合用于保存对象.如果集合越来越大.不进行合理的淸理.尤其是入股集合是静态的9 . Bitmap导致内存泄漏bitmap是比较占内存的.所以一定要在不使用的时候及时进行淸理.避免静态变量持有大 的bitmap对象10 .监听器未关闭很多需要register和unregister的系统服务要在合适的时候进行unregister手动添加 的listener也需要及时移除6、如何避免00M?1 .使用更加轻量的数据结构:如使用ArrayMap/SparseArray替代HashMap, HashMap更耗内 存,因为它需要额外的实例忖象来记录Mapping操作.SparseArray更加高效,因为它避 免了 Key Value的自动装箱.和装箱后的解箱操作2 .使面枚举的使用.可以用静态常量或者注解QIntDef替代3 . Bitmap 优化:a.尺寸压缩:通过InSampleSize设置合适的缩放b.顔色康域:设置合适的 format, ARGB_6666/RBC_545/ARGB_4444/ALPHA_6.存在很大差 异c. inBitmap:使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域. 新解码的Bitmap会尝试去使用之前那张Bitmap在Heap中所占据的pixel data内存区域. 而不是去问内存重新申请块区域来存放Bitmap.利用这种特性.即使是上千张的图片. 也只会仅仅只需要占用屏幕所能卷显示的图片数量的内存大小.但复用存在些限制.具 体体现在:在Android 4. 4之前只能重用相同大小的Bitmap的内存,而Android 4. 4及以 后版本则只要后来的Bitmap比之前的小即可使用inBitmap参数前.每创建一个Bitmap 对象都会分配块内存供其使用,而使用了 inBitmap参数后.多个Bitmap可以复用块 内存,这样可以提高性能4.StringBuilder替代String:在有些时候,代码中会需要使用到大量的字符串拼接的操 作,这种时候有必要考虑使用StringBuilder來替代频鑑的“+ ”5 .避免在类似。nDraw这样的方法中创建对象,因为它会迅速占用大ft內存,引起频繁的 GC甚至内存抖动6 .减少内存泄漏也是一种避免00M的方法7、ANR的原因1 .耗时的网络访问2 .大量的数据读写3 .数据库操作4 .硬件掾作(比如camera)5 .调用thread的join。方法、sleep。方法、wait。方法或者等恃线程锁的时候6 . service binder的数量达到上限7 . system server 中发生 atchDog ANR8 . service忙导致超时无响应9 .其他线程持仃锁,导致主线程等待超时10 .其它线程终止或崩溃林致主线程一直等待8、说下Activity的启动模式,生命周期,两个Activity跳转的生命周期,如 果个Activity跳转另个Activity再按下Hoae健在回到Activity的生命 周期是什么样的启动模式Siandard模式:Aciivity可以有多个实例,每次自动Aclivily,无论任务栈中是否已经有 这个Aclivily的实例,系统都会创建一个新的Activity实例SingleTop模式:当个singleTop模式的Activity已经位于任务校的校顶,再去启动它 时,不会再创建新的实例,如果不位于栈顶,就会创建新的实例 SingleTask模式:如果Activity已经位于校顶,系统不会创建新的Activity实例,和 singleTop模式样.但Activity已经存在但不位于楼顶时.系统就会把该Activity移 到栈顶,并把它上面的activity出栈 Singlelnstance 模式:singlelnstance 模式也是单例的,但和 singleTask 不同, singleTask只是任务栈内单例,系统里是可以有多个singleTask Activity实例的,而 singlelnstance Activity 在整个系统里只有一个实例,启动 singlelnstanceActivity 时,系统会创建一个新的任务桟.并且这个任务板只有他个Activity 生命周期 onCreate onStart onResume onPause onStop onDestroy 两个Activity跳转的生命周期1 .启动 A: onCreate - onStart - onResume2 .在 A 中启动 B: ActivityA onPause -> ActivityB onCreate -> ActivityB onStart - >ActivityB onResume -> ActivityA onStop3 .从B中返回A (按物理硬件返回笹)ActivityB onPause -> ActivityA onRestart -> ActivityA onStart -> ActivityA onResume -)ActivityB onStop -ActivityB onDestroy 4,继续返回ActivityA onPause ->

    注意事项

    本文(Android中高级面试题目整理.docx)为本站会员(文***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开