作为一名即将求职的程序员,面对特殊时期的2022年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?

就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Android程序员的技术功底。

接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助!本面试题集只应对于Android求职者。

一 JAVA相关

1)JAVA基础

  • java基本数据类型有哪些,int, long占几个字节
  • == 和 equals有什么区别
  • hashcode 和 equals作用
  • new String创建了几个对象
  • 位运算符的一些计算
  • java的拆装箱
  • compareable 和 compartor的区别

下面列一两个遇到的题吧

基本数据类型,int大小,一个字节占几位, int的取值区间。
Integer a = 123456
Integer b = 123456
return a==b 如果a = a b = 1 结果呢
int a = 2;
int rusult = a++ + 4<<2

求 result的值
public static String fun(String s) {
        return s.length() < 0 ? (fun(s.substring(1) + s.charAt(0))) : "";
    }

System.out.println("result = " + fun("Smart"));

它的打印结果是什么。

类似这种的题很多,考察的都是基础知识的牢固性。所以需要自己多巩固基础。

2)数据结构和算法

常见的数据结构就是:数组,栈,队列,集合,映射,链表,堆,二分搜索树,红黑树。当然还有其他的一些,比如AVL平衡树等一些数据结构。

我们要做的就是了解它们的实现原理和各自的优缺点。

数据结构部分面试遇到最多的就是:

  • ArrayList和LinkedList的区别,优缺点
  • hashmap实现,扩容是怎么做的,怎么处理hash冲突,hashcode算法等
  • 链表需要知道。LinkedHashMap一般再问LRU的时候会问到
  • 二分搜索树的特性和原理。前中后序遍历写出其中一种,当问到二分搜索树的缺点的时候,你需要提出基于二分搜索树的红黑树,说出他的特性。
  • 堆的实现,最大堆,最小堆,优先队列原理。

算法

算法其实就是我们平时常见的一些排序:选择排序,插入排序,冒泡排序,希尔排序,归并排序,快速排序。以及和数据结构相关联的解决部分问题的一些计算方法。

算法面试遇到的一些题:

  • 手写快速排序,插入排序,冒泡排序
  • 翻转一个数字
  • 翻转一个链表
  • O(n)复杂度找出数组中和是9的两个数的索引
  • 写出二分搜索树前中后序遍历中的其中一个
  • 实现一个队列,并能记录队列中最大的数。

算法这一块是需要练习的推荐去Leetcode上面刷刷题,开拓一下思维。算法也并不一定要求你能写出来,主要考察你的思路,已经如何优化你的算法。

3)JVM虚拟机

JVM虚拟机我们需要知道他们内部组成:堆,虚拟机栈,本地方法栈,方法区,计数器。每一块都存放什么东西,以及垃圾回收的时候主要回收哪些块的东西。GC-ROOT链是从哪些地方开始的,垃圾回收集算法(很少遇到问的)。

类加载ClassLoader已经双亲委派机制,类加载的过程,类加载的信息对应在JVM的哪些块中。

列一个遇到的类加载的面试题:

public class TestClassLoader {
    static class Father {
        public static final String TAG = "Father";

        static {
            System.out.println("static Father");
        }

        {
            System.out.println("unStatic Father");
        }

        public Father() {
            System.out.println("constract Father");
            method();
        }

        public void method() {
            System.out.println("method Father");
        }

        @Override
        public String toString() {
            return "toString Father";
        }
    }

    static class Son extends Father {
        public static Son instance = new Son();

        static {
            System.out.println("static Son");
        }

        {
            System.out.println("unStatic Son");
        }

        public Son() {
            System.out.println("constract Son");
            method();
        }

        public void method() {
            System.out.println("method Son");
        }

        @Override
        public String toString() {
            return "toString Son";
        }
    }

    public static void main(String[] args) {
        System.out.println("1.---------------------");
        System.out.println(Son.TAG);
        Son[] sons = new Son[10];
        System.out.println(sons);
        System.out.println("2.---------------------");
        System.out.println(Son.instance);
        System.out.println("3.---------------------");
        Son son = new Son();
        Father father = son;
        father.method();
        System.out.println(son);
    }
}

写出打印输出。

4)线程安全

当多个线程访问一个对象的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,我们就认为这个对象时线程安全的。

线程安全就是一些多线程下载,同步,锁,死锁,线程池。volatile关键字的特性,变量的原子性。以及java.util.concurrent包下的类,也需要了解一下。

一般会问的是手写单例,以及双重锁式单例的优点。还有就是让你自己实现一个多线程下载,看你怎么设计。

5)编程思想

封装,继承,多态,抽象,反射,注解,设计模式,设计模式的原则。

面试中一般会问下:

  • 抽象和接口有什么不一样
  • 工作中常用的设计模式,一些源码中的设计模式
  • 具体给你一个设计模式让你说说你对他的了解,比如观察者,工厂。

以上这些东西主要考察你的代码设计能力。

6)网络协议

  • 互联网的实现主要分为几层,http、ftp、tcp、ip分别位于哪一层。
  • http和https的区别
  • 为什么tcp要经过三次握手,四次挥手
  • socket了解过吗

一般http和https问的比较多,对称加密和非对称加密也会问。tcp和socket偶尔遇见问的。

二 Android相关

Android部分我就不分几大块了。直接列举,但是列举到的每一项都是面试经常会问到并且会延伸问的,所以需要深入的去研究。

  • 四大组件有哪些,说出你对他们在Android系统中的作用和理解。
  • Activity生命周期,A启动B两个页面生命周期怎么运行的,为什么会这样,生命周期为什么这么设计,你有了解过吗。
  • 四种启动模式,内部堆栈是怎么回事,你工作中怎么使用的。
  • Activity的启动过程,这个我强烈建议每个Android开发人员都要清楚的知道,并且跟一下源码,几个核心类的作用。你会对Android有一个更好的认识。
  • 事件分发流程,怎么处理滑动冲突。举例:长按ListView的一个Item它变灰了。这个时候在滑动。item恢复原来的样子,这个时候他们内部的事件传递是什么样子。有很多种问法,所以你一定要搞清楚。
  • 自定义View,View的绘制流程。onMeasure,onLayout,onDraw都是什么作用。ViewGroup是怎么分发绘制的。onDraw里面怎么去做绘制,Canvas,Path,Paint你都需要了解。并且配合ValueAnimtor或者Scroller去实现动画。有时候面试的会突发奇想问你ViewGroup是树形结构,我想知道树的深度,你怎么计算,突然就变成了一个数据结构和算法的题。
  • Bitmap和Drawable
  • Animation和Animator
  • LinearLayout、RelativeLayout、FrameLayout三种常用布局的特性,他在布局的时候是怎么计算的。效率如何。CoordinatorLayout配合AppbarLayout的使用,以及自定义Behavior。ConstraintLayout的使用。用来减少层级。
  • Handler消息机制,推荐看一下Looper的源码
  • 进程间通信,Binder机制
  • AsyncTask源码看一下。
  • 图片的压缩处理,三级缓存,Lru算法
  • 分辨率和屏幕密度,以及计算一个图片大小。mdpi,hdpi的关系和比例。
  • 优化,内存优化,布局优化,启动优化,性能优化。内存泄露,内存溢出。怎么优化,用了什么工具,具体怎么做的。
  • listView和RecycleView对比,以及缓存策略。
  • JNI(很少问)
  • MVC,MVP,MVVM
  • 开源框架Okhttp,Glide,EventBus,Rxjava等,以及JetPack下的开源库,要会用,还说说出一些东西,推荐 Retrofit,Okhttp,Glide,EventBus这些看一下源码。
  • RecyclerView四大块,能实现什么效果,大致怎么实现的,心里要有数
  • DecorView,Window,WindowManager,PhoneWindow关系,以及个子的职责。

加分项:Kotlin,Gradle,Flutter,组件化,插件化,热修复。

上面的列的相关内容,看似很短一句话,但是每一项都需要你深入的去研究,要了解原理。为了更好地帮助大家进行学习,在这里给大家分享一份BAT大佬整理总结出来的《2022中高级Android面试题汇总》,里面包含了所有Android面试的知识点,可以全面的进行知识补给。***********************************************************

免费领取方式:https://mp.weixin.qq.com/s/HQgjJ5vMFvLh_7u1KizHiA

第一章 Java基础

  • 静态内部类和非静态内部类的比较
  • 多态的理解与应用
  • java方法的多态性理解
  • java中接口和继承的区别
  • 线程池的好处,详解,单例(绝对好记)
  • 线程池的优点及其原理
  • 线程池的优点(重点)
  • 为什么不推荐通过Executors直接创建线程池
  • 不怕难之BlockingQueue及其实现
  • 深入理解ReentrantLock与Condition
  • Java多线程:线程间通信之Lock
  • Synchronized 关键字原理
  • ReentrantLock原理
  • HashMap中的Hash冲突解决和扩容机制
  • JVM常见面试题
  • JVM内存结构 alt

第二章 Android基础

  • Activity知识点(必问)
  • Fragment知识点
  • Service知识点
  • Intent知识点 alt

第三章 UI控件篇

  • 屏幕适配
  • 主要控件优化
  • 事件分发与嵌套滚动 alt

第四章 网络通信篇

  • 网络协议 alt

第五章 架构设计篇

  • MVP架构设计
  • 组件化架构 alt

第六章 性能优化篇

  • 启动优化
  • 内存优化
  • 绘制优化
  • 安装包优化 alt

第七章 源码流程篇

  • 开源库源码分析
  • Glide源码分析
  • Android面试题:Glide
  • day 20 面试题:Glide面试题
  • 聊一聊关于Glide在面试中的那些事
  • 面试官:简历上如果写Glide,请注意以下几点…
  • Glide OOM问题解决方法汇总
  • OkHttp源码分析
  • Okhttp连接池复用机制
  • Okhttp 流程和优化的实现
  • 一篇让你受用的okhttp分析
  • OkHttp面试之–OkHttp的整个异步请求流
  • OkHttp面试之–HttpEngine中的sendRequest方法详解
  • OkHttp解析大总结
  • Okhttp任务队列工作原理
  • Android高频面试专题 - 架构篇(二)okhttp面试必知必会
  • Android 网络优化,使用 HTTPDNS优化 DNS,从原理到 OkHttp 集成
  • Retrofit源码分析
  • RxJava源码分析
  • RxJava原理与源码分析 alt

第八章 新技术篇

  • 实战问题篇 alt

第九章 面试篇

  • 开源文档
  • 面试题合集 alt

有需要这份《2022最新大厂Android面试资料汇总+电子书+视频+源码》完整版学习资料的伙伴可以点击下方链接 [保证100%免费获取]。

链接:https://shimo.im/docs/2wAlXyBMlztEPbAP/ 

最后,虽然裁员的很多,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。祝大家2022年万事大吉。