从公众号拿来的大厂面试题,忘记哪个公号了,前段时间面试做了一部分,时间不够很多都只简单过了一遍。题目很全,建议都过一遍!
一、java
熟练掌握java是很关键的,大公司不仅仅要求你会使用几个api,更多的是要你熟悉源码实现原理,甚至要你知道有哪些不足,怎么改进,还有一些java有关的一些算法,设计模式等等。
(一)java基础面试知识点
java中==和equals和hashCode的区别
“==”,如果是基本数据类型(int、boolean、byte、double等),则比较的是值;如果是引用类型(类、数组),则比较的是在内存中存放的地址。
int、char、long各占多少字节数
char(2字节)、int(4字节)、long(8字节)
int与integer的区别
int是基本数据类型,integer是包装类;int默认值是0,integer的默认值是null
探探对java多态的理解
面向对象三大特征:封装、继承、多态
多态:父类引用指向子类对象,在执行期间判断所引用对象的实际类型,然后根据实际类型执行对应方法
多态的三要素:继承、重写、父类引用指向子类对象
String、StringBuffer、StringBuilder区别
String是字符串常量,字符串的拼接是创建一个新对象,并将原有的值复制过来,原有的值就会变成垃圾被GC回收掉,所以很浪费性能
StringBuffer和StringBuilder是字符串变量,所以是在当前对象上操作,StringBuilder的效率最高
StringBuilder线程不安全,StringBuffer线程安全,所以单线程下推荐用StringBuilder,多线程下用StringBuffer
什么是内部类?内部类的作用
概念:内部类是写在类内部,或者方法内的类。包含成员内部类(常用)、局部内部类(方法内)、匿名内部类(没有名字)、静态内部类(static修饰)
作用:使用内部类可以使业务逻辑组织在一起,方便一些有业务联系的场景
抽象类和接口区别
抽象类:抽象类不能被实例化,也就是说不能被new出来;关键词abstract,有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法,抽象类一般多作为父类,子类继承然后实现父类的抽象方法
接口:接口中的变量会隐式的被指定为public static final
例子:所有的门都有open和close功能,但是不是所有的门都有报警功能,所以应该设计一个有open和close的抽象类,一个有报警功能的接口
抽象类的意义
为子类提供一个公共的类型,封装子类的重复内容,父类做统一的封装,子类根据自身情况去实现不同的业务
抽象类与接口的应用场景
抽象类更多的应用于抽象出子类的重复内容,接口主要应用于扩展
抽象类是否可以没有方法和属性?
可以
接口的意义
接口可以多继承,通过丰富多彩的接口定义,可以实现很多扩展性的业务
泛型中extends和super的区别
<? extends T>包括T在内的任何T的子类,向下
<? super T>包括T在内的任何T的父类,向上
父类的静态方法能否被子类重写
不能,子类中就算有和父类同名的静态方法,也不能重写父类中的方法;但是可以继承父类中的静态方法
进程和线程的区别
线程最最小单元,一个进程包含很多个线程,最小的进程只有一个线程
final,finally,finalize的区别
final修饰类、方法,表示子类不能继承、重写;修饰变量,则该变量只能被赋值一次
finally在try-catch中,一般会被执行;若有return,则会在return之前执行;如果被销毁,则不会执行
finalize,在对象被GC回收的时候,被调用对象的finalize方法,只会调用一次,一般来说不需要我们去实现
序列化的方式,Serializable 和Parcelable 的区别
Serializable:java的序列化方法,需要一个uuid用于序列化和反序列化;会有大量的IO操作,效率低,但是数据持久,适合序列化到本地的数据
Parcelable:android提供的序列化方法,不需要大量IO操作,开销小,效率高,适合内存序列化
静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
可以被继承,不可以被重写;静态属性和方法在编译期就已经和类绑定在一起,所以不能重写
静态内部类的设计意图
非静态内部类创建会持有外部类的引用,而静态内部类没有
成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
谈谈对kotlin的理解
提供了null安全、类型检查、自动转换、字符串表达式、lambda表达式、函数扩展
闭包和局部内部类的区别
string 转换成 integer的方式及原理
Interge.parseInt(String srtr),Interge.parseInt(String str, int radix)
Interge.parseInt(String srtr)内部还是执行的Interge.parseInt(String str, int radix),radix传的10,表示十进制
源码中进行一些列的异常判断,然后转码计算拼接
(二) java深入源码级(有难度)
哪些情况下的对象会被垃圾回收机制处理掉?
常见的两种判断方法:引用计数法、可达性分析算法
引用计数法会引起内存泄漏的问题,所以Java虚拟机采用的是可达性分析法
当对象无法被GC Roots寻找到的时候,那么GC就会认为该对象可以被回收
讲一下常见编码方式?
utf-8编码中的中文占几个字节;int型几个字节?
编码规则:如果一个字节,最高位是0,则这个字节是ASCII字符;如果高位是1,则连续多少个1就表示占用多少个字节
一个数字和英文字母占1个字节;一个中文一般占3个字节,也有4个字节
静态代理和动态代理的区别,什么场景使用?
静态代理在程序运行前就已知的;动态代理是程序编译时,运用反射机制创建而成的
静态代理一般只代理一个类,因为代理的类多了,代码会显得十分臃肿;
动态代理一般是代理一个接口下的所有实现类,动态代理是实现InvocationHandler下的invoke方法,代理类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象
Java的异常体系
Thorwable是父类,包含Error、Exception两种异常,Error指程序无法处理的错误,由JVM抛出,如OOM;Exception分运行时异常和非运行时异常
谈谈你对解析与分派的认识。
修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?
Java中实现多态的机制是什么?
如何将一个Java对象序列化到文件里?
说说你对Java反射的理解
说说你对Java注解的理解
注解也叫元数据,一种代码级别的说明,可以申明在类、方法、变量等前面,用来对这些元素进行说明、注释
注解不会直接影响被注解的代码,注解会被编译进class文件中,而且会在运行时被程序提取出来用于业务逻辑
说说你对依赖注入的理解
说一下泛型原理,并举例说明
Java中String的了解
类被final修饰,即无法被继承;subString、contact、replace均创建了一个新的String变量做操作
引入字符串常量池的概念,即初始化的时候会去常量池中查找并返回该对象的引用,若找不到再创建一个新的对象
String str = “abc” 和 String str = new String("abc") 的区别:字面量形式的对象初始化都会加入字符串常量池,当内容一致时,多个引用会指向同一个对象;使用new操作创建的String对象,一定会在堆中创建对象,若涉及到字面量的创建,则会在字符串常量池和堆中创建两个对
String线程安全,因为其不可变;StringBuffer线程安全,因为其中加入了大量的synchronized关键字
通常情况下执行效率:Stringbuilder>StringBuffer>String(视情况而定)
String为什么要设计成不可变的?
安全:不可变具有天生的线程安全;String常用作HashMap的key,如果可变会有安全问题,比如key相同
高效:通过字符创常量池,可以节省很多空间;每个String对应一个HashCode,再次使用不用重复计算
扩展:可以通过反射的方式修改String的value,所以严格意义上来说也不是不可变
Object类的equal和hashCode方法重写,为什么?
因为HashMap在put内容的时候,会先根据key的hashcode计算出位置,然后找到对应位置上的键值,进行key的比较,如果相同则覆盖
如果不重写hashcode方法,就无法定位到同一个位置,集合还是会插入元素,这样集合中就出现了相同的元素,那么重写equals就没意义了
(三) 数据结构
常用数据结构简介
数组、链表、栈、队列、树、二叉树、图
并发集合了解哪些?
分为阻塞式集合(被阻塞方法)和非阻塞式集合(会返回null或抛出异常)两种
列举java的集合以及集合之间的继承关系
集合类以及集合框架
集合类型分为三种,set(集)、list(列表)、map(映射)
collection是集合接口,定义了对集合操作的通用方法
collections是工具类,定义了很多静态方法
容器类介绍以及之间的区别(容器类估计很多人没听这个词,Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections),具体的可以看看这篇博文 Java容器类)
List,Set,Map的区别
list:有序、允许元素重复、ArrayList查询快、linkedList插入删除快
set:无需、不允许元素重复、TreeSet通过实现comparator实现了一个排序顺序
map:键值对、无需、允许重复的值,不允许重复的键,TreeMap实现comparator实现一个排序顺序
List和Map的实现方式以及存储方式
ArrayList:数组,每次扩容大概是原有的1.5倍
linkedlist:双向链表
hashmap:哈希表的map接口,底层使用数组实现,数组中的每一项是个单向链表,当链表长度大于一定阈值时,链表转换为红黑树,这样减少链表查询时间
HashMap的实现原理
hashmap采用了数组和链表的数据结构,在查找和修改方面继承了数组的线性查找和链表的寻址修改
HashMap数据结构?
使用链表和数组,在达到一定阈值时,转换为红黑树,低于6再转换会链表
HashMap源码理解
在put(key,value)的时候,先调用key的hashCode方法获得哈希值,找到在map中的位置,如果该位置为空,则直接放入该value;如果该位置有值,则替换掉原有值;如果桶满了(容量默认为16*加载因子0.75),就需要resize(扩容两倍后重排);如果链表超过阈值,就把链表转为红黑树,如果链表长度低于6,就把红黑树转为链表
HashMap如何put数据(从HashMap源码角度讲解)?
HashMap怎么手写实现?
ConcurrentHashMap的实现原理
ArrayMap和HashMap的对比
arraymap内部使用两个数组来实现,一个用来保存key的hash值,一个用来保存value值
和sparseArray一样也会对key使用二分法进行从小到大的排序,在添加、删除、查找数据的时候根据二分法找到对应的index值,然后对index进行添加、删除、查找
在数据量大的时候,效率会降低
HashTable实现原理
TreeMap具体实现
HashMap和HashTable的区别
HashMap与HashSet的区别
HashSet与HashMap怎么判断集合元素重复?
集合Set实现Hash怎么防止碰撞
ArrayList和LinkedList的区别,以及应用场景
ArrayList是基于数组实现的;LinkedList是基于双向链表实现的,同时还实现了Queue接口,功能更强大一些
ArrayList是基于数组实现的,所以在随机访问上,时间复杂度为O(1),插入数据需要做数据搬移
LinkedList是基于双向链表实现的,所以在插入或删除数据的时候,时间复杂度为O(1)
所以ArrayList更适合做查询操作比较多的场景,LinkedList更适合做插入删除操作较多,查询较少的场景;当然在某些情况下,ArrayList的插入删除操作也不见得比LinkedList差,比如在数据末尾的情况
数组和链表的区别
数组:有序、查找效率高、扩容是在大小满时,复制数据到更大的数组中,效率低
链表:无序、插入、删除效率高,根据节点寻找地址的方法找到下一个数据
二叉树的深度优先遍历和广度优先遍历的具体实现
堆的结构
堆和树的区别
堆和栈在内存中的区别是什么(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)?
什么是深拷贝和浅拷贝
浅拷贝:基本数据类型值传递,引用数据类型引用传递
深拷贝:基本数据类型值传递,引用数据类型,创建一个新的对象,并复制其内容
实现:浅拷贝(实现cloneable接口的clone方法)、深拷贝(序列化serialization或再clone一次)
手写链表逆序代码
讲一下对树,B+树的理解
讲一下对图的理解
判断单链表成环与否?
链表翻转(即:翻转一个单项链表)
合并多个单有序链表(假设都是递增的)
(四) 线程、多线程和线程池
开启线程的三种方式?
继承Thread类,并重写run方法,创建这个类对象,然后start方法开启线程
实现runnable接口,重写run方法,创建Thread,然后将这个Runable对象传入Thread,start开启线程
实现Callable接口,重写call方法,新建一个FutureTask类对象,将FutrueTask传入到Thread中,start开启线程
线程和进程的区别?
进程包括线程
为什么要有线程,而不是仅仅用进程?
线程效率高,代价小
run()和start()方法区别
run方法是由java虚拟机直接调用的,如果我们没有start,直接使用run,那么将会在执行run方法所在的线程中运行,只有开启了线程(start)之后,才会在开启的线程中运行
如何控制某个方法允许并发访问线程的个数?
在Java中wait和sleep方法的不同;
wait会使线程进入等待状态,需要notify去唤醒;sleep会在一定时间后自动唤醒
谈谈wait/notify关键字的理解
wait、notify、notifyAll不属于Thread类,是属于Object基础类,所以每个对象都有这些功能
wait使线程进入等待状态,必须要获得这个锁对象的控制权,一般是放在synchronized代码中
notify只会通知等待队列的第一个线程,notifyAll会通知全部
什么导致线程阻塞?
睡眠sleep、等待wait、线程礼让yield、线程自闭join
线程如何关闭?
利用取消标志位取消线程、中断线程
讲一下java中的同步的方法
synchronized修饰方法(如果所修饰方法为静态方法,则在调用该方法时,会锁住整个类)
synchronized修饰代码块,同步是一个高开销操作,如果没必要同步整个方法,可以同步代码块
数据一致性如何保证?
线程同步,关键字volatile修饰成员变量
如何保证线程安全?
同步锁
如何实现线程同步?
两个进程同时要求写或者读,能不能实现?如何防止进程的同步?
线程间操作List
Java中对象的生命周期
Synchronized用法
synchronize的原理
谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解
static synchronized 方法的多线程访问和作用
同一个类里面两个synchronized方法,两个线程同时访问的问题
volatile的原理
谈谈volatile关键字的用法
谈谈volatile关键字的作用
谈谈NIO的理解
NIO(new IO):面向缓冲、非阻塞IO、选择器;okhttp中使用了nio
IO:面向流、阻塞IO
synchronized 和volatile 关键字的区别
synchronized与Lock的区别
ReentrantLock 、synchronized和volatile比较
ReentrantLock的内部实现
lock原理
死锁的四个必要条件?
怎么避免死锁?
对象锁和类锁是否会互相影响?
什么是线程池,如何使用?
Java的并发、多线程、线程模型
谈谈对多线程的理解
多线程有什么要注意的问题?
谈谈你对并发编程的理解并举例说明
谈谈你对多线程同步机制的理解?
如何保证多线程读写文件的安全?
多线程断点续传原理
断点续传的实现
(五)并发编程有关知识点(这个是一般Android开发用的少的,所以建议多去看看):
平时Android开发中对并发编程可以做得比较少,Thread这个类经常会用到,但是我们想提升自己的话,一定不能停留在表面,,我们也应该去了解一下java的关于线程相关的源码级别的东西。
二、Android
Android面试题包括Android基础,还有一些源码级别的、原理这些等。所以想去大公司面试,一定要多看看源码和实现方式,常用框架可以试试自己能不能手写实现一下,锻炼一下自己。
(一)Android基础知识点
四大组件是什么
activity、service、broadcast、contentProvider
四大组件的生命周期和简单用法
onCreate、onStart、onResume、onPause、onStop、onDestroy、onReStart
Activity之间的通信方式
intent、全局常量、接口、观察者
Activity各种情况下的生命周期
横竖屏切换的时候,Activity 各种情况下的生命周期
configChange,不设置,则会重走生命周期;设置orientation,则横竖屏切换只会走一次;设置orientation|keyboardHidden,则横竖屏切换不会重新调用生命周期
Activity与Fragment之间生命周期比较
Activity上有Dialog的时候按Home键时的生命周期
dialog是在activity之上的一个组件,出现时activity并不会进入后台,在点击home键后会执行onStop、onDestroy方法
两个Activity 之间跳转时必然会执行的是哪几个方法?
onResume/onPause,A/B,如果B透明,A不会调用onStop
前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。
Activity的四种启动模式对比
Activity状态保存于恢复
fragment各种情况下的生命周期
Fragment状态保存startActivityForResult是哪个类的方法,在什么情况下使用?
如何实现Fragment的滑动?
fragment之间传递数据的方式?
Activity 怎么和Service 绑定?
怎么在Activity 中启动自己对应的Service?
startService、bindService
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三者的差别
- 谈谈对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事件传递分发机制
- 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简介)
三、高级开发技术面试题
这里讲的是大公司需要用到的一些高端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架构
- 介绍你做过的哪些项目
- 都使用过哪些框架、平台?
- 都使用过哪些自定义控件?
- 研究比较深入的领域有哪些?
- 对业内信息的关注渠道有哪些?
- 最近都读哪些书?
- 有没有什么开源项目?
- 自己最擅长的技术点,最感兴趣的技术领域和技术点
- 项目中用了哪些开源库,如何避免因为引入开源库而导致的安全性和稳定性问题
- 实习过程中做了什么,有什么产出?