java面试题(个人总结,仅供参考)

1.Spring的相互依赖;

答:AB两个类相互依赖,就是A中有B,B中有A,在A创建的时候,在初始化之后,会生成一个A对应的ObjectFactory,这时候将ObjectFactory放入缓存中,然后在依赖注入的时候扫描到B,创建B的实例,然后生成一个B对应的ObjectFactory,将之存入到缓存中,此时B依赖A,将A 的ObjectFactory给B,就解决了相互依赖的问题

2.sql的联合索引,如果AB两个字段加了索引,那么我select …where B=?;请问用到了索引了么?
答:联合索引中有个最左匹配原则,在AB两列都加了索引的情况下,优先按照A列来进行排序,在A相同的情况下才会对B进行排序,如题中例子,不会用到B的索引;

3.两表联合查询,left jion … on … ,请问on后面的条件与where后面的条件有什么区别?
答:放在on后面的条件,不管是否为真,都会返回左面表的全部数据,对右表来说,条件为假的时候,左表中会用null来填充;where后面的条件则是生成临时表之后的过滤条件;
4.线程池,自定义线程池,叙述线程池怎么去执行任务?
答:创建一个自定义的线程池,会有七个参数,核心线程数,队列,最大线程数等,当一个任务进来的时候,核心线程去处理,当核心线程全部在执行任务的时候,再进来任务就会将任务储存在队列中,然后核心线程会来执行队列中的任务,当队列满了之后,再进来任务,就会创建新的线程来处理任务,当线程达到最大线程数之后,再进来任务,就会采取饱和策略;
5.redis的作用和运用场景
答:可以做分布式锁和缓存,在高并发时候,用redis做分布式锁,可以让线程一个一个进来,适用场景秒杀任务时
做缓存,在高频访问数据库的时候,可以redis来做缓存;
6.redis的使用场景?
7.怎么做一个秒杀的功能场景?
答:用redis分布式锁,就是redis的setnx()方法,在一个线程进来之后,调用了setnx方法,在删掉这个key之前别的线程不能再次set这个key,直到这个key被删除,
8.synchronize和lock的区别?
前者是一个java的关键字,而lock是一个接口;前者线程执行完或者发生异常(jvm释放)会主动释放锁资源,而后者需要手动解锁,前者如果获得线程的锁发生阻塞,那么其他线程会一直等待;后者如果发生阻塞,那么其他线程会尝试获取锁资源,不会一直等待
9.Springboot的优点?
自动配置和简化配置,内置服务器Tomcat,提供各种stater来简化maven的配置
10.SpringBoot与spring的区别?
也就是优点
11.maven的生命周期?
clean-default-site;clean是构建之前清理项目-default是核心部分(编译,测试,打包,部署等)-site是生成站点
12.SpringBoot的自动装配原理?
首先在类启动时候,在@SpringbootApplcation注解里面,有一个@EnableAutoConfiguration:这个注解表明启动自动装配,里面包含两个比较重要的注解@AutoConfigurationPackage和@Import。@import是自动装配的核心,下面有一个selectImport的方法,会去找到MATE-INF/spring.factoriese文件,将里面的jar包全部放在容器中
13.叙述一下你做过的项目中对你印象最深的项目?
挑一个项目进行解说
14.说一下什么是kafka?
消息中间件,一般用来异步解耦和流量削峰
15.说一下你对分布式的理解?
将一个系统分成多个系统,就像是使用一个系统一样,基于rpc(远程调用)实现,dubbo就是一个rpc框架
16.说一下什么是双亲委派机制?
在我们创建一个类,类的加载会上报给应用类加载器,然后应用类加载器又上报给扩展类加载器,扩展类加载器会上报给启动类加载器,如果启动类加载器的路径下面没有该类,就会报给扩展类加载器进行加载,扩展类加载器再报给应用类加载器进行加载
****17.说一下linux是怎么部署应用的?

18.说一说都用过那些中间件?
19.说一说maven的常用命令?**
20.说一下什么叫断言,常用的断言有哪些?**
21.说一说什么是乐观锁与悲观锁
乐观锁就是在线程去更新数据的是时候就会认为数据没有被修改过,然后读取数据和旧数据进行比较,如果有修改,就重新读取数据,在比较然后修改;
悲观锁就在区更新的时候就加锁,只能自己使用,然后直接读取然后修改;

23.mysql的存储引擎有哪些
答:InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。
24.常见的索引类型有哪些?
位图索引:位图索引适用于字段值为可枚举的有限个数值的情况
哈希索引:哈希索引适用于等值检索,通过一次哈希计算即可定位数据的位置。
Btree索引:有序平衡N叉树, 每个节点有N个键值和N+1个指针, 指向N+1个子节点
倒排索引(也叫反向索引):
25.行锁和表锁有什么区别?
答:表锁:
一般给表加锁的种类有读锁和写锁;释放锁(unlock)
读锁(lock tables 表名 read):加上该说锁,自己和其他线程都不能修改,只能读取
写锁:(lock tables 表名 write):加上该锁之后,只有自己可以读写,其他线程不能进行读写
行锁:正在修改的这行对其他线程不可见,只有提交事物之后才能够看见,并且别的线程不能修改该线程正在操作的行,但是不影响其他线程修改该线程以外的数据。

26.redis的使用场景?上面说过了

27.分布式锁怎么实现?上面说过

28.redis是单线程吗?
答:是单线程,正因为是单线程,所以才可以用来做分布式锁
29.创建线程的方法有哪些?
答:继承thread和实现runnable接口与实现Callable接口或者使用线程池

30.sleep和wait有什么区别?
答:都是让线程阻塞的方法,sleep是线程的静态方法,添加参数可以控制线程睡眠的时间,而wait是Object的方法,需要notify方法来唤醒线程,sleep不会释放锁资源,需要到睡眠时间结束或者通过调用interrupt()方法来唤醒休眠线程;而wait是让当前线程进入等待状态,在别的线程调用notify或者notifyall的时候,会让当前线程进入就绪状态
31.线程的start方法和run方法有什么作用?
答:线程需要调用start方法使线程进入就绪状态,等待CPU调用,而run里面存放的是线程需要执行的逻辑和内容,只有在run方法执行结束或者发生异常之后退出了run方法的时候线程才会被销毁
32.如果分布式锁失效了怎么弄?
答:如果在线程没有处理完的时候,锁失效时间到了,那么就可以给锁续约,制定计时器,给锁续约
33.arrar和ArrayList有什么区别?
答:array是一个数组,而ArrayList是一个集合;array的长度是固定的,而ArrayList的容量是可以动态增长的,但ArrayList效率没有array高。
34.hashMap是怎么实现的?
答:底层是基于哈希值得数组+链表的实现;
存:put方法的实现,首先将Key和value存到node对象中,然后根据key的hashcode方法计算出key的哈希值,如果该哈希位置上没有链表,那么就会将该key和value存放在这里,如果该位置有链表,那么会调用equals方法如果返回的是true,那么该key-value就会覆盖原本的,如果返回false,那么就会将该key-value加在链表的末端;
取:get方法;首先获取到这个key的哈希值,通过哈希值找到数组下标,如果该处没有链表,那就返回null,如果该处有链表,那么就会将该key去与链表中的key做equals比较,直到返回true时候,就返回value,如果全部都是false,那么也会返回null。
35.runnable和callable的区别?
答:runnable执行不会返回执行结果,而callable会返回执行结果;
Runnable的run方法不能向上抛异常,只能在方法内部消化,而callable的call方法可以向上抛出异常;
36.说一说Spring的aop和ioc?
答:aop是面向切面编程:在不改变原有的逻辑的情况下增加横切面的逻辑,弥补了oop的不足
Ioc是控制反转:是一种思想,不是一个技术,将创建对象的和管理的权利交给spring,存在ioc容器中
DI是依赖注入:三种方式,基于注解注入、构造方法注入和setter注入
Setter注入,就是在实体类中通过set方法来注入,需要set的方法名与xml中的name属性相同;
基于注解注入:@Autowired(自动注入)注解来注入,
构造注入: 如果只有一个有参数的构造方法并且参数类型与注入的bean的类型匹配,那就会注入到该构造方法中。

37.springBoot的核心配置文件有哪些?
答:有Application和bootstarp配置文件;
区别:application主要用于SpringBoot的自动化配置
Bootstarp主要用来加载外部的配置信息,一般用在一些加密解密的场景
38.springBoot的配置文件怎么读取?
答:在springboot启动的时候,通过监听器扫描到配置文件,然后读取。
39.依赖注入的方式有哪些?
40.@Autowired和@resources有什么区别?

答:@Autowired是属于spring的,而@Resources是属于java的,前者是默认按照类型匹配的,而后者是通过name属性进行匹配的
41.线程的生命周期?
答:新建(new一个线程时候)-就绪(调用了start()方法时候)-运行(被cpu调用之后)-阻塞(同步阻塞、等待阻塞、其他阻塞)-死亡(由于异常或者运行完之后退出run方法,就结束了线程的生命周期)
42.创建bean的方式有哪些?
答:1:调用构造器创建Bean(在实体类中得提供无参的构造函数和set方法,在xml里面指定class属性,提供name属性来进行bean的注入)
2:调用静态工厂方法创建Bean 咱们把创建Bean的任务交给了静态工厂,而不是构造函数
3:调用实例工厂方法创建Bean 意思是先实例化工厂 再生产

43.怎么获取到配置文件中的某个值?
答:创建ResourceClasspath对象,传入配置文件的路径,使用io来获取;
44.spring创建的bean是线程安全的吗?
答:spring 管理的 bean 的线程安全跟 bean 的创建作用域和 bean 所在的使用环境是否存在竞态条件有关,spring 并不能保证 bean 的线程安全。
45.什么叫做索引失效?
答:1.有or必全有索引;
2.复合索引未用左列字段;
3.like以%开头;
4.需要类型转换;
5.where中索引列有运算;
6.where中索引列使用了函数;
7.如果mysql觉得全表扫描更快时(数据少);
46.b树索引和哈希索引有什么区别?
答:哈希索引只适用于=和in的判断,
索引的种类:
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
ps.
索引合并,使用多个单列索引组合搜索
覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
47.数据库出现死锁怎么解决?
答:产生死锁的原因:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
解除死锁和预防死锁:
预防:(1)按同一顺序访问对象。
(2)避免事务中的用户交互。
(3)保持事务简短并在一个批处理中。
(4)使用低隔离级别。
(5)使用绑定连接。
解除:在操作多表时候,保证同时锁定多表,加更新锁(“我现在只想读,你们别人也可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁(用来更新)的资格”。一个事物只能有一个更新锁获此资格),SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,建立相应的索引进行优化
48.修改equals需要重写hashcode吗?
答:需要,如果两个对象的equals相等,那么他们的hashcode一定相等,如果我们重写了equals方法,而不重写hashcode方法,那么就不满足这一条。
49.redis是不是单线程的?
答:是单线程
50.如果redis锁过期了而任务没有执行完的问题?
答:默认时间是30秒,在一个线程获取锁之后,做一个监听,每过10秒就看一下锁是否还在,如果还在就将锁的有效期重置;

【java常见面试题】相关推荐

  1. Java常见面试题,2021年及答案汇总

    Java常见面试题,2021年及答案汇总 其实,博主还整理了,更多大厂面试题,直接下载吧 下载链接:高清172份,累计 7701 页大厂面试题 PDF 1.什么是ThreadPoolExecutor? ...

  2. Java常见面试题及答案汇总

    面临金三银四黄金跳槽季,不光是很多在职人员跃跃欲试,也有很多大学生积极地加入到应聘行列.作为技术出身的我们,找工作的一大前提就是技术是否能过关.而对于Java程序员来说,至少是两关的面试,这首个关卡就 ...

  3. 2018常见的java面试题_2018新版Java常见面试题

    千锋西安Java编程培训班的老师总结了2018新版Java常见面试题,一起来看! 1.1.java基础 ●面向对象的特征:继承.封装.多态 继承[构造器.protected关键字.向上转型Java实现 ...

  4. 总结Java常见面试题和答案

    转载自  总结Java常见面试题和答案 int和Integer有什么区别?   答:int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装 ...

  5. java常见面试题及答案 1-10(基础篇)

    java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被 ...

  6. JAVA常见面试题及解答

    JAVA常见面试题及解答(精华)   1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class ...

  7. Java常见面试题 + 答案

    Java常见面试题 + 答案 一.Java 基础 二.容器 三.多线程 四.反射 五.对象拷贝 六.Java Web 七.异常 八.网络 九.设计模式 十.Spring / Spring MVC 十一 ...

  8. Java常见面试题(2)

    Java常见面试题(2) 面向对象的三个特征 谈谈你对多态的理解 多态的好处: 什么是Java程序的主类?应用程序和小程序的主类有何不同? 为什么Java里有基本数据类型和引用数据类型 值传递和引用传 ...

  9. Java常见面试题 Java面试必看 (一)

    本篇博客是本人收集网上Java相关的资料整理所得,仅供参考. 一.Java基础 1.JDK 和 JRE区别 JDK(Java Development Kit)是针对Java开发员的产品,是整个Java ...

  10. Java常见面试题整理(一)

    Java常见面试题整理 字符串 抽象类与接口 集合 多线程 锁 IO流 网络编程 字符串 主要包括String.StringBuffer和StringBuilder基本概念 String相关知识 St ...

最新文章

  1. qt设置mysql最大连接数_MySQL服务器最大连接数的合理设置
  2. 2020年python工资一般多少钱-2020年Python的就业薪资有多少?前景如何?
  3. Linux中makefile项目管理
  4. 【测试】用示波器抓取红外遥控器NEC信号
  5. 密织“地网” 南充“试水”智慧安防
  6. KVM虚拟机添加硬盘
  7. 解决@vue/cli 创建项目是安装chromedriver时失败的问题
  8. Java中的PrintWriter的write方法和print方法的区别是什么?
  9. 团队项目计划BACKLOG
  10. caffe caffe.cpp 程序入口分析
  11. 青铜到王者,看看你的MySQL数据库是什么段位,如何提升?
  12. Windows 10 计算器全新升级,支持三角函数运算
  13. access视频教程百度网盘_office 2016 全套高清视频教程打包下载 - 行客工作室
  14. android studio更改代码字体,Android Studio怎么改变代码字体大小?
  15. [Hadoop] - Win7下提交job到集群上去
  16. 微软小娜关闭服务器,图文详解彻底关闭windows10系统里的小娜(Cortana)语音服务-系统操作与应用 -亦是美网络...
  17. PCIe简介及引脚定义
  18. Booth算法运算原理
  19. 《密码编码学与网络安全》William Stalling著---学习笔记(一)【知识点速过】【传统密码+经典对称加密算法+经典公钥密码算法+密码学Hash函数】
  20. Python 入门基础

热门文章

  1. 解决:cannot import name ‘xxx‘ from ‘xxx‘
  2. Unity接入高德SDK实现定位
  3. laravel 使用workerman加速应用
  4. Android版本与Linux内核版本的关系
  5. Security:osquery 介绍
  6. 大型软件外包项目的开发流程
  7. cytoscape.js初级篇
  8. Java list.toArray()和list.toArray(T[] a)
  9. 赫夫曼树(Haffman)及其运用
  10. Java程序中操作Word表格