Android 面试总结
最近一直在复习Android的知识,希望在寒冬中有一定的自保能力。现在只是总结了一部分,后续还会一直更新,希望我的总结能给大家带来一些帮助。总结的不对的地方希望大家指正,一起进步,让我们在寒冬中抱团取暖。
本文参考
Android 进阶之光
Android开发艺术探索
动脑学院VIP课程
JAVA 基础
Java基本数据类型
Java语言提供了8种基本数据类型。六种数字类型(四个整数型(默认是int 型),两个浮点型(默认是double 型)),一种字符类型,还有一种布尔型。
数据类型 | 大小位 | 字节数 | 默认值 |
---|---|---|---|
byte(字节) | 8 | 1 | 0 |
short(短整型) | 16 | 2 | 0 |
int (整形) | 32 | 4 | 0 |
long (长整形) | 64 | 8 | 0 |
float (单精度) | 32 | 4 | 0.0 |
double (双精度) | 64 | 8 | 0.0 |
char (字符) | 16 | 2 | \u000 |
boolean (布尔) | - | - | flase |
接口的意义
- 重要性:
在Java 语言中,abstract class 和interface 是支持抽象类定义的两种机制。正事因为这两种机制的存在才赋予了Java强大的面向对象能力。 - 简单 规范性:
如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要接口,这些接口不仅告诉开发人员需要实现哪些业务,而且页将命名规范限制住了(入BaseActivity initView();initData();) - 维护 扩展性:
比如你要做一个画板程序,其中有一个画板类,主要负责绘画功能 ,然后你就这样定义了这个类。可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。
如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。 - 安全 严密性:
接口是实现软件松耦合的重要手段,她叙述了系统对外的所有服务,而不实际任何具体的实现细节。这样就比较安全 严密一点。
抽象类的意义
抽象类往往用来表征对问题领域进行分析 设计中得出的抽象概念,是对一系列看上去不同,但本质相同的具体概念的抽象
- 因为抽象类不能实例化对象,所以必须要有子类来实现她之后才能使用,这样就可以把一些具有相同属性和方法的组件进行抽象,这样有利于代码和程序的维护
- 当又有一些具有相似的组件产生时 只需要实现改抽象类就可以获得该抽象类的那些属性和方法。
内部类的作用
- 定义:放在一个类的内部的类我们就叫内部类
- 作用:
- 内部类可以很好的实现隐藏,一般的非内部类,是不允许有private protected权限的,但内部类可以。
- 内部类拥有外围类的所有元素访问权限
- 可以通过内部类来实现多重继承
- 可以避免修改接口而实现同一个类中两种同名方法的调用
父类的静态方法能否被子类重写,为什么?
父类的静态方法 不能被子类重写,重写只使用与实例方法,不能用于静态方法,对于子类和父类有相同方法名的方法 我们称之为隐藏
Java的静态方法形式上可以被重写,但是本质上并不是Java的重写。因为静态方法至于类相关,不予具体的实现相关。声名的是什么类则引用相应类的静态方法(本来静态无需声明,可以直接引用)。并且static 方法不是后期绑定的,他在编译期酒完成了绑定。换句话说。这个方法不会进行多态判断,只与声明有关
Java 集合的继承关系
-
Collection
- set: 无序不重复
- HashSet :无序
- LinkedHashSet:保持顺序
- TreeSet:需要排序
- HashSet :无序
- list: 有序可重复
- ArrayList:查改
- LinkedList:增删
- set: 无序不重复
-
Map
- HashMap:无序
- LinkedMap:保持顺序
- TreeMap:需要排序
- HashMap:无序
HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理
HashMap 和 HashTable 区别
HashCode 作用,如何重载hashCode方法
ArrayList与LinkList区别与联系
哪些情况下的对象会被垃圾回收机制处理掉
- 超出对象的引用域时,这个对象就变成了垃圾
- 没有超出对象的引用作用域,给这个引用赋值为空时,这个引用的对象就变成垃圾。
- 创建匿名对象时,匿名对象用完以后即成垃圾
进程和线程的区别
进程是操作系统的基础,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的基本单位。进程可以被看作程序的实体,同时他也是线程的容器----进阶之光
- 一个程序最少有一个进程,一个进程最少有一个线程,因此线程和进程的关系是被包含与包含的关系
- 线程的划分尺度小于进程,使得多线程程序的并发性高。
- 进程在执行过程中拥有独立的内存,而多个线程共享内存,极大的提高了程序的运行效率
- 线程在执行的过程中与进程还是有区别的。每一个独立的线程有一个程序运行的入口。顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
- 从逻辑角度来看,多线程的意义在于一个程序中多个执行部分可以同时执行。但操作系统没有将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别
Java 中==号和equals 的区别
- ==操作符用来比较基本数据类型变量的时候比较的是值,用来比较引用类型变量时,比较的时引用地址
- equals方法时基类Object的方法,用来比较两个对象是否相同,object类中 equals方法默认时实现==号来比较,实际开发过程中,我们会重写quuals方法,重新定义比较规则
Java Object类方法
GC机制
Java反射机制,Java代理模式
Java泛型
Synchronized原理
Volatile实现原理
方法锁、对象锁、类锁的意义和区别
线程同步的方法:Synchronized、lock、reentrantLock分析
Java锁的种类: 公平锁、乐观锁、互斥锁、分段锁、偏向锁、自旋锁等
ThreadLocal的原理和用法
ThreadPool的用法和示例
wait()和sleep()的区别
- sleep 属于Thread类而wait 属于Object类
- sleep方法导致程序暂停执行指定时间让出cpu该其他线程,但是他的监控状态依然保持,当指定的时间到了又会自动恢复运行状态。而其不会释放对象锁
- wait方法被调用时,程序会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
2 JAVA高级
Java虚拟机,Java运行,Java GC机制(可达性分析法,引用计数法)
Java对象的完整生命周期
JVM内存模型
进程间通信,线程间通信
JVM类加载机制
Java引用类型
设计模式:除常用设计模式之外,特别的,反射机制,代理模式
HTTP协议和HTTPS协议
Socket协议,Socket实现长连接
TCP和UDP协议
- TCP面向连接(如打电话要先拨号建立连接);UDP时无连接的。既发送数据前不需要建立连接
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,既不保证可靠交付
- TCP面向字节流,实际上TCP吧数据看作遗传无连接的字节流;UDP时面向报文的UDP没有拥塞控制,因此网络上出现拥塞不会使主机的发送频率降低(对实时应用很有用,入IP电话,实时视频会议等)
- 每一条TCP连接只能时点对点的;UDP支持1对1,一对多,多对一,一对多和多对多的交互通信
- TCP首部开销20字节;UDP的首部开销小,只有8字节
- TCP的逻辑通信铜到事全双工的可靠信道,UDP则是不可靠通道
HTTP协议中GET和POST的具体实现
序列化和反序列化
线程池的实现原理
数据库基础知识:多表查询、索引、数据库事务
3 Android初级
Application生命周期
Android Activity生命周期
activity的生命周期有onCreate() onStart () onResume() onPuase() onStop()onDestroy() 和onRestart()方法
- Activity 新建时回调用 onCreate()→onStart()→onResume()方法
用户切换到桌面 onPause()→ onStop()
如果Activity采用了透明主题那么onStop方法不会调用
- 用户返回Activity onRestart()→onStart()→onResume()
- 由A Activity 跳到B Activity
调用 A 的 onPuase() B的onCreate()→onStart()→onResume()A的onStop()方法 - 由B返回A 调用
调用B的onPause() A onRestart()→onStart()→onResume() BonStop() onDestroy()
onStart onStop 方法和onResume onPause的区别(√)
- onStart和onStop 是从Activity是否可见这个角度回调的
- onResume 和onPause 是从Activity是否位于前台这个角度回调的
Activity 启动模式
activity 目前有4中启动模式 standard singleTop singleTask singleInstance
- 1.standard 标准模式 也是默认模式 每启动一个Activity都回重新创建一个新的实例 其onCreate onStart onResume 都会调用 同时 谁启动了这个acticity Activity就会运行在启动他的Activity所属在的栈中 (当我们使用ApplicationContext 去启动standard 模式的Activity 时会报错 是因为非Activity类型的Context并没有所谓的任务栈 所以就会出问题)
- 2.singleTop 栈顶复用模式 在这中模式下 如果新的Activity 已经位于任务栈的栈顶那么此Activity 不会被重新创建 同时他的onNewIntent方法会被回调,通过此方法我们可以取出当前请求的信息(应用场景 视频 电商 多次打开同一界面 返回时直接返回列表)
- 3.singleTask:栈内复用模式 这是一种单例模式 这种模式下 只要Activity在一个栈中存在 那么多次启用此Activity都不会重新创建实例 和singleTop一样系统也会回调其onNewIntent方法
- 4.singleTask:栈内复用模式 这是一种单例模式 这种模式下 只要Activity在一个栈中存在 那么多次启用此Activity都不会重新创建实例 和singleTop一样系统也会回调其onNewIntent方法
Android 进程间通信方式
Bundle、文件共享、Messnger、ContentProvider和Socket等。
Android Service、IntentService,Service和组件间通信
Activity的onNewIntent
Fragment的懒加载实现,参数传递与保存
ContentProvider实例详解
BroadcastReceiver使用总结
数据库的操作类型又哪些,如何导入外部数据库?
- 数据库的使用方式有哪些
- openOrCreatrDatabase(String path)
- 继承SqliteOpenHelp 类对数据库及起版本进行管理(onCreate,onUpgrade)当程序调用这个类的方法getWritableDatabase()或者getReadableDatabase()的时候才会打开数据库。如果当时没有数据库文件的时候,系统就会自动生成一个数据库。
- 数据库的操作类型:增删改查 CRED
Android消息机制
Binder机制,共享内存实现原理
Android 事件分发机制
Android 多线程的实现:Thread、HandlerThread、AsyncTask、IntentService、RxJava
ActivityThread工作原理
嵌套滑动实现原理
RecyclerView与ListView(缓存原理,区别联系,优缺点)
View的绘制原理,自定义View,自定义ViewGroup
View、SurfaceView 与 TextureView
主线程Looper.loop为什么不会造成死循环
ViewPager的缓存实现
requestLayout,invalidate,postInvalidate区别与联系
AndroidP新特性
Android两种虚拟机
ADB常用命令
Asset目录与res目录的区别
Android SQLite的使用入门
4 Android 必会
四大组件
Handler 原理
View事件分发
View 绘制流程
多线程
AsyncTask
图片加载
网络请求
内存优化
1,内存泄漏其实就是内存不在GC的掌控之中了 当一个对象不需要使用了 本该被回收时 而有另一个正在使用的对象持有他的引用而导致对象不能回收,就产生了内存泄漏 如果产生了内存泄漏 会造成
- 可用的内存减少 造成堆内存的压力
- 降低应用的性能 比如会频繁的触发GC
- 严重的适合可能会导致内存溢出