2022年Android面试题及答案收集(不断更新中)

前言

找工作、招人必备之良品。后期不断完善中……

如何招聘人,搜集了一些知识点。如何做好应聘准备,也收集了一些主要知识点,供你参考。

  • Android基础知识:基本涵盖Android所有知识体系,四大组件,Fragment,WebView,事件分发,View绘制…
  • Java基础知识&高阶知识点:基础部分不谈了,高阶部分:泛型,反射,Java虚拟机…
  • 算法与数据结构:链表,堆,栈,树…
  • Android常用框架:异步,网络,图片加载,内存优化,依赖注入,数据库等框架
  • Android前沿技术:Android组件化,热更新,插件化,消息推送,AOP面向切面编程,Flutter(谷歌的移动UI框架)…
  • 源码分析:Android源码分析,启动一个app的源码分析,常用框架源码分析,Java源码分析,集合源码分析…
  • 网络基础:五层网络模型,三次握手&四次挥手,请求头&响应头,Socket&WebSocket…

面试题总结

更多大厂面试题,vx扫描二维码免费领取

文章目录

前言

1.Java中的==、equals和hashCode的区别
2.int和integer的区别
3.String、StringBuffer和StringBuilder的区别
4.什么是内部类?内部类的作用是什么?
5.进程与线程的区别
6.final、finally、finalize的区别
7.Serializable和Parcelable的区别
8.静态属性和静态方法是否可以被继承?是否可以被重写?
9.成员内部类、静态内部类、局部内部类、和匿名内部类的理解
10.Java的垃圾回收机制及其在何时会被触发
11.Java中的代理是什么?静态代理和动态代理的区别是什么?
12.Java中实现多态的机制是什么?
13.Java中反射的相关理解
14.Java中注解的相关理解
15.对Java中String类的理解
16.对Java中字符串常量池的理解
17.Java中为什么String类要设计成不可变的
18.Java中Hash码(哈希码)的理解
19.Object类的equal方法和hashcode方法的重写
20.Java常用集合List与Set,以及Map的区别
21.ArrayMap和HashMap的区别
22.HashMap和HashTable的区别
23.HashMap和HashSet的区别
24.ArrayList和LinkedList的区别
25.数组和链表的区别
26.Java中多线程实现的三种方式
27.Java中创建线程的三种方式
28.线程和进程的区别
29.Java中的线程的run( )方法和start()方法的区别
31.Java中wait和sleep方法的不同
32.对Java中wait/notify关键字的理解
33.什么是线程阻塞?线程该如何关闭?
34.如何保证线程的安全
35.实现线程同步的方式
36.Java中Synchronized关键字的用法,以及对象锁、方法锁、类锁的理解
37.Java中锁与同步的相关知识
38.Synchronized和volatile关键字的区别
39.Java的原子性、可见性、有序性的理解
40.ReentrantLock、Synchronized、Volatile关键字
41.Java中死锁的概念,其产生的四个必要条件
42.Java中堆和栈的理解
43.理解线程间通信
44.线程中的join()方法的理解,及如何让多个线程按顺序执行
45.工作者线程(workerThread)与主线程(UI线程)的理解
46.AsyncTask(异步任务)的工作原理
47.并发和并行的区别及理解
48.同步和异步的区别、阻塞和非阻塞的区别的理解
49.Java中任务调度的理解
50.Java中进程的详细概念
51.线程的详细概念
52.Android中的性能优化相关问题
53.内存泄漏的相关原因
54.通过Handler在线程间通信的原理
55.Android中动画的类型:
55.理解Activity、View、Window三者之间的关系
56.Android中Context详解:
57.Java中double和float类型的区别
58.Android常用的数据存储方式(4种)
59.ANR的了解及优化
60.Android垃圾回收机制和程序优化System.gc( )
61.Android平台的优势和不足

62.其他讲解:

  • Activity组件
  • Service组件
  • BoradcastReceiver组件
  • ContentProvider(内容提供者)组件
  • Fragment
  • ViewPager
  • Android的事件传递(分发)机制
  • Bitmap的使用及内存优化
  • 使用View绘制视图
  • Android内存泄漏及管理
  • Android设计模式之MVC
  • JVM运行原理详解
  • Android平台的虚拟机Dalvik
  • Java的内存分配
  • Android中的Binder机制
  • Android中的缓存机制
  • Android 中图片的三级缓存策略

面试题总结

更多大厂面试题,vx扫描二维码免费领取

在这里插入图片描述

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决定)

21.ArrayMap和HashMap的区别

ArrayMap相比传统的HashMap速度更慢,因为其查找方法是二分法,并且当删除或添加数据时,会对空间重新调整,可以说ArrayMap是牺牲了时间来换空间,ArrayMap与HashMap的区别主要在:

存储方式不同:HashMap内部有一个HashMapEntry<K,V>[ ]对象,而ArrayMap是一个<key,value>映射的数据结构,内部使用两个数组进行数据存储,一个数组记录key的hash值,另一个数组记录value值。

添加数据时扩容的处理不一样:HashMap进行了new操作,重新创建对象,开销很大,而ArrayMap用的是copy数据,效率相对高很多。

ArrayMap提供了数组收缩的功能,在clear或remove之后,会重新收缩数组,释放空间。

ArrayMap采用的是二分法查找。

22.HashMap和HashTable的区别

HashMap是基于哈希表实现的,每一个元素是一个key—value对,其内部通过单链表解决冲突的问题HashMap是非线程安全的,只适用于单线程的环境下。多线程的环境下可以采用concurrent并发包下的concurrentHashMap,HsahMap实现了serializable接口,支持序列化,实现了cloneable接口,能被克隆。HashMap内部维持了一个存储数据的Entry数组,HashMap采用链表解决冲突,HashMap中的key和value都允许为null,key为null的键值对永远都放在以table[0]为节点的链表中。

HashTable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足时,同样会自动增大,HashTble是线程安全的,能用在多线程的环境下,HashTable实现了serializable接口,它支持序列化,实

  • 29
    点赞
  • 253
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
面试是评估一个人技能和能力的重要环节。在Android面试,除了基础知识的掌握外,还需要注意交流和语言组织能力。基础知识的牢固掌握是面试的基础,但有些人可能在实际表达存在困难。因此,在准备面试时,可以使用思维导图等工具来梳理知识点,帮助自己更好地组织语言。从简到繁、从外到内的方式可以帮助我们更好地展开回答。生成思维导图后,可以按照这个体系一条条地进行讲解,并在每个点上进行延伸,这样可以延长自己的说话时间,提高通过面试的概率。\[1\]\[2\] 在Android,进程之间是不能互相访问的,因此需要使用多进程通信技术。Android特有的多进程通信技术是Binder。通常情况下,一个应用是一个进程,但是Android一个应用也可以有多个进程,可以通过指定android:process属性来给四大组件指定进程。其以“:”开头的为私有进程,不以“:”开头的为共有进程。\[3\] 在Android面试,除了基础知识和多进程通信,还有其他重要的话题,如Android架构、UI设计、性能优化等。准备面试时,建议全面了解这些话题,并能够清晰地表达自己的观点和经验。 #### 引用[.reference_title] - *1* *2* *3* [android面试实用篇](https://blog.csdn.net/wang_yong_hui_1234/article/details/105579401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值