10k-15k java面试题
很多小伙伴应该都是刚毕业出来或者培训机构培训了2年左右的啊 这样刚开始就是接触到中小型企业的公司啦,我把我的面试经验分享给大家吧!
1.请你说说static关键字的用处?
1.修饰变量属于静态变量,通过类名.可以引用 属于实例之间共享的。
2.修饰方法,可以通过类名.方法直接调用。方法中不能引用非静态资源 因为被static修的 类加载的时候就已经创建
3.修饰类说明这是一个静态内部类 且只能修饰一个内部类
2.请你说说final关键字的用处?
1.修饰过的类不可被继承,其该类的方法会被隐式定制为final方法
2.修饰过的方法不可以被重写
3.修饰变量表示常量,只能被赋值一次 赋值后不可改变
4.修饰基本类型值不可改,修饰引用数据类型地址不可改
3.成员变量与局部变量
1.成员变量是在方法之外,保存在推空间,随着对象的创建而创建销毁而销毁
2.局部变量在方法体,是在栈空间,随着方法的调用而创建方法的结束而销毁
3.成员变量在初始化时会有默认值,局部变量在初始化时是没有默认值的必须声明赋值才可以 被使用
4.反射是什么?以及用到了哪些框架
1.反射能够获取任意类任意对象的属性和方法,动态加载类提高代码的灵活度,但是它的性能 要比直接的java代码慢很多同时也增加了类的安全隐患
2.jdbc中链接数据库时就是通过反射加载数据库的驱动程序
3.spring中的ioc所创建的对象以及aop都与反射有关
5.线程创建的几种方式?线程池的7大参数 以及如何设置这些参数
1.4种方式创建线程:继承thread类,实现runable接口,callable和future创建,线程池创建
2.7大参数:1.corePoolSize 核心线程数(当等待队列不满的时候只调用核心线程) 2.maximumPoolSize 最大线程数(当等待队列满了的时候,会激活更多的线程) 3.keepAliveTime 新激活的线程在没有任务的情况下的存活时间 4.TimeUnit:keepAliveTime的单位 5.BlockingQueue:阻塞队列,当核心线程满了 请求会在队列中等待 6.ThreadFactory:创建线程的工厂,使用默认的Executors.defaultThreadFactory()既可以 7.RejectedExecutionHandler:拒绝策略,当线程池的最大承载时的拒绝策略。
6.线程池的运行过程?
1.等待任务请求
2.当线程添加了一个任务请求时,首先判断正在运行的线程是否小于核心线程数小于则马上 创建这个线程执行任务。 正在运行的线程大于或者等于核心线程数 则将任务放入线程队列 如果线程队列满了且正在运行的数量小于最大线程数则执行饱和策略和拒绝策略来执行 3.当一个线程任务完成时,则去任务队列取出下一个队列运行 4.当一个线程没有任务可执行,且超过了一定的闲置超时时间,则判断当前运行的线程数是 否大于核心线程数 则线程会被停止
5.线程任务所有完成后最终会收缩到核心线程数的大小
7.mybatis的好处与坏处
相对于jdbc mybatis能减少大量重复代码,做到了sql语句与代码的分离,可读性高
缺点的话sql语句的编写工作量较大,尤其是多表查询代码量大对于开发人员编写sql有
一定的要求。sql语句依赖数据库 导致数据库移植性差不能随意切换数据库。
8.请你说说mybatis的一级二级缓存
一级缓存:默认的情况下一级缓存是打开的,当一个sqlsession对象去调用查询操作时
它会把第一次查到的数据记录在缓存中,当下次在执行相同的操作时mybatis不会去
数据库查询,而是去缓存中把数据取出来。如果执行了增删改并commit时就会清空
一级缓存跟二级缓存。
二级缓存:指的就是同一个namespace下的mapper,二级缓存中也有一个map结构
这个区域就是一级缓存,key是由sql语句加条件等信息组成一个唯一值。缓存中的
value就是查询出的结果对象
9.mybatisPlus有什么作用?相比mybatis有什么好处与缺点?
相对于mybatis它的代码量更少,mybatisplus支持lambda形式调用,还提供了分页插件
代码生成器等
缺点的话我认为它的可读性很差,如果复杂的查询当你调用大量的eq like等关键字时
拼接起来的代码可读性会很差 不利于后期的维护 小型项目快速开发比较适合plus
10.Spring ioc原理实现 一级aop的原理实现 实际开发中aop是在什么场景?
ioc控制反转 将我们的对象控制权转交给spring,由spring去管理这些bean
1.首先spring会去读取我们的配置文件所定义好的bean信息 或者是扫描我们类上所相关 的键注解例如:Component service 等等
2.接着判断推断构造方法去创建对象
3.这个时候创建好的对象是普通对象,里面的属性是没有赋值的
4.此时spring进行依赖注入,扫描类当中的注解例如:PostConstruct Autowired Resource等等 去给属性赋值
5.接着会去执行aop所定义的方法 如没有或者执行完毕 则会将对象放入map单例池中
6.创建完成bean对象
7.销毁方法
spring aop的理解:也就是说在不改变源代码的情况下可以进行增强
1.如果在xml中定义的面向切面标签,或者开启了切面注解,则会在spring中注册一个自动代
理创建的BeanDeafination
2.得到所有的目标类,通知方法。增强器,在判断目标是否已经继承。判断jdk动态代理
或者cglib代理
spring的设计模式:
1.工厂设计模式:spring使用工厂模式创建bean对象
2.代理设计模式:aop功能的实现
3.单例设计模式:spring中的bean默认都是单例的
4.模板方法模式:spring中的jdbcTemplate 等以template结尾对数据库操作的类都是模板模式
5.包装容器设计模式:这种模式可以让我们根据客户的需求能够动态切换不同的数据库
6.观察者模式:spring事件驱动模型就是观察者模式很经典的一个应用。
7.适配器模式:spring aop的增强或通知 使用到了适配器模式,mvc中也用到了适配器模式
springbean的作用域:
1. 单例模式 2.每次getbean都会产生新的对象 3.每次请求都会产生一个对象 4.session 5.globalsession
spring单例模式的bean线程是否安全?
不安全 因为每个线程都共享一个实例。如果共享的实例是无状态的bean,例如controller。
service 无状态的bean。不存在操作数据,而在于调用方法。可以理解为是安全的
spring中bean的生命周期
1.通过反射创建对象
2.进行di注入
3.执行init方法 初始化bean
4.调用bean
5.销毁方法
11.mysql存储引擎
1.InnoDB引擎:具备外键支持功能的事务存储引擎
2.MyISAM引擎:主要的非事务存储引擎
3.两者的不同:innodb支持事务 外键 行锁。myisam不支持外键 事务 表锁
12.mysql如何优化
1.尽量少排序 非必要的情况下尽量少排序 减少cpu的计算
2.避免select * 因为这个*会导致全盘扫描
3.尽量用join代替子查询
4.避免类型转换
5.避免用or 同一字段推荐in 不同字段推荐union
13.mysql三范式
1.第一范式:任何一张表都应该有主键,每一个字段原子性不可再分
2.第二范式:建立在第一范式的情况下非住建字段必须完全依赖主键字段,在符合主键的情况
下必须完全依赖而不是部分依赖
3.第三范式:建立在第二范式的情况下,表中所有字段不能依赖于其它非主键字段
14.mysql的事务
1.原子性:事务要嘛全部提交要嘛全部回滚
2.一致性:数据从一种状态变成一种合法的状态
3.隔离性:一个事务的执行不受其它事务的干扰
4.持久性:事务一旦提交,对数据库中的数据改变是永久的
15.事务并发的问题
1.脏写:事务A修改了事务B未提交的数据
2.脏读:事务A读取了事务B未提交的数据
3.不可重复读:事务A与B读取了表中的同一条数据,当A修改了并提交B再去读发生变化
4.幻读:事务A与事务B读取了表中的数据,当A添加了数据并提交B在读发现多了数据
16.事务的隔离级别
1.读未提交:解决脏写
2.读已提交:解决脏写,脏读
3.可重复读:解决脏写 脏读 不可重复读
4.可串行化:读写都会锁住整张表,效率会很慢
17.索引在什么情况下会消失?
1.模糊查询,当%在前面的时候会导致索引失效
2.复合索引,只有左侧的字段不会失效
3.当字段参加了运算也会导致索引失效
4.在where当中索引列使用了函数也会导致索引失效
5.使用or的时候也会实现,使用or的时候只有两边的条件都有索引才不会失效
18.请你说说redis的持久化方式?
1.RDB(半持久化) 通过一个fork的子进程创建一个临时文件,把临时文件替换成持久化文件
根据规定的多长有效时间将多少key保存在磁盘中
数据都保存在dump.rdb文件中,当redis启动时就会加载文件中的数据
它的数据恢复可以直接复制一份dump.rdb文件出来,到时候直接把复制出来的文件重命名为
dump.rdb在启动redis即可
优点:
1.适合大规模的数据恢复。
2.对数据完整性和一致性要求不高更适合使用、
3.节省磁盘空间
4.恢复速度快,效率高
缺点:可能会在最后一次持久化后造成数据丢失
2.AOF(完全持久化)默认不开启 AOF开启时redis会加载AOF不会加载RDB
以日志的形式来记录每个写操作(将redis执行过的所有写指令记录下来)读操作不记录。
只许追加文件但不可以改写文件,redis启动时会读取该文件重新构建数据。换之而言
redis只要重启就会根据日志中的内容将记录的写指令从前到后依次执行完成数据恢复
优点:如果aof文件遇到损坏 可以通过redis-check-aof--fix appendonly.aof进行恢复
缺点:比起rdb文件占用更多的磁盘空间,备份的恢复速度要慢,每次进行写的操作
都会同步日志文件
19.redis的主从复制 (也就是一主多从,一台主机多台从机)
Master/slaver机制,Master为主,Slaver以读为主
当从机连接上主机后,从机像主机发送请求获取数据进行同步
主机接到同步请求后会把数据进行持久化生成rdb文件,再把rdb文件发送给从机。从机再读取
每次主机进行写操作后都会和从机进行数据同步
1.读写分离(也就是说主机做写操作,从机只能读)
2.容灾快速恢复
3.当一个从服务器宕机在从新恢复后不在是从机它又会重新的变成个体.当它在重新连接主机
时主机中的数据还是能够完全读取到
4.当主机宕机后,从机不会发生变化
主从复制的三种情况:
、 1.一主二仆:一台主机下包括多台从机
2.薪火相传:从机下也可以有从机(就相当于一台主机下划分一些从机,然后那些从机的下
面又有多台从机)
3.反客为主:(当主机宕机时,可以让某个从机担任为主机)
20.什么是redis的哨兵模式?
哨兵模式也就是能实现反客为主,当某个主机宕机时从机自动变为主机
也就是说派一个哨兵去监听这个主机下的所有从机。当主机发生宕机时
哨兵会让优先级高的从机变为主机。当发生改变后原来的主机恢复了之后会变
成从机。新上任的从机将会变成主机
21.如何解决缓存穿透问题?
当我们用户访问浏览器,浏览器在请求web服务时 服务器压力突然变大了,会导致redis
命中率降低 从而导致一直查询数据库 给数据库造成了很大的压力 造成数据库崩溃
正常的操作应该是先查缓存,如果查不到在去查数据库 数据库找到后在把数据放入缓存
解决方案:
1.对空值缓存(查询返回的数据为空 仍然把空结果进行缓存,设置空结果过期时间)
2.设置可访问的名单(使用bitmaps类型定义可访问的名单,如果访问id不在bitmaps中
进行拦截,不允许访问)
3.采用布隆过滤器
4.进行实时监控
22.如何解决缓存击穿问题?
也就是说redis中某个key它过期了,但是在它过期之后有大量访问使用这个key。
这样就会导致查询数据库,最终造成数据库压力变大、
解决方案:
1.预先设置热门数据:比如说网页上的热点新闻,在访问量高峰之前加长这个key的过期时间
2.实施调整:现场监控热门数据,实施调整key的过期时长
3.使用锁
23.如何解决缓存雪崩问题?、
在极少的时间段,查询大量key的时候产生集中过期情况。这个时候数据库就会增大压力
造成服务器崩溃问题。
解决方案:
1.构建多级缓存架构:加个nginx + 其他缓存等等
2.使用锁或者队列:保证不会有同一时间大量的线程对数据库进行读写但是不适合用于并发
3.设置过期标志更新缓存:就是提前预知某个key的过期并且更新缓存
4.将缓存失效时间分散开:不让大量的key在同一时间出现过期,key到期之后设置随时值
比如1-5分钟随机,这样就避免了集体key过期
24.你是如何保证redis和mysql数据一致性的
1.先删除缓存,在更新数据库 然后睡眠一会 在进行双删 延迟双删策略
模拟场景:线程A进行读取,线程B进行修改。假设线程B抢的时间片比A要多,B先执行
这样B就会先删除缓存,然后A读取不到缓存 就会去数据库查询到B修改前的脏数据
这样就会导致A查询完的脏数据又重新添加回了redis当中,B最后再去修改数据库的值的话
这样就会发生数据不一致。延时双删就是在B删除完缓存后 再进行数据库的修改 修改完之后
进入休眠状态(这样确保A线程读取完了脏数据)最后再一次删除缓存。这样就确保了数据的
一致性!
10k-15k java面试题相关推荐
- 史上最全阿里 Java 面试题总结及答案
史上最全阿里 Java 面试题总结及答案 qq_35151346 于 2019-08-06 13:26:53 发布 33740 收藏 817 分类专栏: 面试题 文章标签: 阿里巴巴 面试题 答案 j ...
- java 实体类包含list 怎么取值_2019 最新 500 道 Java 面试题
2015 年,因为工作岗位的变动,开始负责给集团招聘一些技术人员,出于对公司的负责,也为了更好的胜任技术经理的职位,在面试的这件事上,我做了大量的"功课",首先我研究了几乎所有大厂 ...
- Java面试题总结-Day4
<?xml version="1.0" encoding="utf-8"?> Java面试题总结-Day4 Java面试题总结-Day4 Table ...
- 用友公司Java面试题(含答案)
为什么80%的码农都做不了架构师?>>> 用友公司Java面试题(含答案) 1.Hashtable和HashMap有什么区别? a.Hashtable是继承自陈旧的Dict ...
- java面试题2019 答案
Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 Stri ...
- Java类加载机制详解【java面试题】
Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...
- Java面试题汇总及答案2021最新(序列化含答案)
Java面试题汇总及答案2021最新(序列化含答案) 为大家整理了2021最新的Java面试题及答案下载,这套Java面试题总汇已经汇总了Java基础面试到高级Java面试题,几乎涵盖了作为一个Jav ...
- Java面试题汇总及答案2021最新(ioNio)
Java面试题汇总及答案2021最新(io&Nio) 最近给大家整理了一批Java关于io和nio的面试题一共15题,是20201最新时间整理的,并且都含答案打包下载. 适宜阅读人群 需要面试 ...
- Java面试题汇总2021最新(集合泛型含答案下载)
Java面试题及答案2021最新24题(集合&泛型) 最近给大家整理了一批Java面试题一共24题,主要是搜集的Java集合&泛型这块的,是20201最新时间整理的,并且都含答案打包下 ...
- Java面试题及答案整理(2022年140道)持续更新
发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~博主已将这些面试题整理到一个网站上,每天更新 Java 面试题,目前有 1万多道 Jav ...
最新文章
- HDOJ 1175 连连看 DFS
- 学习笔记Hadoop(九)—— Hadoop基础操作(1)—— Hadoop安全模式、Hadoop集群基本信息
- 51nod 1004 【快速幂】
- linux将文件的第二列求和,awk实现第一列相乘,第二列求和,并相加 - 米扑博客...
- Python Cheat Sheet 中文版
- Django2.1.1与xadmin0.6.0遇到的坑
- NeatUpload的安装使用 文件上传。可传大文件。
- win10 SVN 图标不显示的解决办法
- 根据sam文件计算reads的GC含量
- php开发我的世界插件,[搬运插件] [服务端插件] [管理]PlotMe——地皮插件[1.2.5-1.10.2]...
- YOLO v2 学习与研究
- 阿波罗服务器的投资项目,阿波罗未来产业城调整规划范围 将重点打造“两轴一片”空间格局...
- 小程序转uniapp——disabled
- Android第三方SDK使用分析
- 视频播放性能优化-视频MOOV前置
- android教案,android教学教案.doc
- Thinkphp 表名下滑杠处理
- would dispatch back to the current handler URL [/student] again. Check your ViewResolver setup
- 《塔木德智慧全书》(之三)
- Java JDK 8u221开发环境搭建