取经之路就在眼前--面经备战

早过忘川 提交于 2020-02-12 19:32:03

注意: 本文是通过阅读大量的博文以及其他论坛的精彩好文简化版随手录,如有侵权马上删除!

持续更新~~

Android 面经好文赏析记录

简述

但不仅限于Android方面,希望通过此方式把自己的知识台阶一步一步搭起,最后通向offer的大门,知识汇聚,知识分享,开源的力量是无穷尽的,也祝大家早些时日提取自己心满意足的offer.

PS: 本收集属于对其他各大技术论坛大佬精美好文的简短总结

数据库

1.数据库的索引和实现原理

  1. 索引就是一个查找问题,索引是一个排序的数据结构,实现通常是B树及其变种
  2. 优点
    1. 唯一索引,保证每一行数据的唯一性
    2. 加快检索速度
    3. 加速表之间的连接
    4. 减少分组和排序时间
    5. 使用优化隐藏器提高性能
  3. 缺点
    1. 创建和维护耗时
    2. 占据更多的物理空间
    3. 增删改需要动态维护索引
  4. 在什么列上需要创建索引
    1. 经常搜索的列
    2. 主键列 [唯一性]
    3. 经常连接的列 [外键]
    4. 经常需要排序的列
    5. 经常使用在where子句中的列 [条件判断]
  5. 什么列不需要索引
    1. 查询少的列
    2. 只有很少数据值的列
    3. 定义数据类型很大的列 [比如text image bit]
    4. 修改性能大于检索性能的列
  6. 存储结构 [B树,B+树,红黑树]

操作系统

1.操作系统线程和进程的同步机制和通信机制

  1. 同步机制

    1. 临界区

      多线程的串行化访问公共资源,一个线程进入临界区之后其余线程必须在临界区外部等待,等到临界区被释放后,其他线程就可以抢占
      
    2. 互斥量

      互斥对象机制,只有拥有互斥对象的线程才有访问共享资源的权限,互斥对象只有一个,还能实现不同应用程序的线程之间的资源访问
      
    3. 信号量

      允许多个线程同一时刻访问同一资源,但需要限制最大线程数量,类似于操作系统的PV操作
      

      PV操作

      信号量S>0,表示可供使用的资源实体数量
      
      信号量S<0,表示等待使用资源的进程数
      
      相关操作:
      	申请资源
      					S-- [资源实体少一个]
      						if(--S >= 0){线程继续执行}
      						if(--S < 0){该进程阻塞,进入进程调度}
      	释放资源
      					s++ [资源实体多一个]
      						if(++S > 0){进程继续执行}
      						if(++S <= 0){唤醒一个等待进程或者转入进程调度}
      

      关键词解释: 进程调度

      多个进程抢用CPU使用权,操作系统究竟给哪一个进程CPU资源,由操作系统决定,这个决定的方法就是调度策略,理所当然的<进程调度>就是<操作系统使用调度策略给某个具体的进程给予CPU资源的使用权>
      
      调度算法:
      			抢占式
      							进程拥有最大的运行时间,并且这个时间是确定的,进程运行时间大于最大运行时间,该进程就会被挂起,选择调度算法挑选下一个进程运行
      			非抢占式
      							一个进程一直运行到阻塞或者自愿退出
      
    4. 事件

      使用通知操作,生产者和消费者的关系<观察者模式>
      
  2. 通讯机制

    1. 无名管道

      数据单向流动,是在具有亲缘关系之间的进程之间通讯,存在于内存
      
       2.  命名管道
      
      数据双向流动,无关进程之间可以数据交换
      
    2. 消息队列

      消息的链表,存放在内核中,独立于发送和接收线程
      
    3. 信号量

      计数器,实现进程间的互斥和同步,不是存储数据
      
    4. 共享内存

      共享一个给定的存储区,最快的方式,进程直接对内存数据进行读取
      

Java基础

1.Java四种引用

目的: 决定对象的生命周期利用JVM进行垃圾回收

  1. 强引用

    直接创建对象赋值,只要有引用变量就永远不被回收,宁可抛出异常;
    
    中断强引用和某个对象之间的关联,直接就是变量置null
    
  2. 软引用

    内存空间足够,垃圾回收器就不会回收他;
    
    否则对象会被回收,get获取对象就是null
    
    
  3. 弱引用

    只要垃圾回收器需要回收,弱引用必定会被回收
    
  4. 虚引用

    任何时候都有可能会被回收
    

2.Java synchronized的类锁和对象锁

  1. 对象锁

    1. 仅仅有关键字synchronized
    2. 也称实例锁
    3. 防止其他线程同时访问该实例的synchronized方法块
    4. 每个实例拥有自己的监视块
  2. 类锁

  3. static synchronized

  4. 也称全局锁,

  5. 控制类的所有实例的并发访问 [限制都线程该该类的所有实例同时访问jvm中对应的代码块]

  6. 所有实例公用一个监视块

  7. demo

pulbic class Something(){  
    public synchronized void isSyncA(){}  
    public synchronized void isSyncB(){}  
    public static synchronized void cSyncA(){}  
    public static synchronized void cSyncB(){}  
}
  1. 总结

    类锁和对象锁是两个不一样的锁,控制着不同的区域,它们是互不干扰的。同样,线程获得对象锁的同时,也可以获得该类锁,即同时获得两个锁,这是允许的。
    

计算机网络

1.OSI网络模型 [七层]

  1. 物理层

    提供物理连接
    
    关心比特流传输
    
    关心机械,电气,功能和规程特性
    
    IEEE 802.2的电器协议
    
  2. 数据链路层

    PPP SLIP ARPANE协议,隧道通讯协议,思科的CDP协议,地址解析协议
    
    物理寻址
    
    将原比特流转换成逻辑传输线路
    
    
    
  3. 网络层

    ICMP  ARP RARP IP,安全协议AH,路由协议OSPF最短路径优先
    
    外部网关EGP 内部网关IGRP IP/IPV6
    
    控制子网运行
    
    分组传输
    
    路由选择
    
    逻辑编址
    
  4. 传输层

    TCP  UDP
    
    分割数据
    
    保证数据有效到达端
    
  5. 会话层

    SMTP  DNS
    
    SSL TLS安全协议
    
    不同机器上用户之间简历管理会话
    
    
  6. 表示层

    SNMP TELNET
    
    信息的语法语义和之间的关联 [加密解密,转换翻译,压缩解压]
    
  7. 应用层

    HTTP TFTP FTP SMTP应用程序协议
    
  8. img

2.TCP/IP模型 [四层]

  1. 应用层: 传输协议

  2. 传输层: TCP UDP

  3. 网络层: IP ICMP

    IP层传输
    				点到点传输
    				传输IP分组
    
    TCP层传输
    				端到端的传输
    				传输TCP段
    
  4. 物理链路层: 根据需要选择不同的物理链路

设计模式

1.手写Java双重检验的单列模式

  1. 侧重考点就是在如何实现双重验证

    双重验证的逐渐演化过程

    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.考虑到内存模型和写入顺序,最终选择方案

    1. 使用static关键字的单例模式

      class A{
        private static A instance = new A();
        
        private A(){}
        
        public static A getinstance(){
          return instance;
        }
      }
      
    2. 使用同步方法

      public static synchronized A getinstance(){
        if(instance == null){
          instance = new A();
        }
        return instance;
      }
      
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!