java面试题整理(1)

1.0 整理目的

我们整理面试题总的来目的有三点,
一、是我们看看自己有哪些不足,给自己找一个学习的方向,
二、是通过整理,了解一下自己的技术体系
三、对付面试

2.0 面试题

  1. springmvc和spring-boot区别

Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。
说得更简便一些:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后有发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。

  1. @Autowired的实现原理
  2. Bean的默认作用范围是什么?其他的作用范围?

bean的默认范围是单例 其他的范围分别为多例,session 全局session application

  1. 索引是什么概念有什么作用?MySQL里主要有哪些索引结构?哈希索引和 B+树索引比较?

索引是一种对数据库的一行或多行进行排序的数据结构,科技加快对特定信息的访问速度。mysql主要所有B树索引与hash索引(用在特定的表中) 相对于Btree索引,hash索引的查找速度更快,但是不支持排序和范围查找

  1. Java线程池的原理?线程池有哪些?线程池工厂有哪些线程池类型,及其线程池参数是什么

java线程池的原理是 首先他有一个核心线程池所谓核心线程池就是不销毁的线程池,也就是固定的线程池,当请求来的时候,如果核心线程池有空闲则用核心线程去处理,如果核心线程池没有空闲并且核心线程的数量没有达到最大,就创建一个新的核心线程,核心线程一旦创建就不会销毁,其次他还有一个最大线程池的概念,作用是当核心线程池没有空闲的时候,就新建一个线程去处理任务,处理完任务等待一定时间后没有新的请求进来,那么这个核心线程池之外的新建线程就会被销毁。如果这个任务没有处理完,那么接下来的任务到了,就会继续创建新的线程去处理,新建的线程的数量加上核心线程数加起来不能超过最大线程数。如果新建的线程数到达最大了但是 还有新的任务来了,任务就会进入任务等待队列中去,根据不同的任务等待队列,可以分为不同类型的线程池,任务队列也满了 就会执行相应的处理策略,根据其原理可知 线程池参数分为 核心线程池数量 最大线程池数量,超时时间 时间单位 任务队列类型 对拒绝任务的处理策略
java线程工厂创建的线程池的类型分为:
newSingleThreedExecutor()有多个构造函数
保证只有一个工作线程在处理任务 不会拒绝任务 任务队列是无界阻塞队列,最大线程等于核心线程等于1
newFixedThreedExecutor() 创建固定数量的线程池 和上个不同 他的核心线程数等于最大线程数 队列为无界阻塞队列
newCacheThreedExecutor() 动态的创建线程,线程的生存和毁灭与线程池原理一致,最大的线程数是Integer的最大值,核心线程池大小为0,队列为不存储的阻塞队列
newSheduleThreedExecutor() 定时执行的线程池

  1. hashmap原理,处理哈希冲突用的哪种方法?

hashMap 在jdk1.8之前所用的技术是数组加链表的方式进行的
例如:我们要存储String a = “测试”; a的hash值 是10234;
hashmap的数组结构也叫table 初始值为16 下标最大是15 对应二进制是01111
对hash进行二次哈希的值与01111进行与运算,结果就是这个值存储在数组中的位置,假设是4,
而加入我们另一个hash值计算后的存储位置也是4,那么就会以链表的形式存储起来,这就是数组加链表的结构
处理hash冲突一共有开放定址法和拉链法,hashmap 用的就是拉链法

  1. Java GC机制?GC Roots有哪些?

通过可达性分析算法找到的对象都是不会被回收的对象,其他的对象会被标记一次,可达性分析算法是根据GC Roots 找到引用链上的对象都是不可回收的,
GC roots有哪些呢? 静态变量,常量,栈中的引用或者对象(就是说正在运行的方法中的引用的对象) 本地方法中中的引用或者对象

  1. Java怎么进行垃圾回收的?什么对象会进老年代?垃圾回收算法有哪些?为什么新生代使用复制算法?

8.1 java的垃圾回收采用分代回收算法,
年轻带采用的是复制算法,年轻代分为三个区域
eden from to 对象刚开始进入eden区和一个from区 from和to的大小是一样的
第一次清理后存活的对象进入to 区 然后在来的进图eden区和to区
在清理后存活的进入from区
当eden区满的时候 会进行一次minor GC 也就事年轻代GC
8.2 老年代采用的是标记清理或者标记整理的算法
8.3 什么样的对象会进入到老年代呢?
1. 大对象直接进入老年代 什么样的对象是大对象呢?典型的是很长的字符串和数组
2. 一直存活的对象进入老年代 每经历一次垃圾回收,对象的分代年龄都会加1
待等到分代年龄大于等于默认的或者说我们设置的值,就会进入老年代
3. 动态年龄判定 当eden区的对象年龄相同的对象的数目大于幸存去一半的时候,大于
等于这个年龄的对象就会进入老年代
4. 空间分配担保的时候需要用到老年代
就是说我们在进行年轻代GC的时候,假如一个都没有回收 那么老年代能不能装下?
能装下就回收,装不下呢?就看看虚拟机允不允许进行担保失败,允许的话,
就看进入老年代的历史对象大小的平均值和老年代目前可用大小进行比较,
现在的内存大,就冒险进行一次内存回收,否则就会进行fullGC
8.4 垃圾回收算法有 标记清除 标记整理 复制算法
8.5 新生代存活的对象很少 采用复制算法效率最高

  1. HashMap的时间复杂度?HashMap中Hash冲突是怎么解决的?链表的上一级结构是什么?Java8中的HashMap有什么变化?红黑树需要比较大小才能进行插入,是依据什么进行比较的?其他Hash冲突解决方式?

时间复杂度是O(1),拉链法 解决哈希冲突采用的是拉链法.链表的上一级是数组,Java8中 如果链表的长度大于8就会转换为红黑树进行存储,是根据插入节点的hash值比较的,其他的解决冲突的方式是开放定址法.

  1. hash和B+树的区别?分别应用于什么场景?哪个比较好?

hash的效率比较高时间复杂度是O(1),B+树可以进行范围查询,hash树不可以.分情况如果是范围查询肯定是B+树好多了,hash索引在遇见大量hash值相等的情况下,效率不一定会比B数效率高,扩容的时候效率也不行呀

  1. 项目里有个数据安全的,aes和md5的区别?详细点

aes是对称加密,MD5是单向加密 一般是验证完整性的不用于加密

三 数据库面试题

  1. 为什么MyISAM查询性能好?

好是相对与innodb来说的,innodb支持行级锁事务,并发行好,既然他支持这个,所以维护的东西 就多,索引效率自然比不上myisam 因为Myisam不支持行级锁,所以他查询的时候直接就是表加偏移量,那么innodb呢?他是表到行,定位肯定不如偏移量快,另外他还要维护并发性相对来说myisam快一点

  1. 事务特性(acid)

a 原子性 一系列操作要么全成功 要么全失败 例如:起床洗脸刷牙 要么全部搞定上班去了 要么洗脸这出问题了,时光倒流到你连床还没起的时候;
c 一致性 就是说假如事务是同时发生的,那么无论怎么变化 系统总量是不变的,可以理解为物质守恒定律,就是五个账户每个账户有100块钱,无论你怎么转帐,总钱数还是500
i 隔离性 就是事务串行化,同一时间只有一个事务请求同一数据
d 持久性 事务一旦完成,就不会在变了就存在数据库里了不会回滚了

  1. 隔离级别

读未提交 级别最低 脏读 幻读 不可重复读都会产生
不可重复读 就脏读不会发生
重复读 就幻读会发生
串行化 都不会发生
扩展;
脏读: (都是针对事务) 你发微信消息给我,我看到了 然后你撤回了 就是说实际上你没发 这就是脏读(撤回对应事务的回滚);
不可重复读:字面意思就是说重复度会出问题所以出现了不可以重复读的问题,例如:你发博客说你真美,我看见了.然后我在一次刷新读的时候,你修改了博客说你真丑 两次读的情况不一致,这就是不可重复读
幻读:就是说你在修改数据库表的时候,假设把字段id所有的值都修改为1,这时候我又插入了一条数据id为123.你修改后刷新一看,我擦 我这个值咋没改呢?这就是幻读 好像是幻觉一样 解决方法方法是加表锁
幻读的问题是增加或者删除,不可重复读的场景一般是修改

  1. SQL慢查询的常见优化步骤?

常见的慢查询原因有:1.语句问题 没有命中索引 2.mysql的bug 3.硬件问题 4.锁的问题 5. IO/cpu的争用
解决方法: 使sql命中索引,例如不要使用 select *;不要在数据库中做计算,模糊查询的时候%asd 这样索引不起作用, 注意属性隐式转换的问题
规避大事务,limit的使用问题,不要再order by下用排序 如果排序用升序.注意符合索引的问题

  1. 说下乐观锁,悲观锁,并写出sql实现

乐观锁,假设不会发生数据冲突,只有在更新的时候才加锁(由应用实现)
悲观锁,假设数据肯定会发生冲突,所以读的时候就开始加锁(有数据库实现)
悲观锁的实现select …for update 例如select id from user where id = 2 for update;
乐观锁由应用实现,一般是在数据库表结构中添加version字段 每次更新都加1 然后每次与version 对比,一样就更新 同时加1

  1. TCP协议的三次握手和四次挥手过程?

tcp连接的三握手核心是接收方和发送方各收到一次反馈
tcp断开连接的核心是在确定各收到一次反馈的同时确保不能及时断开的连接能够及时断开(具体过程百度吧)

  1. 用到过哪些rpc框架

京东的jsf 阿里的doubbo

  1. 数据库的jdbc连接过程
  1. 反射加载
  2. 获取连接
  3. 写sql
  4. 执行
  5. commit
  6. 获取结果
  7. 关闭连接
  1. Java web过滤器的生命周期
  1. 首先是servle容器的加载和实例化 就是spring中@Countroller实例化
  2. 调用init方法进行初始化
  3. 服务处理 service() 方法 处理请求 业务逻辑 返回响应 这是一个多线程的方法
  4. 请求终止 destroy() 销毁servlet实例, init和destroy整个生命周期只执行一次

四 其他

  1. ConcurrentHashMap 在Java7和Java8中的区别?为什么Java8并发效率更好?什么情况下用HashMap,什么情况用ConcurrentHashMap?

Java8相比Java7取消了segment结构.每个数组节点就是一个桶,可以接链表也可以接红黑树,链表长度超过8就会转换为红黑树
单线程的情况下可以用红黑树,多线程需要用concurrentHashMap 锁分段技术

  1. 加锁有什么机制?

乐观锁 悲观锁 行锁(排他锁) 表锁(5种)

  1. ThreadLocal?应用场景?

每一个ThreadLocal能够放一个线程级别的变量,可是它本身能够被多个线程共享使用,并且又能够达到线程安全的目的,且绝对线程安全。
作用域是他的坑 因为是线程变量 所以生命周期同线程 对于线程池来说,线程不消失.所以容易使开发者不知道他的作用范围
ThreadLocal尽量使用在一个全局的设计上

  1. 数据库水平切分,垂直切分的设计思路和切分顺序
  2. Redis如何解决key冲突

链地址法 同hashmap

  1. soa和微服务的区别?

SOA 面向服务的架构
微服务架构与SOA相比缺少了ESB(企业服务总线) 微服务是去中心化的
微服务的粒度比SOA更细
SOA中的单个服务可以拆分成多个微服务
微服务中每个服务都有自己的领域模型,SOA中只有一个domain
服务互联编写的技术不同
微服务每个服务有自己的数据库一般为NOSQL SOA一般用同一个数据库,为MYSQL或者Oracle

  1. 单机系统演变为分布式系统,会涉及到哪些技术的调整?请从前面负载到后端详细描述。

数据库: 访问量变大 逐句库变主从.数据库的数据一致性需要得到保证
数据库要从一个数据库,分离为多数据库
服务器:由一个到多个,注意负载均衡, session 系统间的通信(http?rpc?)
避免分布式事务
服务治理?监控?运维?管理中心

  1. 设计一个秒杀系统?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章