面试收藏

Android面试题集(一)

2022-02-20  本文已影响0人  搬码人

面向对象编程和面向过程编程的区别

1、面向过程在解决问题的时候,会分析出解决问题的步骤,然后用函数一步步的将这些步骤实现,依次调用函数。而面向对象在解决问题的时候,会将问题拆散成一个个对象,建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。这来自于思考问题方式的不同。
2、从结构上说,面向过程的特点是过程化和模块化,而面向对象的特点则是类封装、继承和多态(多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法)。
3、执行效率不同,面向过程不需要封装类再实例化对象调用,只定义了函数和调用,所以执行效率会更高一些。
总的来说,面向过程执行效率更高也更直接,面向对象更灵活也更丰满。

抽象类和接口的区别

相同点:无法直接创建对象

静态内部类和非静态内部类

组合(引用)跟继承的使用场景区别

Android和Java序列化原理

谈谈Serializable和Parcelable接口的区别

是匿名内部类 ,它有什么特征?

  1. 我们给匿名内部类传递参数的时候,若该形参在内部类中需要被使
    用,那么该形参必须要为final。也就是说:当所在的方法的形参需要
    被内部类里面使用时,该形参必须为final。
  2. 为什么必须要为final呢?
    首先我们知道在内部类编译成功后,它会产生一个class文件,该class文件与外部类并不是同一class文件,仅仅只保留对外部类的引用。当外部类传入的参数需要被内部类调用时,从java程序的角度来看是直接被调用在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的,毕竟站在程序的角度来看这两个根本就是同一个,如果内部类该变了,而外部方法的形参却没有改变这是难以理解和不可接受的,所以为了保持参数的一致性,就规定使用final来避免形参的不改变。简单理解就是,拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。

String中“==”与equals()的区别?

“==”比较在内存中存放的位置
equals()比较内容

为什么说String是不可变的?

image.png
测试结果 image.png
测试结果

String类以及其属性都是final修饰。

什么是内存泄漏?Java是怎么处理它的?

ArrayList和LinkedList的区别

堆与栈的区别

堆与栈的区别有:1、栈由系统自动分配,而堆是人为申请开辟;2、栈获得的空间较小,而堆获得的空间较大;3、栈由系统自动分配,速度较快,而堆一般速度比较慢;4、栈是连续的空间,而堆是不连续的空间。

Java中线程与堆栈的关系?

Java回收机制?如何减少OOM的概率?

JVM中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。

Java中强引用、软引用、弱引用以及虚引用?

什么是依赖注入,能说说几个依赖注入的库吗?

关键字synchronized的作用是什么?

如果是成员方法,synchronized修饰的是this(两个线程不同步)
如果是静态方法,synchronized修饰的是class对象

Java volatile关键字解析

volatile关键字的作用:保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。

自旋锁,乐观锁,悲观锁

如何根据泛型T获取它代表的具体类的类名?

private Class<?> analysisClassInfo(Object object) {
//getGenericSuperclass()得到包含原始类型,参数化,数组,类型变量,基本数据
Type getType=object.getClass().getGenericSuperclass();
//获取参数化类型
Type[] params=((ParameterizedType)getType).getActualTypeArguments();
  return (Class<?>)params[0];
}

注解的原理?

https://www.jianshu.com/p/6d4d8a5e1e42

Android四大组件

两个fragment如何进行通信?

使用LiveDataBus

image.png
image.png

Activity的生命周期

图片来源:Android开发网站

关于Activity生命周期的切换
如果Activity A切换到另一个Activity B,那么Activity A生命周期执行到onPause()时B执行onCreate()、onStart()、onResume(),接着A才执行onStop()
如果弹出一个对话框,那么A将处于onPause()阶段。

当打开其他程序,之前的程序就会被挂到后台,那么如果内存不够用呢?

挂在后台的App的Activity将被销毁
异常情况下
onSaveInstanceState()保存数据
onRestoreInstanceState()或onCreate()中恢复数据

Activity之间如何进行通信?

从18年谷歌IO大会开始,官方建议:
在Activity与Activity

Activity与Fragment
Fragment与Fragment之间通信使用LivedataBus

image.png image.png

Fragment生命周期

image.png

可以看到Fragment的生命周期和Activity非常相似,只是多了几个方法:

下面是关于Fragment生命周期变化场景


部分场景

如果Fragment B覆盖Fragment A,Fragment A将执行到onDestroyView,其他部分雷同Activity。

什么是Fragment?它和Activity的区别是什么?

为什么只使用默认的构造方法来创建Fragment

Bundle被用来传递数据,为什么不用HashMap代替?

问题转化:为什么Android传递数据的时候不使用HashMap,而使用ArrayMap?

解释一下Android中的Intent(显示&隐式)

广播和EventBus的区别?

1、广播是四大组件之一,EventBus是开源框架。
2、广播不能直接执行耗时操作,如果超过10秒,会导致ANR。
3、广播非常消耗资源,而EventBus非常轻量。
4、广播很容易获取Context和Intent。
5、EventBus切换线程非常方便,只需要修改一下注解就行了。
6、广播可以跨进程,而EventBus不可以。

上一篇 下一篇

猜你喜欢

热点阅读