美文网首页
Android面试题整理(答案未完善)

Android面试题整理(答案未完善)

作者: Android刘东 | 来源:发表于2020-03-06 16:28 被阅读0次

    这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

    主要分为以下几部分:

    (1)java面试题

    (2)Android面试题

    (3)高级开发技术面试题

    (4)跨平台Hybrid 开发

    一、java面试题

    熟练掌握java是很关键的,大公司不仅仅要求你会使用几个api,更多的是要你熟悉源码实现原理,甚至要你知道有哪些不足,怎么改进,还有一些java有关的一些算法,设计模式等等。

    (一) java基础面试知识点

    1.java中==和equals和hashCode的区别

     ==比较的是值本身,equals比较两个对象的引用地址,hashCode鉴定两个对象是否相等.equals相等的两个对象,hashCode一定相等,equals不相等的两个对象,却并不能证明他们的hashCode不相等。equals方法不相等的两个对象,hashCode有可能相等,

    2.int、char、long各占多少字节数

    byte1个字节,boolean至少一个字节,short char2个字节,int float4个字节,long double8个字节 

    3.int与integer的区别

    int是java基本数据类型,Integer 继承了Object类,是对象类型,是 int 的包装类。int不能赋值为空,Integer可以赋值为空

    4.对java多态的理解

    1、面向对象的三大基本特征:封装、继承、多态

    2、多态是指:父类引用指向子类对象,在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

    3、实现多态的三要素:继承 重写 父类引用指向子类对象

    5.String、StringBuffer、StringBuilder区别 ,String为什么要设计成不可变的?

    String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。

    String设计成不可变的意义1. 字符串常量池的需要 2. 允许String对象缓存HashCode 3. 安全性

    StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上synchronized。但是保证了线程安全是需要性能的代价的。

    StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。

    6.什么是内部类?内部类的作用

    “局部内部类就是定义在代码块内的一个内部类。比如在方法里面定义一个内部类,就是局部内部类。 局部内部类的作用范围仅仅就在它所在的代码块里。局部内部类不能被public ,protected,private以及static修饰,但是可以被final修饰。”

    7.抽象类和接口区别

    1.抽象类要被子类继承,接口要被类实现。

    2.接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现

    3.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

    4.接口是设计的结果,抽象类是重构的结果。

    5.抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。

    6.抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。

    7.抽象类主要用来抽象类别,接口主要用来抽象功能。

    8.抽象类的意义

    1,为子类提供一个公共的类型;

    2,封装子类中重复内容(成员变量和方法);

    3,定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。

    9.抽象类是否可以没有方法和属性?

    可以

    10.接口的意义

    1.重要性2.维护、扩展性3.简单、规范性4、安全、严密性

    11.泛型中extends和super的区别

    1.<? extends T>代表的是上界通配符,T的对象或者T的子类

    2.<? super T>代表的是下界通配符,T的对象或者T的父类

    12.父类的静态方法能否被子类重写 

    不能

    13.进程和线程的区别 

    进程中最少有一个或者多个线程

    进程一个运行程序就是一个或多个进程

    线程new Thread(){}.start()

    14.final,finally,finalize的区别

    final 修饰类 ,方法 ,变量

    finally 用于一定要执行 比如try{}catch{}后资源释放,关流等等

    finalize用于回收资源,finalize方法将在垃圾回收器清除对象之前调用

    15.序列化的方式

    Serializable 和Parcelable 的区别

    方式一:Serializable,要传递的类实现Serializable接口传递对象,

    方式二:Parcelable,要传递的类实现Parcelable接口传递对象。

    Serializable(Java自带):Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。

    Parcelable(android 专用):除了Serializable之外,使用Parcelable也可以实现相同的效果,不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。

    实现Parcelable的作用

    1)永久性保存对象,保存对象的字节序列到本地文件中;

    2)通过序列化对象在网络中传递对象;

    3)通过序列化在进程间传递对象。

    选择序列化方法的原则:

    1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。

    2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

    3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable

    参考:https://www.jianshu.com/p/a60b609ec7e7

    16.静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?

    https://www.jianshu.com/p/2ddaff2d4591

    19.静态内部类的设计意图

    https://blog.csdn.net/github_37130188/article/details/94589793

    20.成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

    https://blog.csdn.net/github_37130188/article/details/94589808

    21.谈谈对kotlin的理解

    https://www.jianshu.com/p/0bae35037270

    22.闭包和局部内部类的区别

    闭包定义 class User 有个方法onNext(), 接口UserBack也有个方法onNext()

    class User { void onNext() { } }

    interface UserBack { void onNext(); }

    class AUser extends User {

    @Override public void onNext() { }

    class UserInner implements UserBack { @Override public void onNext() { } }

    //在子类中定义了遵循程序员接口规则的内部类,然后使用内部类实现程序员的onNext(),在子类中直接实现父类作家的onNext()方法。

    }

    局部内部类是指在一个方法中定义的内部类,不可访问外部变量,只在当前方法中有效

    void onNext(){

    class User{

    }

    }

    23.string 转换成 integer的方式及原理

    https://www.jianshu.com/p/9eebb4f2ccb1

    (二) java深入源码级的面试题(有难度)

    1.哪些情况下的对象会被垃圾回收机制处理掉?

    1、强引用代码中普遍存在的类似"Object obj = new Object()"这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

    2、软引用描述有些还有用但并非必需的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。Java中的类SoftReference表示软引用。

    3、弱引用描述非必需对象。被弱引用关联的对象只能生存到下一次垃圾回收之前,垃圾收集器工作之后,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。Java中的类WeakReference表示弱引用。

    4、虚引用这个引用存在的唯一目的就是在这个对象被收集器回收时收到一个系统通知,被虚引用关联的对象,和其生存时间完全没关系。Java中的类PhantomReference表示虚引用。

    2.讲一下常见编码方式?

    ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16

    3.静态代理和动态代理的区别,什么场景使用?

    不懂

    4.Java的异常体系

    https://www.cnblogs.com/kma-3/p/11326393.html

    5.谈谈你对解析与分派的认识。

    https://www.cnblogs.com/hapjin/p/9374269.html

    6.修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?

    参考https://www.jianshu.com/p/985534b21089

    会调用对象对象的equals方法。“==”如果是基本类型的话就是看他们的数据值是否相等就可以。

    如果是引用类型的话,比较的是栈内存局部变量表中指向堆内存中的指针的值是否相等“equals”如果对象的equals方法没有重写的话,equals方法和“==”是同一种。

    hashcod是返回对象实例内存地址的hash映射。理论上所有对象的hash映射都是不相同的。

    7.Java中实现多态的机制是什么?

    方法的重写和重载是Java多态性的不同表现,如果一个子类继承了一个父类,子类中拥有和父类相同方法名称,返回值,参数类型的话,就是重写,会执行子类中的方法。如果一个类中定义了多个同名方法,他们有不同的参数类型或者参数数量,那就叫重载

    8.如何将一个Java对象序列化到文件里?

    实现可序列 通过IO流写入文件

    9.说说你对Java反射的理解

    https://blog.csdn.net/sinat_38259539/article/details/71799078?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

    10.说说你对Java注解的理解

    11.说说你对依赖注入的理解

    12.说一下泛型原理,并举例说明

    13.Object类的equal和hashCode方法重写,为什么?

    14.(三) 数据结构

    15.常用数据结构简介

    Collection集合(存储对象)

    1.集合(collection)有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体集合被用于存储、获取、操纵和传输聚合的数据。 

    2.集合框架(Collections Framework)是用来表现和操纵集合的一个统一的体系结构。所有的集合框架都包含以下内容:

    (1)接口:是代表集合的抽象数据类型。

    (2)实现:是集合接口的具体实现。本质上,它们是可重用的数据结构,是一些类。

    (3)算法:是在实现了集合接口的对象上执行有用的计算的方法,如查找和排序。

     3.子接口:List和Set接口Map集合 (存储键值对)

    1.Map是一种包含键值对的元素的集合。

    2.Map不能包含重复的键,每个键最多可映射到一个值

    3.Map接口基本实现类:HashMap、TreeMap、 HashtableList接口

    List接口常用的实现类:ArrayList、LinkedList、Vector 

    2.ArrayList:集合中一种动态的数组,增删元素可改变该数组的长度,未实现同步,线程不安全,操作效率高,多用于查询;

    3.Vector:称为向量,也是特殊的动态数组,增删元素可改变该数组的长度,实现了同步,线程安全,操作效率低,多用于查询;

    4.LinkedList:基于双向链表的数据结构,移动指针遍历,顺序访问(增删)会非常高效,而随机访问(查询)效率比较低,未实现同步,线程不安全,操作效率低,多用于插入和删除

    Set接口

    1.Set接口常用的实现类:HashSet、TreeSet

    2.HashSet:实现了Set接口,没有重复元素,无序,底层使用Map接口的HashMap 的 key 集合作为容器存储数据对象,未实现同步,线程不安全,操作效率高,多用于查询;

    3.TreeSet:实现SortedSet接口,没有重复元素,有序,不支持快速随机遍历,只能通过迭代器进行遍历,底层使用TreeMap作为存储数据对象,TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。

    Map接口

    1.Map接口常用的实现类:HashMap、TreeMap、 Hashtable

    2.HashMap:是一个散列表,它存储的内容是键值对(key-value)映射,无序,键值不重复,value值可重复,键值可为null,未实现同步,线程不安全,操作效率高;

    3.Hashtable:是一个散列表,它存储的内容是键值对(key-value)映射,无序,键值不重复,value可重复,键值不可为null,实现同步,线程安全,操作效率低

    4.TreeMap:是一个有序的key-value集合,它是通过红黑树实现的,能被克隆,支持序列化,有序,不可重复,未实现同步,线程不安全,操作效率低 

    转载https://blog.csdn.net/alan_liuyue/article/details/80747225

    并发集合了解哪些?

    列举java的集合以及集合之间的继承关系

    集合类以及集合框架

    容器类介绍以及之间的区别(容器类估计很多人没听这个词,Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections),具体的可以看看这篇博文 Java容器类)

    List,Set,Map的区别

    List和Map的实现方式以及存储方式

    HashMap的实现原理

    HashMap数据结构?

    HashMap源码理解

    HashMap如何put数据(从HashMap源码角度讲解)?

    HashMap怎么手写实现?

    ConcurrentHashMap的实现原理

    ArrayMap和HashMap的对比

    HashTable实现原理

    TreeMap具体实现

    HashMap和HashTable的区别

    HashMap与HashSet的区别

    HashSet与HashMap怎么判断集合元素重复?

    集合Set实现Hash怎么防止碰撞

    ArrayList和LinkedList的区别,以及应用场景

    数组和链表的区别

    二叉树的深度优先遍历和广度优先遍历的具体实现

    堆的结构

    堆和树的区别

    堆和栈在内存中的区别是什么(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)?

    什么是深拷贝和浅拷贝

    手写链表逆序代码

    讲一下对树,B+树的理解

    讲一下对图的理解

    判断单链表成环与否?

    链表翻转(即:翻转一个单项链表)

    合并多个单有序链表(假设都是递增的)

    (四) 线程、多线程和线程池

    开启线程的三种方式?

    线程和进程的区别?

    为什么要有线程,而不是仅仅用进程?

    run()和start()方法区别

    如何控制某个方法允许并发访问线程的个数?

    在Java中wait和seelp方法的不同;

    谈谈wait/notify关键字的理解

    什么导致线程阻塞?

    线程如何关闭?

    讲一下java中的同步的方法

    数据一致性如何保证?

    如何保证线程安全?

    如何实现线程同步?

    两个进程同时要求写或者读,能不能实现?如何防止进程的同步?

    线程间操作List

    Java中对象的生命周期

    Synchronized用法

    synchronize的原理

    谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解

    static synchronized 方法的多线程访问和作用

    同一个类里面两个synchronized方法,两个线程同时访问的问题

    volatile的原理

    谈谈volatile关键字的用法

    谈谈volatile关键字的作用

    谈谈NIO的理解

    synchronized 和volatile 关键字的区别

    synchronized与Lock的区别

    ReentrantLock 、synchronized和volatile比较

    ReentrantLock的内部实现

    lock原理

    死锁的四个必要条件?

    怎么避免死锁?

    对象锁和类锁是否会互相影响?

    什么是线程池,如何使用?

    Java的并发、多线程、线程模型

    谈谈对多线程的理解

    多线程有什么要注意的问题?

    谈谈你对并发编程的理解并举例说明

    谈谈你对多线程同步机制的理解?

    如何保证多线程读写文件的安全?

    多线程断点续传原理

    断点续传的实现

    (五)并发编程有关知识点(这个是一般Android开发用的少的,所以建议多去看看):

    平时Android开发中对并发编程可以做得比较少,Thread这个类经常会用到,但是我们想提升自己的话,一定不能停留在表面,,我们也应该去了解一下java的关于线程相关的源码级别的东西。

    二、Android面试题

    Android面试题包括Android基础,还有一些源码级别的、原理这些等。所以想去大公司面试,一定要多看看源码和实现方式,常用框架可以试试自己能不能手写实现一下,锻炼一下自己。

    (一)Android基础知识点

    1.四大组件是什么

    Activity;Service;Broadcast;Content Provider;

    2.四大组件的生命周期和简单用法

     1.Activity:简单用法:

    用法:一个Activity通常就是一个单独的界面,在其上面承载着能与用户进行交互的控件,通过这些控件监听用户行为并对用户行为作出反馈。

    启动方式:Context.startActivity或Context.startActivityForResult。必须先在AndroidManifest中注册。

    生命周期: Activity的生命周期主要由以下六种状态构成,onCreate(创建),onStart(启动),onResume(开始),onPause(暂停),onStop(停止),onDestory(摧毁),onRestart(再启动)构成。

    并在以下六种状况下依顺序进入状态:

    启动Activity:onCreate->onStart->onResume;

    进入透明状态:onResume->onPause;

    从透明状态恢复:onPause->onResume;

    进入后台:onResume->onPause->onStop;

    从后台恢复到前台:onStop->onRestart->onStart->onResume;

    关闭Activity:onResume->onPause->onStop->onDestory;

    而且Activity非正常关闭时,如横竖转换等,会在onPause或onStop方法前面调用onSaveInstanceState方法,在重新启动时,会在对应的onStart或onResume前调用onRestoreInstanceState方法。

    2.Service:简单用法:

    用法:Service有别于Activity,它不存在界面,主要运行于后台。可以单独存在于另外一条非UI线程中,也可以运行于其他程序的上下文中,通常用于处理耗时型的任务,如下载和接受消息等。

    启动方式:Context.startService或Context.bindService。

    生命周期: Service的生命周期随着两种不同的启动方式而有所不同:

    startService:onCreate->onStartCommand->onDestory;

    bindService:onCreate->onBind->onUnBind->onDestory;

    3.BroadcastReciver简单用法:

    用法:可以通过BroadcastReciver对外部事件进行过滤,仅对需求的外部事件(如当电话呼入,网络状态修改时)进行接受并作出响应。

    启动方式:AndroidManifest中静态注册或动态注册后,通过Content.sendBroadcast唤醒。

    生命周期:BroadcastReceiver的生命周期很短,具体调用是:调用对象->onReceive->结束。即只有onRecive一个关键状态,而且onReceive必须在10秒内结束工作。

    4.ContentProvider简单用法

    用法:ContentProvider是一种内容共享组件,他通过向其他应用提供接口,让数据以表的形式共享给其他应用,使其他应用以类似访问数据库的方式访问程序数据。同时不管该程序是否启动,其他程序都能访问该接口。

    启动方式:我们不会启动程序的ContentProvider,而是注册ContentProvider的地址后,让其他程序通过ContentResolver的方法调用我们提供的地址获取数据。生命周期:Content没有Activity那样复杂的生命周期,只有简单的onCreate过程。

    转载https://www.jianshu.com/p/e359c66fa11f

    3.Activity之间的通信方式

    通过Intent传递数据;

    通过Application持有数据传递;

    通过静态变量传递数据;

    通过Eventbus传递数据;

    通过StartActivityForResult和onActivityResult传递数据;通过数据存储,数据持久化,传递数据。通过单例类传递数据;

    4.横竖屏切换的时候,Activity 各种情况下的生命周期

    横竖屏切换有三种情况:

    1.不设置Activity的android:configChanges时:

    横转为竖屏时:onResume->onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume;

    但竖屏转为横屏时,上面的生命周期走两次。

    2.设置Activity的android:configChanges="orientation"时:

    不管横转为竖屏还是竖屏转为横屏:onResume->onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume。

    3.设置Activity的android:configChanges="orientation|keyboardHidden"时:不管如何切换,程序都是保持onResume状态,不销毁Activity。但是会调用onConfigurationChanged方法。

    5.Activity与Fragment之间生命周期比较

    Fragment负载在Activity上面,基本上Fragment的生命周期与Activity的生命周期同步,但是两者方法数不同和顺序有所区别,下面具体说明。

    1.Activity生命周期有七个方法,Fragment有十一个方法;2.创建时两者调用的方法和顺序:Activity:onCreate->Fragment:onAttach->Fragment:onCreate->Fragment:onCreateView->Fragment:onActivityCreated;3.其他的一些对应的方法和顺序:Activity:onStart->Fragment:onStart;Activity:onResume->Frament:onResume;Fragment:onPause->Activity:onPause;Fragment:onStop->Activity:onStop;4.摧毁是两者调用的方法和顺序:Fragment:onDestoryView->Fragment:onDestory->Fragment:onDetach->onActivity:onDestory;

    6.Activity上有Dialog的时候按Home键时的生命周期

    这里分两种情况去分析:

    一种情况下是我们使用正常的Dialog,这种Dialog是Activity的组件,所以Activity处于运行在前台的状态,如果我们这是按下Home键,Activity将进入后台,此时回调用onPause->onStop方法。

    一种情况下是使用另一个theme为Dialog的Activity,当这个Dialog存在时,Activity进入透明状态即调用onPause,当点击Home键后,Activity调用onStop方法。

    7/.两个Activity 之间跳转时必然会执行的是哪几个方法?

    一般情况下比如说有两个activity,分别叫A,B。当在A 里面激活B 组件的时候, A会调用onPause()方法,然后B调用onCreate() ,onStart(), onResume()。这个时候B覆盖了A的窗体, A会调用onStop()方法。如果B是个透明的窗口,或者是对话框的样式, 就不会调用A的onStop()方法。如果B已经存在于Activity栈中,B就不会调用onCreate()方法。

    8.前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。

    前台切换到后台:onPause()->onStop()切回来时分两种情况:如果正常切换回来,那么会走onRestart()->onStart()->onResume()如果被系统内存紧急被回收了,那么回来会重新走一次生命周期弹出dialog如果dialog是自身Activity弹出来的,则不会走生命周期 

    Activity的四种启动模式对比

    Activity状态保存于恢复

    fragment各种情况下的生命周期

    Fragment状态保存startActivityForResult是哪个类的方法,在什么情况下使用?

    如何实现Fragment的滑动?

    fragment之间传递数据的方式?

    Activity 怎么和Service 绑定?

    怎么在Activity 中启动自己对应的Service?

    service和activity怎么进行数据交互?

    Service的开启方式

    请描述一下Service 的生命周期

    谈谈你对ContentProvider的理解

    说说ContentProvider、ContentResolver、ContentObserver 之间的关系

    请描述一下广播BroadcastReceiver的理解

    广播的分类

    广播使用的方式和场景

    在manifest 和代码中如何注册和使用BroadcastReceiver?

    本地广播和全局广播有什么差别?

    BroadcastReceiver,LocalBroadcastReceiver 区别

    AlertDialog,popupWindow,Activity区别

    Application 和 Activity 的 Context 对象的区别

    Android属性动画特性

    如何导入外部数据库?

    LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景。

    谈谈对接口与回调的理解

    回调的原理

    写一个回调demo

    介绍下SurfView

    RecycleView的使用

    序列化的作用,以及Android两种序列化的区别

    差值器

    估值器

    Android中数据存储方式

    (二)Android源码相关分析

    Android动画框架实现原理

    Android各个版本API的区别

    Requestlayout,onlayout,onDraw,DrawChild区别与联系

    invalidate和postInvalidate的区别及使用

    Activity-Window-View三者的差别

    https://github.com/yangchong211/YCBlogs/blob/master/android/Window/01.Activity%E3%80%81Window%E3%80%81View%E4%B8%89%E8%80%85%E5%85%B3%E7%B3%BB.md

    谈谈对Volley的理解

    如何优化自定义View

    低版本SDK如何实现高版本api?

    描述一次网络请求的流程

    HttpUrlConnection 和 okhttp关系

    Bitmap对象的理解

    looper架构

    ActivityThread,AMS,WMS的工作原理

    自定义View如何考虑机型适配

    自定义View的事件

    AstncTask+HttpClient 与 AsyncHttpClient有什么区别?

    LaunchMode应用场景

    AsyncTask 如何使用?

    SpareArray原理

    请介绍下ContentProvider 是如何实现数据共享的?

    AndroidService与Activity之间通信的几种方式

    IntentService原理及作用是什么?

    说说Activity、Intent、Service 是什么关系

    ApplicationContext和ActivityContext的区别

    SP是进程同步的吗?有什么方法做到同步?

    谈谈多线程在Android中的使用

    进程和 Application 的生命周期

    封装View的时候怎么知道view的大小

    RecycleView原理

    AndroidManifest的作用与理解

    (三)常见的一些原理性问题

    Handler机制和底层实现

    Handler、Thread和HandlerThread的差别

    handler发消息给子线程,looper怎么启动?

    关于Handler,在任何地方new Handler 都是什么线程下?

    ThreadLocal原理,实现及如何保证Local属性?

    请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系

    请描述一下View事件传递分发机制

    1.public boolean dispatchTouchEvent(MotionEvent ev)

    用于进行事件的分发,返回值受当前View的onTouchEvent()方法和下级的dispatchTouchEvent()影响

    2. public boolean onInterceptTouchEvent(MotionEvent ev)  

    用于判断是否拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列中,此方法不会被再次调用,返回结果表示是否拦截当前事件 

    3. public boolean onTouchEvent(MotionEvent ev) 

    用来处理点击事件,返回结果标识是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前view无法再次接受到事件 

    点击事件的传递规则:对于一个根ViewGroup,点击事件产生后,首先会传递给他,这时候就会调用他的dispatchTouchEvent方法,如果Viewgroup的onInterceptTouchEvent方法返回true表示他要拦截事件,接下来事件就会交给ViewGroup处理,调用ViewGroup的onTouchEvent方法;如果ViewGroup的onInteceptTouchEvent方法返回值为false,表示ViewGroup不拦截该事件,这时事件就传递给他的子View,接下来子View的dispatchTouchEvent方法,如此反复直到事件被最终处理。

    结论

    1.一个事件系列以down事件开始,中间包含数量不定的move事件,最终以up事件结束。

    2.正常情况下,一个事件序列只能由一个View拦截并消耗。

    3.某个View拦截了事件后,该事件序列只能由它去处理,并且它的onInterceptTouchEvent不会再被调用。

    4.某个View一旦开始处理事件,如果它不消耗ACTION_DOWN事件( onTouchEvnet返回false) ,那么同一事件序列中的其他事件都不会交给他处理,并且事件将重新交由他的父元素去处理,即父元素的onTouchEvent被调用。

    5.如果View不消耗ACTION_DOWN以外的其他事件,那么这个事件将会消失,此时父元素的onTouchEvent并不会被调用,并且当前View可以持续收到后续的事件,最终消失的点击事件会传递给Activity去处理。

    6.ViewGroup默认不拦截任何事件。

    7.View没有onInterceptTouchEvent方法,一旦事件传递给它,它的onTouchEvent方法会被调用。

    8.View的onTouchEvent默认消耗事件,除非他是不可点击的( clickable和longClickable同时为false) 。View的longClickable属性默认false,clickable默认属性分情况(如TextView为false,button为true)。 

    9.View的enable属性不影响onTouchEvent的默认返回值。

    10.onClick会发生的前提是当前View是可点击的,并且收到了down和up事件。

    11.事件传递过程总是由外向内的,即事件总是先传递给父元素,然后由父元素分发给子View,通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的分发过程,但是ACTION_DOWN事件除外。

    Touch事件传递流程

    事件分发中的onTouch 和onTouchEvent 有什么区别,又该如何使用?

    View和ViewGroup分别有哪些事件分发相关的回调方法

    View刷新机制

    View绘制流程

    自定义控件原理

    自定义View如何提供获取View属性的接口?

    Android代码中实现WAP方式联网

    AsyncTask机制

    AsyncTask原理及不足

    如何取消AsyncTask?

    为什么不能在子线程更新UI?

    ANR产生的原因是什么?

    ANR定位和修正

    oom是什么?

    什么情况导致oom?

    有什么解决方法可以避免OOM?

    Oom 是否可以try catch?为什么?

    内存泄漏是什么?

    什么情况导致内存泄漏?

    如何防止线程的内存泄漏?

    内存泄露场的解决方法

    内存泄漏和内存溢出区别?

    LruCache默认缓存大小

    ContentProvider的权限管理(解答:读写分离,权限控制-精确到表级,URL控制)

    如何通过广播拦截和abort一条短信?

    广播是否可以请求网络?

    广播引起anr的时间限制是多少?

    计算一个view的嵌套层级

    Activity栈

    Android线程有没有上限?

    线程池有没有上限?

    ListView重用的是什么?

    Android为什么引入Parcelable?

    有没有尝试简化Parcelable的使用?

    (四)开发中常见的一些问题

    ListView 中图片错位的问题是如何产生的?

    混合开发有了解吗?

    知道哪些混合开发的方式?说出它们的优缺点和各自使用场景?(解答:比如:RN,weex,H5,小程序,WPA等。做Android的了解一些前- 端js等还是很有好处的);

    屏幕适配的处理技巧都有哪些?

    服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达?

    动态布局的理解

    怎么去除重复代码?

    画出 Android 的大体架构图

    Recycleview和ListView的区别

    ListView图片加载错乱的原理和解决方案

    动态权限适配方案,权限组的概念

    Android系统为什么会设计ContentProvider?

    下拉状态栏是不是影响activity的生命周期

    如果在onStop的时候做了网络请求,onResume的时候怎么恢复?

    Bitmap 使用时候注意什么?

    Bitmap的recycler()

    Android中开启摄像头的主要步骤

    ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?

    点击事件被拦截,但是想传到下面的View,如何操作?

    微信主页面的实现方式

    微信上消息小红点的原理

    CAS介绍(这是阿里巴巴的面试题,我不是很了解,可以参考博客: CAS简介)

    附;AndroidAPP开发框架技术体系大纲;

    三、高级开发技术面试题

    这里讲的是大公司需要用到的一些高端Android技术,这里专门整理了一个文档,希望大家都可以看看。这些题目有点技术含量,需要好点时间去研究一下的。

    (一)图片

    图片库对比

    图片库的源码分析

    图片框架缓存实现

    LRUCache原理

    图片加载原理

    自己去实现图片库,怎么做?

    Glide源码解析

    Glide使用什么缓存?

    Glide内存缓存如何控制大小?

    (二)网络和安全机制

    网络框架对比和源码分析

    自己去设计网络请求框架,怎么做?

    okhttp源码

    网络请求缓存处理,okhttp如何处理网络缓存的

    从网络加载一个10M的图片,说下注意事项

    TCP的3次握手和四次挥手

    TCP与UDP的区别

    TCP与UDP的应用

    HTTP协议

    HTTP1.0与2.0的区别

    HTTP报文结构

    HTTP与HTTPS的区别以及如何实现安全性

    如何验证证书的合法性?

    https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?

    client如何确定自己发送的消息被server收到?

    谈谈你对WebSocket的理解

    WebSocket与socket的区别

    谈谈你对安卓签名的理解。

    请解释安卓为啥要加签名机制?

    视频加密传输

    App 是如何沙箱化,为什么要这么做?

    权限管理系统(底层的权限是如何进行 grant 的)?

    (三)数据库

    sqlite升级,增加字段的语句

    数据库框架对比和源码分析

    数据库的优化

    数据库数据迁移问题

    (四)算法

    排序算法有哪些?

    最快的排序算法是哪个?

    手写一个冒泡排序

    手写快速排序代码

    快速排序的过程、时间复杂度、空间复杂度

    手写堆排序

    堆排序过程、时间复杂度及空间复杂度

    写出你所知道的排序算法及时空复杂度,稳定性

    二叉树给出根节点和目标节点,找出从根节点到目标节点的路径

    给阿里2万多名员工按年龄排序应该选择哪个算法?

    GC算法(各种算法的优缺点以及应用场景)

    蚁群算法与蒙特卡洛算法

    子串包含问题(KMP 算法)写代码实现

    一个无序,不重复数组,输出N个元素,使得N个元素的和相加为M,给出时间复杂度、空间复杂度。手写算法

    万亿级别的两个URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)

    百度POI中如何试下查找最近的商家功能(提示:坐标镜像+R树)。

    两个不重复的数组集合中,求共同的元素。

    两个不重复的数组集合中,这两个集合都是海量数据,内存中放不下,怎么求共同的元素?

    一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法

    一张Bitmap所占内存以及内存占用的计算

    2000万个整数,找出第五十大的数字?

    烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?

    求1000以内的水仙花数以及40亿以内的水仙花数

    5枚硬币,2正3反如何划分为两堆然后通过翻转让两堆中正面向上的硬8币和反面向上的硬币个数相同

    时针走一圈,时针分针重合几次

    N*N的方格纸,里面有多少个正方形

    x个苹果,一天只能吃一个、两个、或者三个,问多少天可以吃完?

    (五)插件化、模块化、组件化、热修复、增量更新、Gradle

    对热修复和插件化的理解

    插件化原理分析

    模块化实现(好处,原因)

    热修复,插件化

    项目组件化的理解

    描述清点击 Android Studio 的 build 按钮后发生了什么

    (六)架构设计和设计模式

    谈谈你对Android设计模式的理解

    MVC MVP MVVM原理和区别

    你所知道的设计模式有哪些?

    项目中常用的设计模式

    手写生产者/消费者模式

    写出观察者模式的代码

    适配器模式,装饰者模式,外观模式的异同?

    用到的一些开源框架,介绍一个看过源码的,内部实现过程。

    谈谈对RxJava的理解

    RxJava的功能与原理实现

    RxJava的作用,与平时使用的异步操作来比的优缺点

    说说EventBus作用,实现方式,代替EventBus的方式

    从0设计一款App整体架构,如何去做?

    说一款你认为当前比较火的应用并设计(比如:直播APP,P2P金融,小视频等)

    谈谈对java状态机理解

    Fragment如果在Adapter中使用应该如何解耦?

    Binder机制及底层实现

    对于应用更新这块是如何做的?(解答:灰度,强制更新,分区域更新)?

    实现一个Json解析器(可以通过正则提高速度)

    统计启动时长,标准

    (七)性能优化

    如何对Android 应用进行性能分析以及优化?

    ddms 和 traceView

    性能优化如何分析systrace?

    用IDE如何分析内存泄漏?

    Java多线程引发的性能问题,怎么解决?

    启动页白屏及黑屏解决?

    启动太慢怎么解决?

    怎么保证应用启动不卡顿?

    App启动崩溃异常捕捉

    自定义View注意事项

    现在下载速度很慢,试从网络协议的角度分析原因,并优化(提示:网络的5层都可以涉及)。

    Https请求慢的解决办法(提示:DNS,携带数据,直接访问IP)

    如何保持应用的稳定性

    RecyclerView和ListView的性能对比

    ListView的优化

    RecycleView优化

    View渲染

    Bitmap如何处理大图,如一张30M的大图,如何预防OOM

    java中的四种引用的区别以及使用场景

    强引用置为null,会不会被回收?

    (八)NDK、jni、Binder、AIDL、进程通信有关

    请介绍一下NDK

    什么是NDK库?

    jni用过吗?

    如何在jni中注册native函数,有几种注册方式?

    Java如何调用c、c++语言?

    jni如何调用java层代码?

    进程间通信的方式?

    Binder机制

    简述IPC?

    什么是AIDL?

    AIDL解决了什么问题?

    AIDL如何使用?

    Android 上的 Inter-Process-Communication 跨进程通信时如何工作的?

    多进程场景遇见过么?

    Android进程分类?

    进程和 Application 的生命周期?

    进程调度

    谈谈对进程共享和线程安全的认识

    谈谈对多进程开发的理解以及多进程应用场景

    什么是协程?

    (九)framework层、ROM定制、Ubuntu、Linux之类的问题

    java虚拟机的特性

    谈谈对jvm的理解

    JVM内存区域,开线程影响哪块内存

    对Dalvik、ART虚拟机有什么了解?

    Art和Dalvik对比

    虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派)

    谈谈你对双亲委派模型理解

    JVM内存模型,内存区域

    类加载机制

    谈谈对ClassLoader(类加载器)的理解

    谈谈对动态加载(OSGI)的理解

    内存对象的循环引用及避免

    内存回收机制、GC回收策略、GC原理时机以及GC对象

    垃圾回收机制与调用System.gc()区别

    Ubuntu编译安卓系统

    系统启动流程是什么?(提示:Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程)

    大体说清一个应用程序安装到手机上时发生了什么

    简述Activity启动全部过程

    App启动流程,从点击桌面开始

    逻辑地址与物理地址,为什么使用逻辑地址?

    Android为每个应用程序分配的内存大小是多少?

    Android中进程内存的分配,能不能自己分配定额内存?

    进程保活的方式

    如何保证一个后台服务不被杀死?(相同问题:如何保证service在后台不被kill?)比较省电的方式是什么?

    App中唤醒其他进程的实现方式

    四、跨平台Hybrid 开发

    flutter

    Html5项目实战

    HTML&CSS&JavaScript 实战

    WordPress搭建网站项目实战

    前端Vue架构

    前端样式开发

    Weex内置能力

    Weex原生应用

    Weex扩展框架

    WeexUI架构

    介绍你做过的哪些项目

    都使用过哪些框架、平台?

    都使用过哪些自定义控件?

    研究比较深入的领域有哪些?

    对业内信息的关注渠道有哪些?

    最近都读哪些书?

    有没有什么开源项目?

    自己最擅长的技术点,最感兴趣的技术领域和技术点

    项目中用了哪些开源库,如何避免因为引入开源库而导致的安全性和稳定性问题

    实习过程中做了什么,有什么产出?

    题目转自https://www.cnblogs.com/zgq123456/p/10623454.html?tt_from=weixin&utm_source=weixin&utm_medium=toutiao_ios&utm_campaign=client_share&wxshare_count=1

    引入大佬的一个面试连接地址

    https://github.com/yangchong211/YCBlogs/blob/master/android/00.%E9%9D%A2%E8%AF%95%E9%97%AE%E9%A2%98%E5%A4%A7%E6%B1%87%E6%80%BB.md

    相关文章

      网友评论

          本文标题:Android面试题整理(答案未完善)

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