技术提升 面试题

一 . 设计模式:
什么是设计模式:就是前人写代码的优秀经验,总结下来了,我们把他拿到项目中使用,让我们的代码更优美,高效,可读性高;
设计模式分类:创建型模式(工厂方法模式,抽象工厂模式,单例模式),结构型模式(代理模式),行为型模式(模板方法模式);
常见的设计模式:单例,工厂,代理,模板;

二 . 什么是单例:一个类只允许创建一个实例
单例有哪些实现方式 ?
      1).饿汉—来就要吃,一来就把对象创建出来
          1.构造方法 私有化
          2.自己创建一个,一来就建
          3.提供一个方法暴露对象
      2).懒汉—
           1.构造方法 私有化
           2.提供一个方法暴露对象,判断是否有,有直接返回,没有创建一个返回;
      3).枚举—
          1.枚举就是限定一个类只有特点个数,能够一一列举出来。我们可以限定这个枚举只有一个值,就是单例;
      4).Map

三 . 工厂模式:
      1).简单工厂:在一个工厂实现多个产品的创建,如果新增产品,需要改造工厂,但是会破坏封闭原则;
      2).工厂方法:为每个产品建一个工厂,如果需要新增产品,新增工厂就好了;
      3).抽象工厂(基本不用):一下创建一个系列的产品
      4).模板方法模式;XxxTmplate extent XxxOperations
      
四 . 代理:
      就是指客户端不直接调用实际的对象,而是通过调用代理的对象,来间接的调用实际的
       1.静态代理:
        没有,可以辅助 理解动态代理;
        
       2.动态代理:
    (如果代理类有接口,用JDK的动态代理,如果没有接口,就用CGLIB的动态代理模式)

五 . Spring底层怎么实现?
        SpringIoc简单工厂+单例+反射
       SringAop底层用到了动态代理模式

六 . SpringIoc怎么实现?.
       IOC/DI=(简单工厂+单例+反射)
       IOC控制翻转,DI依赖注入(包含IOC)
       就是有个工厂,创建出来的对象用到了单例(Map),注入和创建对象用到了反射;

七 . Springaop怎么实现  
       Springaop面向切面编程,底层用到了动态代理模式 ;
(new接口需要加匿名类部类;)
-------------------------------------------------------------------------------------
八 . 数据结构:数据结构就是用来装数据以及数据与之间关系的一种集合
 (1)逻辑结构:数据与数据之间的联系被称为数据的逻辑结构
    集合结构:元素间只有同属一个集合这一种关系 (set,hashset,treeset)
    线性结构:元素间存在一对一 (数组,栈(先进后出),队列(先进先出),线性表(顺序表ArrayList,链表LinkedList))
    树形结构:  元素间存在一对多
    图形结构:  元素间存在多对多
 (2)物理结构:数据的逻辑结构在计算机存储空间的存放形式被称为数据的物理结构
    顺序存储(数组)
    链表(引用)
    索引hash(HashMap)
    
(逻辑结构是面向问题的,而物理结构就是面向计算机的)
------------------------------------------------------------------------------------
九  . 算法:是解决问题步骤的有限集合,通常用某种计算机语言进行伪码描述,就是Java中的一个算法。

十 . 算法五大特征:输入(参数),输出(返回值),有穷性,确定性,可行性

十一 . 算法设计要求:正确性,可读性,健壮性,时间效率高存储低;

十二 . 时间复杂度
时间复杂度:度量算法执行的时间长短
空间复杂度:度量算法所需存储空间的大小

十三 . 常见算法:
    散列算法(hash算法):通过一个key获取唯一value;
    递归 :自己调用自己,要有出口 
    排序 :冒泡排序  -> Arrays.sort()&Collections.sort();
    查找 :哈希查找,一个key,一个map;二分查找->Arrays.search()&Collections.search();
    
-----------------------------------------------------------------------------------------

集合回顾&线程并发数

十四 . 集合回顾
    1.层次结构
     collection:存放一个个对象
        List:有序可重复
            ArrayList:底层是数组,获取比较快,删除和插入效率低
            LinkedList:底层是链表,获取比较慢,删除和插入比较快
            
        set :无序不可重复
            HashSet:无序不可重复
            TreeSet:有序不可重复,通过Key排序
            LinkedHashSet:插入顺序一致
            
     Map       :存放key-value对
        HashTable:线程安全,效率低
        HashMap:线程不安全,效率高
        LInkedHashMap:存放有顺序
        TreeMap:通过Key排序
        ConcurrenthashMap :为了提高效率又想线程安全,就是分段锁,锁住某段其他段可以正常操作
     
    2.面试题
      1).List和set的联系和区别
        联系:List和set都是Collection的子接口,都是用来存放一个个对象的    
        区别:List:有序可重复,set :无序不可重复
        
      2).ArrayList和LinkedList联系和区别
        联系:LinkedList和ArrayList都是List的子接口,都是有序可重复的
        区别:ArrayList:底层是数组,获取比较快,删除和插入效率低
                  LinkedList:底层是链表,获取比较慢,删除和插入比较快
      
      3).想存放一个一个数据,让他们不重复但是有顺序? ——> LinkedHashSet  
      4).想存放一个一个数据,让他们不重复但是可以有顺序? ——> TreeSet
      
      5).HashTable和HashMap的区别和联系?
        联系 :都是Map,都存放Key-value数据
        区别:HashTable的key和value都不能为null,HashMap可以有一个为null,但是value可以有多个null
              HashTable线程安全效率低,HashMap线程不安全效率高
              
      6).想存放一对一对数据,但是有顺序? ——> LinkedHashMap      
      7).想存放一对一对数据,但是可以有顺序? ——> TreeMap
        
    3.    HashMap底层实现原理?
        jdk1.7底层是数组和链表,我们在存放key-value的值时,首先会计算可以的hash值进而获取到要存放的数据索引下标如果没有值直接存放,
        如果有值,看key是否相同,如果相同就覆盖,否则产生hash碰撞,通过链式法,通过链表把两个值都存下来。我们在获取的时候,
        先通过key的hash值找到对应索引位置,如果只有一个值返回,否则就要遍历key获取对应的值
        jdk1.8:底层是数组+链表+红黑树
        当链表长度大于8时,此时链表就要转为红黑树。当红黑树上的节点数量小于6个,会重新把红黑树变成单向链表数据结构。
        
    4.遍历Map(集合)用哪个比较好?——> iterator迭代器

-----------------------------------------------------------------------------------

十五 . 线程强化
    1.基本概念:
        进程:是资源(CPU,内存)分配的最小单位,是程序执行的实例
        线程:是程序执行的最小单位,一个进程可以有多个线程
    
    2.JAVA中实现线程哪些方式:
        四种:继承Thread,实现Runnable,实现Callable,线程池
    
    3.java中new线程之后直接调用run方法,和启动线程执行run方法区别
    区别:直接调用run方法后,当前线程调用run方法,同步执行;
          启动线程执行run方法,新开线程异步执行
十六 . 线程生命周期和状态
    1.线程状态:新建,就绪,运行,阻塞,死亡
    
十七 . 线程安全
    1.什么是线程安全?
        多个线程一起访问一个共享资源的时候,保证各个线程都可以正常且正确的执行,不会出现数据污染等污染情况;
    
    2.锁的基本常识?
        是否要锁资源:悲观和乐观
        没有获取到锁是否要阻塞 :自旋锁
        是否要排队:公平锁,非公平
        同一个线程能否多次获取到同一个锁:可重入,不可重入
        多个线程是否能够共享:共享锁,排他锁
        
    3.synchronized的原理 ?
        synchronized是基于JVM内置锁实现,不需要我们显示枷锁,通过锁标识对象Monitor(监视器锁)实现,
        基于进入与退出Monitor对象实现方法与代码块同步,监听器锁的实现依赖低层操作系统的Mutex lock(互斥锁)实现,
        他是一个重量级锁性能较低。JVM内置锁在1.5版本后就做出了重大优化,减少锁操作的开销。
        
    4.线程并发库的组成?
        悲观锁Lock(显示锁),乐观锁,线程池相关,并发容器类,同步工具类,
    
    5.synchronize和Lock的区别?
    (1)Lock的加锁和解锁都是由java代码实现的,而synchronize的加锁和解锁的过程是由JVM管理的。
    (2)synchronized能锁住类、方法和代码块,而Lock是块范围内的。
    (3)Lock能提高多个线程读操作的效率;    
        
    6.什么是 ThreadLocal?
    ThreadLocal 是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题    
        
---------------------------------------------------------------------------------------------------        
        
十八 . 什么是线程池?
    就是一种池化技术;

十九 . 为什么要用线程池?
    1).会限制最大线程数,防止连接过多而导致系统奔溃
    2).线程可以复用,不要重复的创建或销毁线程,并且创建和销毁是一个耗时间,耗性能的操作,所以可以提高效率,增强用户体验;
    
二十 . 线程池设计原理?        
    当你一个请求进入线程池的时候,如果没有线程就创建一个核心线程,当核心线程数达到最大的时候,就将任务加入等待队列。
    等待队列都满的时候,就创建临时线程,当空闲一定时间后,就按照时间策略自动销毁。如果临时队列都满了的话就开启拒绝策略;

二十一 . 常见的四种线程池?
    CachedThreadPool:可缓存
    FixedThreadPool :固定长度
    SingleThreadPool:单个
    ScheduledThreadPool:可调度

二十二 . 线程池中的最大线程数?
    N*2+1
    N+1

------------------------------------------------------------------------------------------------------------------------------------------------------

二十三 . 什么分布式锁?
    就是在在分布式环境下,保证某个公共资源只能在同一时间被多进程应用的某个进程的某一个线程访问时使用锁。

二十四 . 分布式实现方式?
    数据库,redis, zookeeper 
    基于数据库基本不用,zk或redis要根据项目情况来决定,如果你项目本来就用到zk,就使用zk,否则redis。

二十五 . 为什么需要分布式锁
     1). 单体项目使用传统同步就能解决,  单进程的多个线程都能共享资源在内存中加标识;     
     2)分布式系统-多个进程都能访问到的公共地方上锁(数据库,redis,zk节点),而不是某个进程内存。   
二十六 .  synchronized&lock分布式环境就不行了
      每一个进程都有自己锁。
二十七 .  其他解决方案
      1)数据库悲观锁 select for update
      2) 数据库乐观锁  version
2二十八 . 分布式锁-封装 Lock-lock,unlock,tryLock
      1)数据库-唯一性
      2)redis-Redisson.getRLock
      3)zk-临时顺序节点+watch
二十九  .  分布式锁优化 
       eg 把库存分段存储,为每段建一个锁。  HashTable-ConcurrentHashMap    

-----------------------------------------------------------------------------------------------------------------

三十 . 什么是事务?(事务是保证数据库数据完整的一种机制)
    指作为单个逻辑工作单元执行的一系列操作。要么完全执行,要么不完全执行。

三十一 . 本地事务是什么?
    本地事务也称数据库事务或者传统事务

三十二 . 本地事务特征?
    1).一次事务只连接一个支持事务的数据库(一般是关系型数据库)
    2).事务的执行结果保证ACID
    3).会用到数据库锁

三十三 . 简单说一下 ACID?
    Atomicity  原子性(用到ondo log回滚日志)
    Consistency 一致性(基于其他三个)
    Isolation 隔离性(锁&MVCC)
    Durability  持久性(redo log 重做日志)    

三十四 . 什么是分布式事务?
    同一个事务操作,跨数据源,要保证一致性必须用到分布式事务。

三十五 . 为什么需要分布式事务?
        在一个操作中涉及多个数据库。一般微服务架构中都会涉及

三十六 . 什么是2PC?
    2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段( Prepare phase).提交阶段
    ( commit phase ) , 2是指两个阶段, P是指准备阶段, C是指提交阶段。

三十七 . seata工作流程?
    TC事务协调器,TM事务管理器,RM资源管理器
    1.用户服务的TM向TC申请开启一个全局事务,全局事务创建成功后会生成一个全局唯一的XID,
    2.用户服务的RM向TC注册分支事务,该分支事务在用户服务执行新增用户逻辑,并将其纳入XID对应全局事务的管辖。
    3.用户服务执行分支事务,向用户表插入一条记录。
    4.逻辑执行到远程调用积分服务时(XID在微服务调用链路的,上下文中传播)。积分服务的RM向TC注册分支事务,该分支事务执行增加积分的逻辑,并将其纳入XID对应全局事务的管辖。
    5.积分服务执行分支事务,向积分记录表插入一条记录,执行完毕后,返回用户服务。


三十八 . 

-----------------------------------------------------------------------------------------------------------

三十九 . 为什么要进行JVM调优?
    因为java代码都是运行在JVM中的,但是在部署及应用场景不同时候,继续使用默认的配置就不见得会起到最好的效果,甚至会导致运行效率更差,
    所以需要针对实际的需求来进行JVM调优。

四十 . java的跨平台原理
    Java语言具有一次编译,到处运行的特点。是说编译后的.class可以跨平台运行。


四十一 . 简单说一下类加载子系统
    就是用来加载类系统,java默认提供了三个类加载器,分别加载启动类,扩展类,应用程序类;
     双亲委派:我们的程序本来是要通过应用类加载器来加载,但是它不会优先加载,它会先委托给他的父亲(扩展类加载器),
    它的父亲再委托给启动类加载器,也就是委托给它的两个亲人。所谓就叫双亲委派。有加载规则,优先使用爷爷加载,如果没有加载到再使用它爹加载,
    如果他爹也没有加载到,才到自己加载,如果自己也没有加载到才报ClassNotFountException。在这过程中只要上一级加载到了,下一级就不会加载了。
        1)不让我们轻易覆盖系统提供功能
        2)也要让我们扩展我们功能。覆盖三方

四十二 . JVM组成—内存结构图(运行时数据区)?
    类加载子系统
    运行时数据区
        1). 线程独有方法栈,本地方法栈,程序计数器
        2). 线程共享 堆(新生代(Eden,from,to),老年代) 元空间(方法区)
    执行引擎-垃圾回收


四十三 . JVM垃圾回收
    1).判断对象是否已死
        引用计数算法&可达性分析算法 
    2). 垃圾回收器
        (1).回收算法 标记-清除  复制  标记-整理 分代回收(新生代复制,老年代标记整理)
        (2).回收时间 垃圾回收守护线程不间断触达垃圾回收,线程安全点或安全区
    3).选择垃圾回收器
        新生代
        老年代
                
四十四 . JVM的优化?
    设置内存,选择合适垃圾回收器
(设置:java -jar)

-------------------------------------------------------------------------------------------------------------------
四十五 .     关系型数据库优化方案?


分布式: 不同的服务分散到不同节点. 第一种:web,db 第二种:课程服务,用户服务
集群: 同一个服务通过多台务器来处理. 第一种:db集群 web集群 第二种:课程服务集群 用户服务
集群    

四十六 . 什么分布式系统?
    一个分布式系统是一些独立的网络计算机集合,但是对这个系统的用户来说,系统就像一台网络计算机一样。

四十七 . 什么是CAP理论?
    1).Consistency(一致性): 性能比较低
    一致性是指写操作后的读操作可以读取到最新的数据状态,当数据分布在多个节点上,从任意结点读取到的据都是最新的状态。
    写的时候锁定其他节点
    2).Availability(可用性):
    可用性是指任何操作都可以得到响应结果,且不会出现响应超时或响应错误
    3).Partition tolerance(分区容忍性) 可靠性
    通常分布式系统的各结点部署在不同的子网,这就是网络分区,不可避免的会出现由于网络问题而导致结点之间通信失败,此时仍可对外提供服务,这叫分区容忍性。(多个节点)
    
    定理:任何分布式系统只可同时满足以上二点,没法三者兼顾;


四十八 . 数据库优化
    分库分表:有方向的,垂直(纵向)或者水平(横向)。
最NB:垂直分库(商品库,订单库)---水平分库(商品库1,商品库2...)-水平分表(t_商品表1,t_商品表2)-集群(主从同步&读写分离)
分库分表操作思路:
 1 按照业务进行垂直分库 商品和店铺隔离开来 微服务架构都要这样干
 2 把商品业务进行水平分库 多个商品库服务器
 3 可以对水平分库后每一个数据库服务器进行集群. 多个商品库服务器群
 4 进行垂直分表 把多字段表拆分少量字段表.  每一个库里面宽表进行拆分
 5 进行水平分表 把海量数据表拆分为多个小表  把每一个大表进行拆分

四十九 . Apache ShardingSphere 定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库
    适用于微服务的分布式数据访问基础类库(jar)    

---------------------------------------------------------------------------------------------------------------------------------

五十 . SQL优化小技巧
1.DDL优化 批量插入    
    1)、通过禁用索引来提供导入数据性能 。 去除键,批量插入数据,恢复键,变多次索引维护为一次索引维护
    2)、 关闭唯一校验,变多次唯一校验为一次唯一校验
    3)、修改事务提交方式(导入),变多次事务提交为一次事务提交
2.DML优化 批量插入
    变多次事务提交为一次事务提交
3.DQL优化=select
1) order by优化
    1、多用索引排序
    2、普通结果排序(非索引排序)Filesort
    索引本身就是排序的,所以多使用索引。
 2)or优化
    在两个独立索引上使用or的性能优于 
    1、 or两边都是用索引字段做判断,性能好!!
    2、 or两边,有一边不用,性能差
4.sql语句优化
1 .对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2 .应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
3 .很多时候用 exists 代替 in 是一个好的选择:
4 .尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
5 .任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
---------------------------------------------------------------------------------------------------------------------------------------------
五十一 . 为什么redis要做集群
1)防止单点故障
2)处理高并发-太多请求一台服务器搞不定
3)处理大量数据-太多内存数据一台服务器搞不定

五十二 . 为什么ES需要集群
   1)单点故障
   2)高并发
   3)海量数据


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值