阅读 29

Android 面试总结

最近一直在复习Android的知识,希望在寒冬中有一定的自保能力。现在只是总结了一部分,后续还会一直更新,希望我的总结能给大家带来一些帮助。总结的不对的地方希望大家指正,一起进步,让我们在寒冬中抱团取暖。

本文参考 Android 进阶之光 Android开发艺术探索 动脑学院VIP课程

JAVA 基础

Java基本数据类型

Java语言提供了8种基本数据类型。六种数字类型(四个整数型(默认是int 型),两个浮点型(默认是double 型)),一种字符类型,还有一种布尔型。

数据类型大小位字节数默认值
byte(字节)810
short(短整型)1620
int (整形)3240
long (长整形)6480
float (单精度)3240.0
double (双精度)6480.0
char (字符)162\u000
boolean (布尔)--flase

接口的意义

  • 重要性:

在Java 语言中,abstract class 和interface 是支持抽象类定义的两种机制。正事因为这两种机制的存在才赋予了Java强大的面向对象能力。

  • 简单 规范性:

如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要接口,这些接口不仅告诉开发人员需要实现哪些业务,而且页将命名规范限制住了(入BaseActivity initView();initData();)

  • 维护 扩展性:

比如你要做一个画板程序,其中有一个画板类,主要负责绘画功能 ,然后你就这样定义了这个类。可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。 如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。

  • 安全 严密性:

接口是实现软件松耦合的重要手段,她叙述了系统对外的所有服务,而不实际任何具体的实现细节。这样就比较安全 严密一点。

抽象类的意义

抽象类往往用来表征对问题领域进行分析 设计中得出的抽象概念,是对一系列看上去不同,但本质相同的具体概念的抽象

  • 因为抽象类不能实例化对象,所以必须要有子类来实现她之后才能使用,这样就可以把一些具有相同属性和方法的组件进行抽象,这样有利于代码和程序的维护
  • 当又有一些具有相似的组件产生时 只需要实现改抽象类就可以获得该抽象类的那些属性和方法。

内部类的作用

  • 定义:放在一个类的内部的类我们就叫内部类
  • 作用:
  1. 内部类可以很好的实现隐藏,一般的非内部类,是不允许有private protected权限的,但内部类可以。
  2. 内部类拥有外围类的所有元素访问权限
  3. 可以通过内部类来实现多重继承
  4. 可以避免修改接口而实现同一个类中两种同名方法的调用

父类的静态方法能否被子类重写,为什么?

父类的静态方法 不能被子类重写,重写只使用与实例方法,不能用于静态方法,对于子类和父类有相同方法名的方法 我们称之为隐藏

Java的静态方法形式上可以被重写,但是本质上并不是Java的重写。因为静态方法至于类相关,不予具体的实现相关。声名的是什么类则引用相应类的静态方法(本来静态无需声明,可以直接引用)。并且static 方法不是后期绑定的,他在编译期酒完成了绑定。换句话说。这个方法不会进行多态判断,只与声明有关

Java 集合的继承关系

  • Collection
    • set: 无序不重复
      • HashSet :无序
        • LinkedHashSet:保持顺序
      • TreeSet:需要排序
    • list: 有序可重复
      • ArrayList:查改
      • LinkedList:增删
  • Map
    • HashMap:无序
      • LinkedMap:保持顺序
    • TreeMap:需要排序

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使用总结

数据库的操作类型又哪些,如何导入外部数据库?

  • 数据库的使用方式有哪些
  1. openOrCreatrDatabase(String path)
  2. 继承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
  • 严重的适合可能会导致内存溢出

5 数据结构与算法

栈和队列

数组和链表,自定义一个动态数组

Hash表,及Hash冲突的解决

二叉树

B+ B-树

基础排序算法:重点  快排、归并排序、堆排序(大根堆、小根堆)

快排的优化

二分查找与变种二分查找

哈夫曼树、红黑树

字符串操作,字符串查找,KMP算法

图的BFS、DFS、prim、Dijkstra算法(高阶技能)

经典问题:海量数据的处理  (10亿个数中找出最大的10000个数 TOP K问题)

文章分类
Android
文章标签