android面试题2019 | 答案 | |
Java 基础 | String、StringBuffer、StringBuilder的区别 | 03 |
进程和线程的区别;多线程与线程池 | 16 | |
java中equals和==的区别 | 04 | |
集合类以及集合框架;HashMap与HashTable实现原理,线程安全性,hash冲突及处理算法;ConcurrentHashMap | ||
静态属性和静态方法是否可以被继承?是否可以被重写?原因 | 12 | |
抽象类与接口的区别;应用场景;抽象类是否可以没有方法和属性 | ||
Java中实现多态的机制是什么? | 11 | |
Android 基础 | activity的启动生命周期方法流程 activity在屏幕旋转时的生命周期 activity的四种启动模式和与其对应使用场景 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状 态? | 17 |
如何启用Service,如何停用Service? IntentService和Service有什么区别? | 10 | |
注册广播有几种方式及其优缺点?谈谈Android引入广播机制的用意 | ||
android的动画有哪几类,它们的特点和区别是什么? | 07 | |
android的数据存储的方式有哪些? | 01 | |
android进程间通信的方式有哪些? | 05 | |
Service和Thread的区别? 进程和线程的区别? IntentService和Service的区别?IntentService原理 | ||
如何做SQLite升级? | ||
JNI和NDK的区别? | ||
自定义控件 | View的绘制流程 自定义View如何考虑机型适配 | |
touch事件传递机制 View和ViewGroup分别有哪些事件分发相关的回调方法 | ||
性能优化 | 什么是内存泄漏?内存泄漏有哪些代码场景,如何解决 | |
什么是ANR,如何避免它? 如何分析一个anr的日志 | ||
系统源码& 三方SDK源码 | Handler机制 | |
Binder机制 | 02 | |
其他(技术广度) | 如何减少对第三方框架的耦合 | |
MVP,MVVM,MVC的区别是什么 mvc模式的原理 | ||
Java Memory Model的内存模型 | ||
热修复的原理 | 18 | |
你对设计模式的理解,简单说几种? | 06 | |
死锁的四个必要条件 | 14 | |
常见的设计模式;写出观察者模式的代码 | ||
TCP的3次握手和四次挥手;TCP与UDP的区别 | 21 | |
HTTP与HTTPS的区别以及如何实现安全性 | 19 | |
Http位于TCP/IP模型中的第几层?为什么说Http是可靠的数据传输协议? | 20 | |
Android进阶 | 当点击一个应用图标以后,都发生了什么,描述一下这个过程? | |
Lru算法的原理? | 08 | |
混合开发,RN,weex,H5,flutter如何选型 | 22 | |
Art和Dalvik对比 | ||
内存回收机制与GC算法(各种算法的优缺点以及应用场景);GC原理时机以及GC对象 | ||
Activity,Window,View三者的联系? | 15 | |
hashmap的基本原理,如何减少hash冲突 如何增大hash冲突 | ||
数据结构与算法 | 堆和栈在内存中的区别是什么(数据结构方面以及实际实现方面) | |
冒泡、选择、快排有没有相似之处?简单说一下他们的原理? | 09 | |
写出你所知道的排序算法及时空复杂度,稳定性 |
android面试题答案 | |
01 | Android的数据存储方式 |
SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据;使用ContentProvider存储数据;网络存储数据 | |
02 | Binder机制 |
为了实现Binder IPC机制,Android在Linux内核挂载了一个虚拟的设备/dev/binder;Client和Server进程运行在用户空间,使用Binder机制进行进程间通信时,双方看起来是“直接”通信的,实际上通过/dev/binder的驱动程序即Binder驱动进行了数据的中转,Binder机制的本质是共享内存,共享内存区的管理完全由Binder驱动来完成,对应用层的Client和Server来说是完全透明的。(驱动是控制来访问内存的一段小应用程序,但是驱动控制的是硬件内存的读写 ) | |
03 | String、StringBuffer、StringBuilder的区别 |
String:字符串常量,每次修改都相当于生成一个新的对象,所以不适合经常变更值的场景. StringBuffer:字符串变量,线程安全适用于多线程. StringBuilder:字符串变量,线程不安全适用于单线程,效率略快于StringBuffer. 速度上面String不断的复制和更改是创建不同的对象来进行操作,这里涉及到GC垃圾回收机制,会影响速度;而StringBuffer和StringBuilder则处理同一个对象不存在JVM的GC回收。 线程安全与否:如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,不能同步的问题。 | |
04 | java中equals和==的区别 |
基本数据类型==比较的是值,非基本数据类型==比较的是内存地址 equals比较的是内存地址(但在一些类库中已经重写了这个方法(一般都是用来比较对象的成员变量值是否相同),比如:String,Integer,Date 等类中,所以他们不再是比较类在堆中的地址了) | |
05 | 进程间通信有哪些方式? |
Intent,访问其他程序的Activity或者调用系统电话、短信 Content Provider,多个App共享数据 AIDL(Android Interface Define Language)服务,客户端定义接口暴露给服务端使用 BroadCast Socket | |
06 | 你对设计模式的理解,简单说几种? |
一共23种,随便说几种就行,然后一般会问一些互相之间的区别啊,使用它们的好处之类的。 Builder模式(方便维护,使用者可以不用清楚内部构成情况就能直接调用方法;比如系统弹窗) 观察者模式(被观察者与观察者,只要有订阅关系,当被观察者发生改变时,就能通知观察者们;比如Event ) 单例模式(一个进程/项目中只存在1个实例,为了节约内存资源) 工厂模式 | |
07 | Android动画有几类,它们的特点和区别是什么? |
帧动画:类似于一帧帧图片组成的电影,xml中多张图片组成,在UI线程中播放这个xml形成的动画。 补间动画:补间动画分为四种形式,分别是 alpha(淡入淡出),translate(位移),scale(缩放大小),rotate(旋转)。补间动画的实现,一般会采用xml 文件的形式;当然也可以用Java代码直接实现。 属性动画:这是3.0之后加入的动画,为了弥补前面两种动画的不足。属性动画可以实现很多数学函数的路径动画。属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。 | |
08 | Lru算法的原理? |
LRU(Least Recently Used)最近最少使用,LRU使用的是LinkedHashMap,如果链表中存在一个数则将其置顶,如果没有则直接在顶部加入这个数并将其底部的数移除。大致可以这样理解,具体可以再搜索一下LRU算法 | |
09 | 冒泡、选择、快排有没有相似之处?简单说一下他们的原理? |
冒泡:(原理看水桶里面的泡泡,从下到上冒泡,每次确定一个最大的泡到最上面) 选择: (选择第i个数依次与后面的数进行比较得到相对最小的数来替换第i个数) | |
10 | IntentService和Service有什么区别? |
Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程(比喻成没有界面的activity),也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。 IntentService是Service的子类,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。通过Handler looper message的方式实现了一个多线程的操作,同时耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。 | |
11 | Java中实现多态的机制是什么? |
方法的重写Overriding和重载Overloading是Java多态性的不同表现 重写Overriding是父类与子类之间多态性的一种表现 重载Overloading是一个类中多态性的一种表现 | |
12 | 静态属性和静态方法是否可以被继承?是否可以被重写?原因 |
可继承 不可重写 而是被隐藏 如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成。 | |
13 | List,Set,Map的区别 |
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类:HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。 List的特征是其元素以线性方式存储,集合中可以存放重复对象。 ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。 LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。 Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。 HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。 LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。 TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。 WeakHashMao :弱键(weak key)Map | |
14 | 死锁的四个必要条件? |
互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。 不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。 循环等待条件: 若干进程间形成首尾相接循环等待资源的关系 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。 | |
15 | Activity,View,Window三者关系 |
1:Activity构造的时候会初始化一个Window,准确的说是PhoneWindow。 2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。 3:“ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等 4:这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等 | |
16 | 进程和线程的区别 |
进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。 进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。 一个进程内可拥有多个线程,进程可开启进程,也可开启线程。 一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。 | |
17 | activity四种LaunchMode |
standard 可以有多个相同的实例,也允许多个相同Activity叠加 singleTop 可以有多个实例,但是不允许多个相同Activity叠加 singleTask 只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法 singleInstance 只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。 | |
18 | 热修复的原理 |
我们知道Java虚拟机 —— JVM 是加载类的class文件的,而Android虚拟机——Dalvik/ART VM 是加载类的dex文件, 而他们加载类的时候都需要ClassLoader,ClassLoader有一个子类BaseDexClassLoader,而BaseDexClassLoader下有一个 数组——DexPathList,是用来存放dex文件,当BaseDexClassLoader通过调用findClass方法时,实际上就是遍历数组, 找到相应的dex文件,找到,则直接将它return。而热修复的解决方法就是将新的dex添加到该集合中,并且是在旧的dex的前面, 所以就会优先被取出来并且return返回。 | |
19 | HTTP与HTTPS的区别以及如何实现安全性 |
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。 2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。 https实现原理: (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。 (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。 (3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。 (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。 (5)Web服务器利用自己的私钥解密出会话密钥。 (6)Web服务器利用会话密钥加密与客户端之间的通信。 | |
20 | Http位于TCP/IP模型中的第几层?为什么说Http是可靠的数据传输协议? |
tcp/ip的五层模型: 从下到上:物理层->数据链路层->网络层->传输层->应用层 其中tcp/ip位于模型中的网络层,处于同一层的还有ICMP(网络控制信息协议)。http位于模型中的应用层 由于tcp/ip是面向连接的可靠协议,而http是在传输层基于tcp/ip协议的,所以说http是可靠的数据传输协议。 | |
21 | TCP和UDP的区别 |
tcp是面向连接的,由于tcp连接需要三次握手,所以能够最低限度的降低风险,保证连接的可靠性。 udp 不是面向连接的,udp建立连接前不需要与对象建立连接,无论是发送还是接收,都没有发送确认信号。所以说udp是不可靠的。 由于udp不需要进行确认连接,使得UDP的开销更小,传输速率更高,所以实时行更好。 | |
22 | 混合开发,RN,weex,H5,flutter如何选型 |
Hybrid (H5): 通过浏览器内核引擎渲染执行.(代表框架:Cordova (PhoneGap),微信小程序)原生渲染: 由JavaScript开发但是由原生控件渲染(代表框架:React Native,Weex,快应用) 自绘UI: 通过在不同平台实现统一的渲染引擎来绘制UI,而不依赖系统平台的原生控件(代表框架:Flutter) |