面试总结

Posted ki1616

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试总结相关的知识,希望对你有一定的参考价值。

1、框架

  1、spring

    1、定义

      spring框架是一个为java应用程序提供一个综合,广泛的基础支持的java平台,帮开发者解决一些基础性问题,使开发者能更专注的进行应用的开发,而且它本身也是按照设计模式精心制造的,可以更方便集合spring框架。

    2、使用spring的好处

      1.轻量:spring是轻量的,基本的版本大约2MB

      2.控制反转(IOC):spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖对象们

      3.面向切面的编程(AOP):spring支持面向切面的编程,并且可以把业务逻辑和系统服务分开

      4.容器:spring包含并管理应用中对象的生命周期和配置

      5.MVC框架:spring 的 web 框架是个精心设计的框架,是 web 框架的一个很好的替代品

      6.事务管理:spring提供了一个持续的事务管理接口,可以扩展到下至本地事务,上至全局事务

      7.异常处理:Spring 提 供 方 便 的 API 把 具 体 技 术 相 关 的 异常 ( 比 如 由 JDBC,Hibernate or JDO 抛 出 的 ) 转 化 为一 致 的 unchecked 异 常 

    3、spring事务使用

      在你需要事务的方法上加上@Transactional注解,那么这个方法就加上了事务,如果遇到异常,整个方法中的数据修改的逻辑都会被回滚,避免造成数据的不一致性。

    4、Spring事务有哪几种事务传播行为?(propagation

      支持当前事务的情况:

      1.REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务(spring默认的)

      2.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行

      3.MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常(mandatory:强制)

      不支持当前事务的情况:

      4.REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起(暂停)

      5.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则把当前事务挂起(暂停)

      6.NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常

      其他情况

      7.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套(NESTED)事务来运行;如果当前没有事务,则该取值等价于REQUIRED

    5、spring有哪些隔离级别(isolation)

      1.DEFAULT:底层数据库存储的默认隔离级别,其他级别对应于JDBC隔离级别,eg:MySQL默认采用的是REPEATABLE_READ隔离级别,Oracle默认采用的是READ_COMMITTED隔离级别

      2.READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据,可能导致脏读、幻读或不可重复读

      3.READ_COMMITTED:允许读取并发事务以及提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

      4.REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被事务自己修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生

      5.SERIALIZABLE:最高的隔离级别,所有事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读和幻读。但是这将严重影响程序性能,通常也不会用到

 

 

  2、springmvc

  3、springboot

  4、mybatisPlus

  5、springcloud

    1、定义

      首先要明白微服务,它是一种架构风格,是由一个或者多个服务组成。可以由业务拆分成多个服务,每个服务都是独立部署的,也是可以去耦合的。

      spring cloud是关注全局的微服务协调整理治理框架,它把这些拆分的服务整合并管理起来,为各个服务之间提供服务发现,远程调用,断路器,路由,配置管理等集成服务。

2、数据库

  1、mysql

    1、定义

      MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性

    2、说说你对SQL优化的理解

      1.应当尽量避免 select *, 使用指定具体字段的形式,读取越多数据查询越慢还会增加网络传输的负载

      2.当只要一行数据时使用 limit 1,这样数据库引擎会在找到第一条数据停止搜索

      3.为经常用来搜索字段建立索引

      4.尽量不要让字段出现null值,因为null值在存储的时候不仅需要占用额外的空间,而且在查询的时候还有可能使索引失效

      5.查询时避免索引失效

    2、什么情况索引会失效(模型数空运最快)

      1.首先索引要在使用索引作为查询条件才会生效

      2.模糊查询前置%

      3.数据类型不一样

      4.对索引列使用函数计算

      5.使用is not null

      6.最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配

      7.组合索引:如果全部字段建立索引,使用or不会失效,但是正常业务不可能所有都建立,所有会失效

    3、MyISAM 和 InnoDB的区别

      1.InnoDB支持事务,MyISAM不支持,InnoDB对于每一条sql都默认封装成事务,自动提交,这样会影响速度,所以可以多条sql语句组成一个事务一起执行

      2.InnoDB支持外键,而MySAM不支持

      3.InnoDB支持表锁和行锁,但是myisam只支持表锁

      4.innodb在5.6版本之后支持全文索引,myisam一直支持

      5.InnoDB最后叶子节点是存放时数据,而MySAM是存放地址,最后在通过地址找到数据

    4、Btree 和 Hash 索引的区别

      1.Hash索引只能用等值查询,不能用范围查询,等值查询速度比Btree高;Btree既可以使用等值查询,也可以使用范围查询

    5、四大特性

      1.原子性:一个事务,要么全部执行,要么不全不执行

      2.一致性:一个事务的更新和提交后数据的一致性(例:A向B转账,不可能A扣了钱,B没收到)

      3.隔离性:多个事务之间互相不影响

      4.持久性:一个事务的提交是永久性的,就算服务器重启了,也不影响

    6、隔离级别

      1.读未提交(Read uncommitted):读取到还没提交的数据

      2.读提交(Read committed):同一个事务内,多次读取不一样的数据

      3.可重复读(Repeatable read):同一个事务内,不会读到其他事务对已有的数据的修改

      4.串行化(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

        1.脏读:一个事务读到另外一个事务还没有提交的数据

        2.不可重复读:不可重复读是指一个事务先后读取同一条记录,但两次读取的数据不同

        3.幻读:在一个事务的两次查询中数据笔数不一致(不可重复读和幻读的区别:一个是针对单条记录,侧重于修改,幻读则是针对查询总记录,侧重于新增和删除)

        

 

 

    7、为什么mysql要使用B+Tree,而不是其他的

      1、hash索引格式缺点

        1.需要把所有数据加载到内存,比较浪费内存(可以看下扰动函数)

        2.如果所有的查询时等值查询,那hash确实比较快,但是实际开发中的范围查询更多,所有hash就不太合适了

      2、二叉树或红黑树

        1.无论是二叉树还是红黑树都会因为数的深度而造成 io 的读写次数,从而影响读取效率

      3、B+树

        1.多叉树

        2.节点有序

        3.每一个节点可以存放多条记录

        局部性原理:数据和程序都有聚集成群的倾向,分为空间局部性和时间局部行

        磁盘预读:内存跟磁盘交互的时候要保证每次读取是一个逻辑单位,而这个逻辑单位叫做页,也叫datapage,一般都是4k或者8k,在进行读取的时一般都是4k的整数倍,而 innodb 每次读取默认是16k的数据

    8、使用索引的出现的情况

      1.回表 :通过查询的id,再去查找整行数据(例:select * )

      2.索引覆盖:直接通过 id 查找数据(例:select id)

      3.最左原则:聚合索引必须从最左开始

      4.索引下推(mysql5.6后):查找一个有聚合索引的 (name,age),原本是直接从磁盘拿出所有的有 name 的,然后在内存中筛选有 age的,索引下推则是在磁盘中直接 拿到 name, 然后在根据 name 筛选出 age,因为数据是聚集存放的,而且整体的io次数减小,还能提升性能

    9、mysql的索引一般有几层?

      一般的情况下,3到4层就足以千万级别的表查询了

    10、创建索引的字段是长了好还是短了好?

      短了好,因为在层数不变的情况下,可以存储更多的数据量

    11、我们在创建表的时候是用代理主键还是自然主键好?

      尽量使用代理主键,自然主键的维护成本比较高

    12、主键设置好之后,要不要自增?

      在满足业务的情况下,可以使用自增,不自增会增加索引的维护成本

    13、在分布式应用场景中,自增id还适用吗?

      雪花算法,snowflack,自定义自增id生成器

    14、聚簇索引和非聚簇索引

      1.聚簇索引:数据跟索引是否是聚集储存的(innodb的主键索引就是聚簇索引,必须要包含一个主键列的:key,如果创建表的时候设置了主键,那么key就是主键,如果没有设置,那么key就是唯一键,如果唯一键也没有,那么就是key就是6字节的rowid)

      2.非聚簇索引:myisam都是非聚簇索引,innodb的二级索引(普通索引,辅助索引)

    15、建立索引的必要条件

      1.对查询频次较高, 且数据量比较大的表, 建立索引

      2.唯一性强的

      3.需要作为其他表外键的字段

      4.排序字段上, 因为排序效率低, 添加索引能提高查询效率

      5.where条件后面可以考虑建立组合索引

 

9、CRC32(循环冗余校验规则)

 

 

  2、redis

    1、定义

      redis是一个key-value类型的内存数据库,数据是在内存中操作的,定期通过异步操作吧数据库数据flush到硬盘上保存

    2、常用数据类型

      1.String(常用的字符串)

      2.Hash(适合存储对象)

      3.List(可以用来做消息队列)

      4.Set(因为它是无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。应用场景:列表功能的自动排重(共同好友),也可用来求交集、并集、差集等)

      5.Sorted Set(有序集合的成员是唯一的,但分数(score)却可以重复。应用场景:排行榜)

    3、线程是否安全

      1.从内部来讲:因为是串行的,所以安全

      2.从外部来讲:可能无法保障,要自己在程序里做处理(可以使用Lua去实现)

    4、常见问题

      1、缓存雪崩

        1、定义

        由于大量热点key同时失效,导致所有的请求直接打到数据库上

        2、解决方案

        1.随机初始化失效时间(这样就不会造成全部同时失效)

        2.不设置失效时间(不太友好)

        3.如果是redis集群,可以把热点key分散在各个节点上

        4.设置定时任务,快过期的时候更新一下

      2、缓存穿透

        1、定义

        通过不存在的key去请求,然后redis上没有,就会打到数据库上

        2、解决方案

        1.不管是否是null值,都缓存到redis上

        2.做筛选过滤,对于不存在的直接return

        3.把那个故意请求的ip拉黑

        4.布隆过滤器

      3、缓存击穿

        1、定义

        缓存热点key忽然失效

        2、解决方案

        1.设置缓存不失效

        2.分布式锁(单体可以使用互斥锁:让只有一个请求抢到锁,去数据库请求数据,其他等待,等后面这个拿到数据缓存到redis上,后面直接到redis去数据)

        

3、消息队列

4、设计模式

5、java基础

  1、集合

  2、多线程

  3、反射

6、JVM

7、项目

 

 

网易面试——笔试面试题总结

 目录

 1、atomicInteger

2、高并发处理之接口限流

3、【RabbitMQ】三种Exchange模式——订阅、路由、通配符模式

以上是关于面试总结的主要内容,如果未能解决你的问题,请参考以下文章

Android面试题基础集锦总结《二》

Android面试题基础集锦总结《二》

网易面试总结——面试案例9~面试案例12

个人总结工作两年的 JAVA 程序员面试总结

Java 面试总结 —— 面试常问的关键字总结

263网络通信面试总结