新鲜出炉的Android“面筋”,够刁钻,面试复习不全面只能被怼了

面试难度还行,但是如果不好好复习,有几个点还真是答不上来

第一部分

共享屏幕,在记事本里敲两个编程题(还算容易的)

①一个整形数组,在原数组上修改,将奇数放在前面,偶数放在后面

/**
*思路:从数组两端向中间查找,如果指针对应偶数-奇数,则相互对调,
*否则指针继续前移
*/
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不再存在,应用程序也结束了运行.

共五种:

  1. HOME_STACK_ID
    Home应用以及recents app所在的栈

  2. FULLSCREEN_WORKSPACE_STACK_ID
    一般应用所在的栈

  3. FREEFORM_WORKSPACE_STACK_ID
    类似桌面操作系统

  4. DOCKED_STACK_ID

  5. PINNED_STACK_ID
    画中画栈

9. uid机制

uid: Android系统中uid用于标识一个应用程序,uid在应用安装时被分配,并且在应用存在于手机上期间,都不会改变。一个应用程序只能有一个uid,多个应用可以使用sharedUserId 方式共享同一个uid,前提是这些应用的签名要相同。

面试前做好准备战!

接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!

这里给大家提供一个方向,进行体系化的学习:

1、看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。

2、进行系统梳理知识,提升储备

客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

系统学习方向:

  • 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO

  • Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化

  • 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化

  • 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack

  • NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发

  • 微信小程序:小程序介绍+UI开发+API操作+微信对接

  • Hybrid 开发与Flutter:Html5项目实战+Flutter进阶

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

3、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

4、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

还有耗时一年多整理的一系列Android学习资源:Android源码解析、Android第三方库源码笔记、Android进阶架构师七大专题学习、历年BAT面试题解析包、Android大佬学习笔记等等。

以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者关注主页扫描加 【微信】 获取。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章