2020新鲜出炉的“面筋”,够刁钻
面试难度还行,但是如果不好好复习,有几个点还真是答不上来
第一部分
共享屏幕,在记事本里敲两个编程题(还算容易的)
①一个整形数组,在原数组上修改,将奇数放在前面,偶数放在后面
/**
*思路:从数组两端向中间查找,如果指针对应偶数-奇数,则相互对调,
*否则指针继续前移
*/
public static void solution(int[] nums) {
if (nums == null || nums.length <= 0) return;
int left = 0, right = nums.length - 1;
while (left < right) {
//左边是奇数,指针后移,直到发现偶数
if (nums[left] % 2 != 0) {
left++;
continue;
}
//右边是偶数,指针前移,直到发现奇数
if (nums[right] % 2 == 0) {
right--;
continue;
}
//进行对换
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
② 判断字符串是否是回文字符串,例如abcba
/**
*两端往中间进行遍历,只要有一个字符不相等就返回false
*/
public static boolean isReversible(String s) {
if (s == null || s.isEmpty())
return false;
int length = s.length();
for (int i = 0; i < length / 2; i++) {
if (s.charAt(i) != s.charAt(length - i - 1))
return false;
}
return true;
}
第二部分
1.类加载机制,双亲委托
https://www.cnblogs.com/iteacat/p/12569008.html
2. Synchronized volatile关键字,volatile修饰基本数据类型和自定义类型区别,volatile底层实现
volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
volatile标记的变量不会被编译器优化(指令重排);synchronized标记的变量可以被编译器优化
https://blog.csdn.net/u014674862/article/details/89168376
3. 四种引用类型
强引用:不会被回收
软引用:内存不足时回收
弱引用:GC就会回收
虚引用:N/A
4. ContentProvider实现原理(如何跨进程)
getContentResolve->ApplicationContentResolver->ContentProviderProxy<===IBidner====>Transport->NameProvider
https://www.jianshu.com/p/147169640798
5. 发起一个https请求有哪些过程
- 客户端向服务器发起HTTPS的请求,连接到服务器的443端口;
- 服务器将非对称加密的公钥传递给客户端,以证书的形式回传到客户端
- 服务器接受到该公钥进行验证,就是验证2中证书,如果有问题,则HTTPS请求无法继续;如果没有问题,则上述公钥是合格的。(第一次HTTP请求)客户端这个时候随机生成一个私钥,成为client key,客户端私钥,用于对称加密数据的。使用前面的公钥对client key进行非对称加密;
- 进行二次HTTP请求,将加密之后的client key传递给服务器;
- 服务器使用私钥进行解密,得到client key,使用client key对数据进行对称加密
- 将对称加密的数据传递给客户端,客户端使用非对称解密,得到服务器发送的数据,完成第二次HTTP请求。
这里还问我证书是如何传递到客户端的,有点懵,不知道是不是想问Android如何验证证书
6. 有序广播无序广播区别,被拦截后超时机制
普通广播:只要intentFilter的action匹配,则会接收此广播
有序广播:发送出去的广播被广播接收者按照按照Priority属性值大小先后顺序接收,先接受的receiver可以对广播进行修改和截断
这里的超时是指,Android系统(AMS)向一个广播接收器发送无序广播时, 并不需要等待该广播接收器返回结果,就会继续向下一个广播接收器发送广播。但是,当Android系统发送有序广播时,将会等待前一个广播接收器返回结果后(除非处理超时), 才会继续发送向下一个广播接收器发送广播。
这个超时时间还真不知道
7. 进程优先级分类
前台进程>可见进程>服务进程>后台进程>空进程
8. AMS管理的栈有哪几类
这里的栈要区别与所说的Activity启动模式的栈(task)
为了让这许多Activity协同工作而不至于产生混乱,Android平台设计了ActivityStack机制用于管理Activity,其遵循先进后出的原则,系统总是显示位于栈顶的Activity,从逻辑上将,位于栈顶的Activity也就是最后打开的Activity, 这也是符合逻辑的。 在操作应用程序时,每次启动新的Activity,都会将此压入Activity Stack,当用户执行返回操作时,移除Activity Stack顶上的Activity,这样就实现了返回上一个Activty的功能。直到用户一直返回到Home Screen,这时候可以理解为移除了Activity Stack所有的Activity,这个Activity Stack不再存在,应用程序也结束了运行.
共五种:
- HOME_STACK_ID Home应用以及recents app所在的栈
- FULLSCREEN_WORKSPACE_STACK_ID 一般应用所在的栈
- FREEFORM_WORKSPACE_STACK_ID 类似桌面操作系统
- DOCKED_STACK_ID
- PINNED_STACK_ID 画中画栈
9. uid机制
uid: Android系统中uid用于标识一个应用程序,uid在应用安装时被分配,并且在应用存在于手机上期间,都不会改变。一个应用程序只能有一个uid,多个应用可以使用sharedUserId 方式共享同一个uid,前提是这些应用的签名要相同。
https://www.jianshu.com/p/b33dd49f2ae
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android横竖屏幕切换生命周期详解
- LINUX中如何查看某个端口是否被占用的方法
- Android实现RecyclerView添加分割线的简便方法
- Android定时器Timer的停止和重启实现代码
- Ubuntu20.04开启root账户的方法步骤
- Android 将view 转换为Bitmap出现空指针问题解决办法
- Android ScrollView 下嵌套 ListView 或 GridView出现问题解决办法
- Ubuntu 安装cuda10.1驱动的实现步骤
- Android单例模式的几种方法总结
- android长截屏原理及实现代码
- Android 删除指定包名的App实例代码
- 在Ubuntu20.04 LTS中配置Java开发环境
- Android 加载GIF图最佳实践方案
- Android编程之方向传感器用法示例
- Ubuntu20.04安装cuda10.1的步骤(图文教程)