2022年Android面试题及答案汇总,每天20题持续更新中...(从面试官角度帮你审视问题)
Posted 学习Android的第1024天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022年Android面试题及答案汇总,每天20题持续更新中...(从面试官角度帮你审视问题)相关的知识,希望对你有一定的参考价值。
前言
本文乃找工作、招人必备之良品。后期不断完善中……
对于面试仍然充满畏惧?多次面试后信心被搓,被恶心的面试官打击?这里有一份宝典合集:包括有《1599页android面试宝典》+《Android Framework 开发揭秘》+《Android项目合集》等等,一切你需要的面试资料,我们都有合集大礼包等着你,需要的朋友可以添加下面VX回复JJ即可领取,100%免费!!!
这是我既前两次做Android面试题合集之后重新整理和完善的一份新的面试题。
写在前面,之前面试题带入的都是咱们求职者的视角,这次我联络的是部分招聘人员,当然具体名字和公司不方便透露,总之,该部分面试是从招聘角度出发,当然作为求职者我觉得只会收获更加丰富。
如何招聘人,搜集了一些知识点。如何做好应聘准备,也收集了一些主要知识点,供你参考。
- Android基础知识:基本涵盖Android所有知识体系,四大组件,Fragment,WebView,事件分发,View绘制…
- Java基础知识&高阶知识点:基础部分不谈了,高阶部分:泛型,反射,Java虚拟机…
- 算法与数据结构:链表,堆,栈,树…
- Android常用框架:异步,网络,图片加载,内存优化,依赖注入,数据库等框架
- Android前沿技术:Android组件化,热更新,插件化,消息推送,AOP面向切面编程,Flutter(谷歌的移动UI框架)…
- 源码分析:Android源码分析,启动一个app的源码分析,常用框架源码分析,Java源码分析,集合源码分析…
- 网络基础:五层网络模型,三次握手&四次挥手,请求头&响应头,Socket&WebSocket…
1.Java中的==、equals和hashCode的区别
(1)“==”运算符用来比较两个变量的值是否相等,即该运算符用于比较变量之间对应的内存中的地址是否相同,
要比较两个基本类型的数据或两个引用变量是否相等,只能使用“=.=“(注:编译器格式显示问题,是双等号)运算符
(2)equals是Object类提供的方法之一,每个java类都集成自Object类,即每个对象都有equals方法,equals与“==”一样,比较的都是引用,相比运 算符,equals(Object)方法的特殊之处在于其可以被覆盖,所以可以通过覆盖的方法让他比较的不是引用而是数据内容,即堆中的内容是否相等。
(3)hashCode()方法是从Object类继承过来的,他也是用来比较两个对象是否相等,Object类中的hashCode方法,返回对象在内存中地址转换成的一个Int值,所以如果未重写hashCode方法,任何对象的hashCode方法返回的值都是不相等的。
综上而言,==和equals判断的是(基本类型数据)引用是否相等,但equals可以通过覆盖方法使其比较的是数据内容,事实上,Java中很多类库中的类已经覆盖了此方法,而hashCode判断的是对象在内存中地址是否相等。
2.int和integer的区别
Integer是int提供的封装类,而int是java的基本数据类型,Integer的默认值是null,而int的默认值是0,声明Integer的变量需要实例化,而int不需要,Integer是对象,是一个引用指向这个对象,而int是基本数据类型,直接存储数据。
3.String、StringBuffer和StringBuilder的区别
他们的主要区别在于运行速度和线程安全两个方面,运行速度:StringBuilder>StringBuffer>String,String最慢的原因在于String是字符串常量,一旦创建是不可以再更改的,但后两者的对象是变量,是可以更改的,Java中对String对象的操作实际上是一个不断创建新的对象而将旧的对象回收的过程,而后两者因为是变量,所以可以直接进行更改,在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的,因为在StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,而StringBuilder不存在该关键字,所以在线程中并不安全。
4.什么是内部类?内部类的作用是什么?
内部类是定义在另一个类里面的类,与之相对应,包含内部类的类被称为外部类,
内部类的作用有:(1)内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一包中的其他类访问,(2)内部类的方法可以直接访问外部类的所有数据,包括私有的数据,(3)内部类的种类:成员内部类、静态内部类、方法内部类、匿名内部类
5.进程与线程的区别
进程是CPU资源分配的最小单位,而线程是CPU调度的最小单位,进程之间不能共享资源,而线程共享所在进程的地址空间和其他资源,一个进程内可以拥有多个线程,进程可以开启进程、也可以开启线程,一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。
6.final、finally、finalize的区别
final是用于修饰类、成员变量和成员方法,类不可被继承,成员变量不可变,成员方法不可被重写;finally与try…catch…共同使用,确保无论是否出现异常都能被调用到;finalize是类的方法,垃圾回收前会调用此方法,子类可以重写finalize方法实现对资源的回收。
7.Serializable和Parcelable的区别
Serlizable是java序列化接口,在硬盘上读写,读写的过程中有大量临时变量产生,内部执行大量的I/O操作,效率很低;Parcelable是Android序列化接口,效率高,在内存中读写,但使用麻烦,对象不能保存到磁盘中。
8.静态属性和静态方法是否可以被继承?是否可以被重写?
可以继承,但不可以被重写,而是被隐藏,如果子类里面定义了静态方法或属性,那么这时候父类的静态方法或属性称之为隐藏。
9.成员内部类、静态内部类、局部内部类、和匿名内部类的理解
Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域中)、匿名内部类(无构造方法)、静态内部类(由static修饰的类、不能使用任何外围类的非static成员变量和方法、不依赖外围类),每个内部类都能独立的继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类均无影响,因为Java支持实现多个接口,而不支持多继承,我们可以使用内部类提供的、可以继承多个具体的或抽象的类的能力来解决使用接口难以解决的问题,接口只是解决了部分问题,而内部类使得多继承的解决方案变得更加完整。
10.Java的垃圾回收机制及其在何时会被触发
内存回收机制:就是释放掉在内存中已经没有用的对象,要判断怎样的对象是没用的,有两种方法:(1)采用标记数的方法,在给内存中的对象打上标记,对象被引用一次,计数加一,引用被释放,计数就减一,当这个计数为零时,这个对象就可以被回收,但是,此种方法,对于循环引用的对象是无法识别出来并加以回收的,(2)采用根搜索的方法,从一个根出发,搜索所有的可达对象,则剩下的对象就是可被回收的,垃圾回收是在虚拟机空闲的时候或者内存紧张的时候执行的,什么时候回收并不是由程序员控制的,可达与不可达的概念:分配对象使用new关键字,释放对象时,只需将对象的引用赋值为null,让程序不能够在访问到这个对象,则称该对象不可达。
在以下情况中垃圾回收机制会被触发:
(1)所有实例都没有活动线程访问 ;(2)没有其他任何实例访问的循环引用实例;(3)Java中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。
11.Java中的代理是什么?静态代理和动态代理的区别是什么?
代理模式:在某些情况下,一个用户不想或不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用,代理对象可以在客户端和目标对象之间起中介的作用,并且可以通过中介对象去掉用户不能看到的内容和服务,或者添加用户需要的额外服务。
静态代理:即在程序运行前代理类就已经存在,也就是编写代码的时候已经将代理类的代码写好。
动态代理:在程序运行时,通过反射机制动态创建代理类。
12.Java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是Java多态性的不同表现
重写Overriding 是父类与子类之间多态的一种表现;
重载Overloading是同一个类中多态性的一种表现;
13.Java中反射的相关理解
Java的反射机制是在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,能够调用它的任意一个方法和属性,包括私有的方法和属性,这种动态地获取信息以及动态的调用对象的方法的功能就称之为Java的反射机制。
从对象出发,通过反射(.class类)可以获取到类的完整信息,(类名、class类型、所在包、具有的所有方法Method[]类型、某个方法的完整信息,包括修饰符、返回值类型、异常、参数类型、所有属性Field[ ]、某个属性的完整信息,构造器Constructors,调用类的属性或方法。
14.Java中注解的相关理解
Java注解,英文名为Annotation,一种代码级别的说明,是JDK1.5及以后版本引入的一个特性,与类、接口、枚举在同一个层次,他可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释、作用分类;注解是Java提供的一种元程序中元素关联任何信息和任何元数据(metadata)的途径和方法,Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据
注解的一般格式为:[修饰符]@interface[名称]元素,元素是无方法体的方法声明,可以有默认值。
注解的作用:
编写文档:通过代码里标识的元数据生成文档[生成文档doc]
代码分析:通过代码里的元数据对代码进行分析[使用反射]
编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查[Override]
15.对Java中String类的理解
通过对String类的源代码分析可知,(1)String类是final类,即意味着String类不能被继承,并且他的成员方法都默认为final方法;(2)String类在源代码中实际上是通过char[ ]数组来保存字符串的;(3)String对象一旦创建就是固定不便的,对String对象的任何change操作都会生成新的对象。
16.对Java中字符串常量池的理解
字符串的分配和其他对象分配一样,是需要消耗高昂的时间和空间成本的,而且字符串在程序中使用得非常多,JVM为了提高性能和减少内存的开销,在实例化字符串的时候会进行一些优化;每当我们创建字符串常量时,JVM首先会检查字符串常量池,如果该字符床已经存在于常量池中,那么就直接返回常量池中的实例引用,如果该字符串不存在,就会实例化该字符串,并将其放在常量池中,由于字符串的不可变性,我们可以十分肯定常量池中一定不存在两个相同的字符串,Java中的常量池实际上分为两种形态:静态常量池和运行时常量池
静态常量池:即*.class文件的常量池,.class文件的常量池不仅仅包括字符串(数字)字面量,还包含类、方法的信息,占用class文件的绝大部分空间。
运行时常量池:常量存入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
17.Java中为什么String类要设计成不可变的
在java中将String类设计成不可变的是综合考虑到各种因素的结果,需要综合内存、同步、数据结构、以及安全等方面的考虑。
字符串常量池的需要:字符串常量池是Java堆内存中一个特殊的存储区域,当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象,假若字符串对象允许改变,那么将会导致各种逻辑的错误,比如改变一个引用的字符串将会导致另一个引用出现脏数据。
允许String对象缓存HashCode:Java中String对象的哈希码被频繁的使用,比如在HashMap等容器中,字符串不变性保证了哈希码的唯一性,因此可以放心地进行缓存,这也是一种性能优化的手段,意味着不必每次都去计算新的哈希码。
安全性:String被许多Java类库用来当作参数,如:网络连接(network connection)、打开文件(opening files)等等,如果String不是不可变的,网络连接、打开文件将会被改变——这将导致一系列的安全威胁,操作的方法本以为连接上一台机器,其实不是,优于反射的参数都是字符串,同样也会引起一系列的安全问题。
18.Java中Hash码(哈希码)的理解
在Java中,哈希码代表了对象的一种特征,例如我们判断某两个字符串是否==,如果其哈希码相等,则这两个字符串是相等的,其次,哈希码是一种数据结构的算法,常见的哈希码的算法有:
Object类的HashCode,返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
String类的HashCode,根据String类包含的字符串的内容,根据一种特殊的算法返回哈希码,只要字符串的内容相同,返回的哈希码也相同。
Integer类:返回的哈希码就是integer对象里所包含的那个整数的数值。例如
Integer i1=new Integer(100) i1.hashCode的值就是100,由此可见两个一样大小的Integer对象返回的哈希码也一样。
19.Object类的equal方法和hashcode方法的重写
equal和hashCode的关系是这样的:(1)如果两个对象相同(即用equal比较返回true),那么他们的hashcode值一定要相同;(2)如果两个对象的hashcode相同,他们并不一定相同(即用equal比较返回false),因为hashcode的方法是可以重载的,如果不重载,会用Java.long.Object的hashcode方法,只要是不同的对象,hashcode必然不同。
由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,就没有必要再进行equal的比较了,这样就大大减少了equals比较的次数,这对需要比较数量很大的运算效率特稿是很多的。
附加:一旦new对象就会在内存中开辟空间,==比较的是对象的地址值,返回的是boolean型,equal方法默认比较的对象的地址值,但是Integer等基本类型包装类以及String类中已经重写了equal()方法,比较的是对象内存中的内容,返回值是boolean型。
20.Java常用集合List与Set,以及Map的区别
Java中的集合主要分为三种类型:Set(集)、List(列表)、Map(映射);
数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而Java集合是可以存储和操作数目不固定的一组数据,所有的Java集合都位于java.util包中,Java集合只能存放引用类型的数据,不能存放基本数据类型。
Collection是最基本的集合接口,声明了适用于Java集合(只包括Set和List)的通用方法,Set和List都继承了Collection接口。
Set是最简单的一种集合,集合中的对象不按特定的方式排序,并且没有重复对象,Set接口主要实现了两种实现类
TreeSet:TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序;
HashSet:HashSet类按照哈希算法来存取集合中的对象,存取速度比较快;
Set具有与Collection完全一样的接口,因此没有任何额外的功能,实际上Set就是Collection,只是行为不同(这是继承与多态思想的典型应用,表现不同的行为),Set不保存重复的元素,Set接口不保证维护元素的次序。
(2) List列表的特征是其他元素以线性表的方式存储,集合中可以存放重复的对象,其接口主要实现类:
ArrayList( ):代表长度可以改变的数组,可以对元素进行随机的访问,向ArrayList( )中插入与删除元素的速度慢。
LinkedList( ):在实现类中采用链表数据结构,插入和删除的速度快,但访问的速度慢。
对于List的随机访问来说,就是只是随机来检索位于特定位置的元素,List的get(int index)方法返回集合中由参数index指定的索引位置的对象,索引下标从0开始。
Map映射是一种把关键字对象映射的集合,他的每一个元素都包括一堆键对象和值对象,Map没有继承Collection接口,从Map集合中检索元素时只要给出键对象,就会返回对应的值对象。
HashMap:Map基于散列表的实现,插入和查询“键值对”的开销是固定的,可以通过构造器设置容量capacity和负载因子load factor ,以调整容器的性能;
LinkedHashMap:类似于HashMap,但在迭代遍历时,取得“键值对”的顺序是其插入次序,只比HashMap慢一点,而在迭代访问时反而更快,因为它使用链表维护内部次序。
TreeMap:基于红黑树数据结构的实现,查看“键”或“键值对”时,他们会对其排序(次序由Comparabel和Comparator决定)
最后
按照国际惯例,给大家分享一套十分好用的Android进阶资料:《全网最全Android开发笔记》。
整个笔记一共8大模块、729个知识点,3382页,66万字,可以说覆盖了当下Android开发最前沿的技术点,和阿里、腾讯、字节等等大厂面试看重的技术。
好啦,这份资料就给大家介绍到这了,有需要详细文档的小伙伴,可以微信扫下方二维码回复JJ免费领取哈~
因为所包含的内容足够多,所以,这份笔记不仅仅可以用来当学习资料,还可以当工具书用。
如果你需要了解某个知识点,不管是Shift+F 搜索,还是按目录进行检索,都能用最快的速度找到你要的内容。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照整个知识体系编排的。
(一)架构师必备Java基础
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
(二)设计思想解读开源框架
1、热修复设计
2、插件化框架设计
3、组件化框架设计
4、图片加载框架
5、网络访问框架设计
6、RXJava响应式编程框架设计
……
(三)360°全方位性能优化
1、设计思想与代码质量优化
2、程序性能优化
- 启动速度与执行效率优化
- 布局检测与优化
- 内存优化
- 耗电优化
- 网络传输与数据储存优化
- APK大小优化
3、开发效率优化
- 分布式版本控制系统Git
- 自动化构建系统Gradle
……
(四)Android框架体系架构
1、高级UI晋升
2、Android内核组件
3、大型项目必备IPC
4、数据持久与序列化
5、Framework内核解析
……
(五)NDK模块开发
1、NDK开发之C/C++入门
2、JNI模块开发
3、Linux编程
4、底层图片处理
5、音视频开发
6、机器学习
……
(六)Flutter学习进阶
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter Dart语言系统入门
……
(七)微信小程序开发
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战
……
(八)kotlin从入门到精通
1、准备开始
2、基础
3、类和对象
4、函数和lambda表达式
5、其他
……
好啦,这份资料就给大家介绍到这了,有需要详细文档的小伙伴,可以微信扫下方二维码回复JJ免费领取哈~
以上是关于2022年Android面试题及答案汇总,每天20题持续更新中...(从面试官角度帮你审视问题)的主要内容,如果未能解决你的问题,请参考以下文章
2022年Android面试题及答案汇总,每天20题持续更新中...(从面试官角度帮你审视问题)
Android面试题及答案整理(2022年最新Android面试题大全带答案)
2022年腾讯,阿里,美团等Android高频面试题及答案,知识脉络整理