主要分为以下几部分:
(1)java面试题
(2)Android面试题
(3)高级开发技术面试题
(4)跨平台Hybrid 开发
java面试题
1.java内存区域讲解
2.java垃圾回收机制
3.分代垃圾回收
4.HashMap的实现原理
(1)实现原理
(2)时间复杂度
(3)hash函数设计
对素数取模,加法hash,位运算hash,乘法hash,除法hash,查表hash,混合hash,数据hash
java中String的hash使用的是乘法hash,也可以理解为转换为31进制。HashMap的key的hash使用的是位运算hash。
(4)位置索引
HashMap的默认容量1 << 4 = 2^4 = 16,最大容量是MAXIMUM_CAPACITY = 1 << 30。
注:左移相当于2^n次方。
索引位置方式:取模,对2^n-1进行“&”运算相当于取模,即
(2^n-1) & hash = hash %(2^n-1)
java中实际上使用的是位运算“&”,因为位运算比取模性能好。
(5)扩容机制
2倍扩容,扩容因子默认是0.75。新建数组,然后将旧的数据复制到新的数组中。
(6)hash冲突处理方式:链地址方法
5.volatile详解
6.Java四种引用
7.单例模式-双重检查锁
Android基础
Activity生命周期
- 正常情况
- 异常情况
Activity之间的通信
1. Intent/Bundle
2. 类静态变量
3. 全局变量
4. 数据库和sharepreference,当传递的数据量过大时使用
Activity和Fragment之间的通信
四大启动模式
Canvas的save和restore
1.LayoutInflater.inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)的实现原理
attachToRoot = true 会给加载的布局文件指定一个父布局,即root;
attachToRoot = false 则会将布局文件最外层所有layout属性进行设置,当该view被添加到父view中时,这些属性自动生效。
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
synchronized (mConstructorArgs) {
...
try {
...
if (TAG_MERGE.equals(name)) {
...
} else {
// Temp is the root view that was found in the xml
final View temp = createViewFromTag(root, name, inflaterContext, attrs);
ViewGroup.LayoutParams params = null;
if (root != null) {
params = root.generateLayoutParams(attrs);
// 关键代码attachToRoot = false的时候,会设置setLayoutParams
if (!attachToRoot) {
temp.setLayoutParams(params);
}
}
...
//关键代码root不为空attachToRoot为true时,会将view添加到root中。
if (root != null && attachToRoot) {
root.addView(temp, params);
}
if (root == null || !attachToRoot) {
result = temp;
}
}
} catch (XmlPullParserException e) {
...
} catch (Exception e) {
...
} finally {
...
}
return result;
}
}
2.为什么布局嵌套多性能慢?
(1)布局文件是一个xml文件,inflate布局文件其实就是解析xml,根据标签信息创建相应的布局对象并做关联。xml中的标签和属性设置的越多,节点树的深度越深,在解析时要执行的判断逻辑、函数的嵌套和递归就越多,所以时间消耗越多。
(2)一个界面要显示出来,在requestlayout后还要执行一系列的measure、layout、draw的操作,每一步的执行时间都会受到布局本身的影响。
Android原理
1.binder机制原理
2.Handler原理
3.AsyncTask原理
4.RecyclerView缓存原理
开源库实现原理
1.AndroidVideoCache原理:
网友评论