目录
- 一:JAVA基础
- 二:计算机网络
- 三:操作系统
- 四:数据库
- 五:设计模式
- 六:Android
-
-
- 1.Android四大组件
- 2.Activity的生命周期
- 3.Activity 的四种启动模式、应用场景
- 4.两个Activity 之间跳转
- 5.启动其他应用的Activity
- 6.ActivityManagerService
- 7.Service的生命周期
- 8.Service的两种启动方式
- 9.IntentService与普通Service的区别
- 10.Service保活
- 11.Broadcast的分类
- 12.Broadcast的两种注册形式
- 13.ContentProvider(内容提供商)
- 14.View工作原理
- 14.Android中的事件传递机制
- 15.ANR问题
- 16.子线程禁止访问UI
- 17.Handler的实现原理
- 18.ThreadLocal(本地线程)
- 19.线程池
- 20内存泄漏和内存溢出
- 21.内存泄漏,java是否存在内存泄漏
- 22.Android中线程
- 23.冷启动与热启动
- 24.Android 系统启动流程
- 25.转发(Forward)和重定向(Redirect)的区别
-
(仅适合面试前复习回顾知识点)
一:JAVA基础
1.四大特性及其含义
- 抽象:对现实世界的事物进行概括,抽象为在计算机虚拟世界中有意义的实体
- 封装:将某事物的属性和行为包装到对象中,构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,并且尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系
- 继承:子类继承父类,不仅可以有父类原有的方法和属性,也可以增加自己的或者重写父类的方法及属性
- 多态:允许不同类的对象对同一消息做出各自的响应
2.状态修饰符
3.JVM和JVM 内存模型
- JVM是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域
- Java 多线程之间是通过共享内存来通信的,每个线程都有自己的本地内存
- 共享变量存放于主内存中,线程会拷贝一份共享变量到本地内存
- volatile 关键字就是给内存模型服务的,用来保证内存可见性和顺序性
4.JVM 内存结构
私有数据区包含:
- 程序计数器: 是当前线程所执行的字节码的行号指示器
- 虚拟机栈: 是Java方法执行的内存模型
- 本地方法栈: 是虚拟机使用到的Native方法服务
共享数据区包含:
1.Java堆:
- 用于存放几乎所有的对象实例和数组;
- 是垃圾收集器管理的主要区域,也被称做“GC;
- 是垃圾收集器管理的主要区域,也被称做“GC堆”;
2.方法区
- 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;
- 用于存放编译期生成的各种字面量和符号引用
5.JVM之GC
- 回收区域:只针对堆、方法区;线程私有区域数据会随线程结束销毁,不用回收
- 分代收集 GC 方法会吧堆划分为新生代、老年代 新生代:
新生代:新建小对象会进入新生代;通过复制算法回收对象
老年代:新建大对象及老对象会进入老年代;通过标记-清除算法回收对象 - 判断一个对象是否可被回收:
引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
可达性分析法:通过一系列被称为『GC Roots』的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 - 回收算法
复制算法:把可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用尽后,把还存活着的对象『复制』到另外一块上面,再将这一块内存空间一次清理掉。
标记-清除算法:首先『标记』出所有需要回收的对象,然后统一『清除』所有被标记的对象。
标记-整理算法:首先『标记』出所有需要回收的对象,然后进行『整理』,使得存活的对象都向一端移动,最后直接清理掉端边界以外的内存。 - 四种引用
强引用:不会被回收
软引用:内存不足时会被回收
弱引用:gc 时会被回收
虚引用:无法通过虚引用得到对象,可以监听对象的回收~
关于G1:
G1是一种服务端应用使用的垃圾收集器,目标是用在多核、大内存的机器上,它在大多数情况下可以实现指定的GC暂停时间,同时还能保持较高的吞吐量。
在G1提出之前,经典的垃圾收集器主要有三种类型:
- 串行收集器
- 并行收集器
- 并发标记清除收集器
这三种收集器分别可以是满足Java应用三种不同的需求:
- 内存占用及并发开销最小化
- 应用吞吐量最大化
- 应用GC暂停时间最小化
但是,上述三种垃圾收集器都有几个共同的问题:
- 所有针对老年代的操作必须扫描整个老年代空间
- 新生代和老年代是独立的连续的内存块,必须先决定年轻代和老年代在虚拟地址空间的位置
G1适用于以下几种应用:
- 可以像CMS收集器一样,允许垃圾收集线程和应用线程并行执行,即需要额外的CPU资源;
- 压缩空闲空间不会延长GC的暂停时间;
- 需要更易预测的GC暂停时间;
- 不需要实现很高的吞吐量。
6.类加载过程,类加载时机,类加载器,双亲委托模型
类加载过程
- 加载:获取类的二进制字节流;生成方法区的运行时存储结构;在内存中生成 Class 对象;
- 验证:确保该 Class 字节流符合虚拟机要求;
- 准备:初始化静态变量;
- 解析:将常量池的符号引用替换为直接引用;
- 初始化:执行静态块代码、类变量赋值;
类加载时机
- 实例化对象
- 调用类的静态方法
- 调用类的静态变量(放入常量池的常量除外)
类加载器
- 引导类加载器 - 没有父类加载器
- 拓展类加载器 - 继承自引导类加载器
- 系统类加载器 - 继承自拓展类加载器
双亲委托模型
- 双亲委派的意思是如果一个类加载器需要加载类,那么首先它会把这个类请求委派给父类加载器去完成,每一层都是如此。一直递归到顶层,当父加载器无法完成这个请求时,子类才会尝试去加载。
- 优点:防止重复加载,父加载器加载过了就没必要加载了;安全,防止篡改核心库类
7.Java中堆和栈
- 栈:主要用来存放基本数据类型和局部变量;当在代码块定义一个变量时会在栈中为这个变量分配内存空间,当超过变量的作用域后这块空间就会被自动释放掉。
- 堆:用来存放运行时创建的对象,比如通过new关键字创建出来的对象和数组;需要由Java虚拟机的自动垃圾回收器来管理。
8.重载和重写
- 重写:重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
- 重载:重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同.
9.volatile 关键字
- 只能用来修饰变量,适用修饰可能被多线程同时访问的变量
- 相当于轻量级的 synchronized,volatitle 能保证有序性(禁用指令重排序)、可见性;后者还能保证原子性
- 变量位于主内存中,每个线程还有自己的工作内存,变量在自己线程的工作内存中有份拷贝,线程直接操作的是这个拷贝
- 被 volatile 修饰的变量改变后会立即同步到主内存,保持变量的可见性。
10.内部类
内部类就是定义在另外一个类里面的类。它隐藏在外部类中,封装性更强,不允许除外部类外的其他类访问它;但它可直接访问外部类的成员。
- 静态内部类是指被声明为static的内部类,可不依赖外部类实例化;而非静态内部类需要通过生成外部类来间接生成
- 静态内部类只能访问外部类的静态成员变量和静态方法,而非静态内部类由于持有对外部类的引用,可以访问外部类的所用成员
11.Java集合
Connection接口:单列集合的根接口,它表示一组对象,这些对象也称为Collection的元素
Map接口:双列集合的根接口,Map集合可以存储一对对象,即会一次性保存两个对象,存在key = value 结构,其最大的特点还是可以通过key 找到对应的value 值。
Connection接口: List: 有序,可重复
-
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高 -
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低 -
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
Connection接口: Set : 无序,唯一
-
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
依赖两个方法:hashCode()和equals() -
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一 -
TreeSet
底层数据结构是红黑树。(唯一,有序)
1 如何保证元素排序的呢?
自然排序
比较器排序
2 如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
Map接口: HashMap、TreeMap、HashTable
- TreeMap是有序的,HashMap和HashTable是无序的。
- Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
- Hashtable是线程安全的,HashMap不是线程安全的。
- HashMap效率较高,Hashtable效率较低。
- Hashtable不允许null值,HashMap允许null值(key和value都允许)
集合的选择
1.单列还是双列?
- 单列:Collection类型的
- 双列;Map类型
2.选择单列后看元素是否唯一
-
是:选择Set集合
看元素是否排序 ?
- 是:TreeSet
- 否:HashSet
-
否: 选择List集合
安全线高低 ?
-
高:Vector
-
低:arrayList 或LinkedList
- 增删多:LinkedList
- 查询多:ArrayList
-
12.HashMap是什么,怎么扩容,put,get元素的过程
- HashMap是使用hash算法,然后基于数组+链表+红黑树来实现的,或许还知道HashMap内部数组的初始长度为16,并且还能自动扩容。当链表长度超过8时,将链表转换为红黑树,这样大大减少了查找时间。(为什么不直接红黑树:平衡需要时间)
- HashMap是无序的,而LinkedHashMap是有序的HashMap,默认为插入顺序,还可以是访问顺序,基本原理是其内部通过Entry维护了一个双向链表,负责维护Map的迭代顺序
- HashMap几个默认值,初始容量为16、填充因子默认为0.75、扩容时容量翻倍。也就是说当HashMap中元素个数超过160.75=12时会把数组的大小扩展为216=32,然后重新计算每个元素在数组中的位置
- 向Hashmap中put元素时,首先判断key是否为空,为空则直接调用putForNullKey(),不为空则计算key的hash值得到该元素在数组中的下标值;如果数组在该位置处没有元素,就直接保存;如果有,还要比较是否存在相同的key,存在的话就覆盖原来key的value,否则将该元素保存在链头,先保存的在链尾
- 从Hashmap中get元素时,计算key的hash值找到在数组中的对应的下标值,返回该key对应的value即可,如果有冲突就遍历该位置链表寻找key相同的元素并返回对应的value
红黑树
红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。
红黑树的约束:
- 根节点是黑色的
- 叶子节点(特指空节点)是黑色的
- 节点可以是红色的或者黑色的
- 每个红色节点的子节点都是黑色的
- 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
红黑树的特点:
速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍
13.各种锁
- 乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
- 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如Java里面的同步原语synchronized关键字的实现就是悲观锁。
- 独享锁:是指该锁一次只能被一个线程所持有。
- 共享锁:是指该锁可被多个线程所持有。
- 可重入锁:又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。
- 公平锁:等待时间最久的线程会优先获得锁,非公平锁无法保证哪个线程获取到锁,synchronized 就是非公平锁
14.Object类的常用方法
- clone():函数的用途是用来另存一个当前存在的对象。
- equale():用于确认两个对象是否相同
- hashCode():用于获取对象的哈希值,这个值的作用是检索
- toString():返回一个String对象,用来标识自己
- getClass():返回一个Class对象
- wait():用于让当前线程失去操作权限,当前线程进入等待序列
- notify():用于随机通知一个持有对象的锁的线程获取操作权限
- notifyAll():用于通知所有持有对象的锁的线程获取操作权限
- wait(long) 和wait(long,int):用于设定下一次获取锁的距离当前释放锁的时间间隔
二:计算机网络
1.网络协议模型
- 物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
- 数据链路层:将比特组装成帧和点到点的传递(帧Frame)
- 网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
- 传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
- 会话层:建立、管理和终止会话(会话协议数据单元SPDU)
- 表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
- 应用层:允许访问OSI环境的手段(应用协议数据单元APDU)
2.TCP 和 UDP 区别
- TCP 连接;可靠;有序;面向字节流;速度慢;较重量;全双工;适用于文件传输、浏览器等
- UDP 无连接;不可靠;无序;面向报文;速度快;轻量;适用于即时通讯、视频通话等
3.TCP如何实现可靠性传输,udp如何实现可靠性传输
- TCP使用确认机制、重传机制、滑动窗口。
- UDP传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
4.三次握手,四次挥手
三次握手:
- A:请求
- B:收到,Over
- A:Over
- A 和 B 两方都要能确保连接,所以需要三次握手。
- 第三次握手可以避免由于客户端延迟的请求连接的请求,使得服务端无故再次建立连接,所以不能两次握手
四次挥手:
- A:结束
- B:稍等片刻,A完成B未必完成
- B:Over
- A:Over
- 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭。
- 先关读,后关写”,一共需要四个阶段:服务器读通道关闭->客户机写通道关闭->客户机读通道关闭->服务器写通道关闭。
5.MAC和IP地址
- 每台主机在出厂时都有一个唯一的MAC地址,但是IP地址的分配是根据网络的拓朴结构,得以保证路由选择方案建立在网络所处的拓扑位置基础而不是设备制造商的基础上
- 使用IP地址更方便数据传输。数据包在这些节点之间的移动都是由ARP协议负责将IP地址映射到MAC地址上来完成的。
6.拥塞控制
对网络中的路由和链路传输进行速度限制,避免网络过载,包含四个过程:慢开始、拥塞避免、快重传和快恢复
- 慢开始:假设当前发送方拥塞窗口cwnd的值为1,而发送窗口swnd等于拥塞窗口cwnd,因此发送方当前只能发送一个数据报文段(