注意: 本文是通过阅读大量的博文以及其他论坛的精彩好文简化版随手录,如有侵权马上删除!
持续更新~~
Android 面经好文赏析记录
文章目录
简述
但不仅限于Android方面,希望通过此方式把自己的知识台阶一步一步搭起,最后通向offer的大门,知识汇聚,知识分享,开源的力量是无穷尽的,也祝大家早些时日提取自己心满意足的offer.
PS: 本收集属于对其他各大技术论坛大佬精美好文的简短总结
数据库
1.数据库的索引和实现原理
- 索引就是一个查找问题,索引是一个排序的数据结构,实现通常是B树及其变种
- 优点
- 唯一索引,保证每一行数据的唯一性
- 加快检索速度
- 加速表之间的连接
- 减少分组和排序时间
- 使用优化隐藏器提高性能
- 缺点
- 创建和维护耗时
- 占据更多的物理空间
- 增删改需要动态维护索引
- 在什么列上需要创建索引
- 经常搜索的列
- 主键列 [唯一性]
- 经常连接的列 [外键]
- 经常需要排序的列
- 经常使用在where子句中的列 [条件判断]
- 什么列不需要索引
- 查询少的列
- 只有很少数据值的列
- 定义数据类型很大的列 [比如text image bit]
- 修改性能大于检索性能的列
- 存储结构 [B树,B+树,红黑树]
操作系统
1.操作系统线程和进程的同步机制和通信机制
-
同步机制
-
临界区
多线程的串行化访问公共资源,一个线程进入临界区之后其余线程必须在临界区外部等待,等到临界区被释放后,其他线程就可以抢占
-
互斥量
互斥对象机制,只有拥有互斥对象的线程才有访问共享资源的权限,互斥对象只有一个,还能实现不同应用程序的线程之间的资源访问
-
信号量
允许多个线程同一时刻访问同一资源,但需要限制最大线程数量,类似于操作系统的PV操作
PV操作
信号量S>0,表示可供使用的资源实体数量 信号量S<0,表示等待使用资源的进程数 相关操作: 申请资源 S-- [资源实体少一个] if(--S >= 0){线程继续执行} if(--S < 0){该进程阻塞,进入进程调度} 释放资源 s++ [资源实体多一个] if(++S > 0){进程继续执行} if(++S <= 0){唤醒一个等待进程或者转入进程调度}
关键词解释: 进程调度
多个进程抢用CPU使用权,操作系统究竟给哪一个进程CPU资源,由操作系统决定,这个决定的方法就是调度策略,理所当然的<进程调度>就是<操作系统使用调度策略给某个具体的进程给予CPU资源的使用权> 调度算法: 抢占式 进程拥有最大的运行时间,并且这个时间是确定的,进程运行时间大于最大运行时间,该进程就会被挂起,选择调度算法挑选下一个进程运行 非抢占式 一个进程一直运行到阻塞或者自愿退出
-
事件
使用通知操作,生产者和消费者的关系<观察者模式>
-
-
通讯机制
-
无名管道
数据单向流动,是在具有亲缘关系之间的进程之间通讯,存在于内存
2. 命名管道
数据双向流动,无关进程之间可以数据交换
-
消息队列
消息的链表,存放在内核中,独立于发送和接收线程
-
信号量
计数器,实现进程间的互斥和同步,不是存储数据
-
共享内存
共享一个给定的存储区,最快的方式,进程直接对内存数据进行读取
-
Java基础
1.Java
四种引用
目的: 决定对象的生命周期利用JVM
进行垃圾回收
-
强引用
直接创建对象赋值,只要有引用变量就永远不被回收,宁可抛出异常; 中断强引用和某个对象之间的关联,直接就是变量置null
-
软引用
内存空间足够,垃圾回收器就不会回收他; 否则对象会被回收,get获取对象就是null
-
弱引用
只要垃圾回收器需要回收,弱引用必定会被回收
-
虚引用
任何时候都有可能会被回收
2.Java synchronized
的类锁和对象锁
-
对象锁
- 仅仅有关键字synchronized
- 也称实例锁
- 防止其他线程同时访问该实例的synchronized方法块
- 每个实例拥有自己的监视块
-
类锁
-
static synchronized
-
也称全局锁,
-
控制类的所有实例的并发访问 [限制都线程该该类的所有实例同时访问jvm中对应的代码块]
-
所有实例公用一个监视块
-
demo
pulbic class Something(){
public synchronized void isSyncA(){}
public synchronized void isSyncB(){}
public static synchronized void cSyncA(){}
public static synchronized void cSyncB(){}
}
-
总结
类锁和对象锁是两个不一样的锁,控制着不同的区域,它们是互不干扰的。同样,线程获得对象锁的同时,也可以获得该类锁,即同时获得两个锁,这是允许的。
计算机网络
1.OSI
网络模型 [七层]
-
物理层
提供物理连接 关心比特流传输 关心机械,电气,功能和规程特性 IEEE 802.2的电器协议
-
数据链路层
PPP SLIP ARPANE协议,隧道通讯协议,思科的CDP协议,地址解析协议 物理寻址 将原比特流转换成逻辑传输线路
-
网络层
ICMP ARP RARP IP,安全协议AH,路由协议OSPF最短路径优先 外部网关EGP 内部网关IGRP IP/IPV6 控制子网运行 分组传输 路由选择 逻辑编址
-
传输层
TCP UDP 分割数据 保证数据有效到达端
-
会话层
SMTP DNS SSL TLS安全协议 不同机器上用户之间简历管理会话
-
表示层
SNMP TELNET 信息的语法语义和之间的关联 [加密解密,转换翻译,压缩解压]
-
应用层
HTTP TFTP FTP SMTP应用程序协议
-
2.TCP/IP
模型 [四层]
-
应用层: 传输协议
-
传输层: TCP UDP
-
网络层: IP ICMP
IP层传输 点到点传输 传输IP分组 TCP层传输 端到端的传输 传输TCP段
-
物理链路层: 根据需要选择不同的物理链路
设计模式
1.手写Java双重检验的单列模式
-
侧重考点就是在如何实现双重验证
双重验证的逐渐演化过程
1.单线程适用
缺点:只能适用与单线程
class A{ private A instance; private A(){} public static A getInstance(){ if(instance == null){ instance = new A(); } return instance; } }
2.多线程适用 [适用synchronized方法]
缺点:每次调用方法都需要同步的代价,实际上是只有if语句需要同步
class A{ private A instance; private A(){} public static synchronized A getInstance(){ if(instance == null){ instance = new A(); } return instance; } }
3.降低同步调用代价 [适用synchronized代码块]
缺点: 当两个线程进入if判断之后,有一个线程进入了同步代码块,还有另外一个线程在同步块外,if语句内等待,所以当同步块线程创建完对象之后退出同步块,另一个线程没有再次判断instance是否为null
class A{ private A instance; private A(){} public static A getInstance(){ if(instance == null){ synchronized(A.class){ instance = new A(); } } return instance; } }
4.双重检查 [在创建对象之前再加一个if判断null]
缺点:理想很美好,现实很骨感,不能保证在单处理器和多处理器上顺序执行,因为内存模型写入是无序的
class A{ private A instance; private A(){} public static A getInstance(){ if(instance == null){ synchronized(A.class){ if(instance == null){ instance = new A(); } } } return instance; } }
5.解决无序写入问题 [双重同步代码块]
class A{ private A instance; private A(){} public static A getInstance(){ if(instance == null){ synchronized(A.class){ A tmp = instance; if(tmp == null){ synchronized(A.class){ tmp = new A(); } instance = tmp; } } } return instance; } }
6.优化无序写入
class A{ private A instance; private A(){} public static A getInstance(){ if(instance == null){ synchronized(A.class){ A tmp = instance; if(tmp == null){ synchronized(A.class){ instance = new A(); } } } } return instance; } }
7.考虑到内存模型和写入顺序,最终选择方案
-
使用static关键字的单例模式
class A{ private static A instance = new A(); private A(){} public static A getinstance(){ return instance; } }
-
使用同步方法
public static synchronized A getinstance(){ if(instance == null){ instance = new A(); } return instance; }
-
来源:CSDN
作者:___KG
链接:https://blog.csdn.net/printf123scanf/article/details/104283240