2020年Java面试宝典-仅供参考

Java面试宝典

 

  1. 项目中使用了哪些注解?
  • @ResponseBody(将java对象转为json格式的数据。表示返回json数据);
  • @RequestMapping(表明方法是处理哪种类型,什么地址的请求。映射请求路径,可以映射到类或者方法上);
  • @Service(自动注册到spring容器中。定义getBean的类名);
  • @Transaction(事务回滚;遇到异常自动回滚。加上这个注解,如果方法执行中发生异常,则回滚执行的sql。)
  • @override(覆盖父方法)
  • @Resource(这个注解属于J2EE的),自动装配bean,默认按照名称默认按照名称进行装配,名称可以通过那么属性进行指定,如果没有指定,当注解写在字段上时,默认取字段名进行安装名称查找,@Resource有两个重要的属性:name和type
  • @Autowired(这个注解是属于Spring的),自动装配bean,默认按照类型默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如果我们想使用名称装配可以结合@Qualifire注解进行使用。
  • @Controller(声明为控制器,可以返回jsp、html页面的名称并跳转到相应页面,在SpringMVC中,控制器就是一个其方法中添加了@RequestMapping来处理请求的类)
  • @PostMapping(组合注解,是@RequestMapping(method=RequestMethod.POST)的缩写)
  • @RestController(@Controller 和@ResponseBody 注解的结合,表明此控制器返回json)

 

  1. 事务的基本要素(ACID)
  • 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学学过的原子,是物质构成的基本单位。
  • 一致性(Consistency):事务开始前和结束后,数据库的完整性没有被破坏。比如A向B转账,不可能A扣了钱,B却没有收到。
  • 隔离性(lsolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正从一张银行卡中取钱,在A取钱的过程技术之前,B不能向这张卡转账。
  • 持久性(Durability): 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

 

  1. 数据库锁
  • 乐观锁:相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据库进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。一般的实现乐观锁的方式就是记录数据版本,并且不会造成线程的阻塞。但是,版本的冲突会造成请求失败的概率剧增,这时往往需要通过重入的机制将请求失败的概率降低。而多次的重入优惠带来过多执行sql的问题,为了克服这个问题,可以考虑使用按时间戳或者限制重入次数的办法。
  • 悲观锁:正如其名,它指的是对数据被外界修改持保守态度。因为在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,及时在本系统中实现加锁机制,也无法保证外部系统不会修改数据)。数据库两种所可以实现悲观锁,排它锁(Exclusive Lock,也叫X锁)和共享锁(Shared Lock,也叫S锁)。排他锁表示对数据进行写操作,如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了;共享锁会为操作对象加共享锁,可以允许其他共享锁的加锁操作,但是不允许排它锁加锁操作。

 

  1. @Autowired 和 @Resource 两个注解的区别?
  • @Autowired与@Resource都可以用来装配bean,都可以写在字段setter方法上
  • @Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
  • @Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
  • 推荐使用@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与Spring的耦合。

 

  1. Map实现循环的几种方式?
  • 在for循环中使用entries实现Map的
  • 在for循环中遍历key或者values,一般适用于只需要在map只不过的key或者value时使用,在性能上比使用entrySet比较好;
  • 通过Iterator遍历;
  • 通过键找值遍历,这种方式的效率比较低,因为本身从键取值是耗时的操作
  1. 实现多线程有几种方式,分别是哪几种?
  • 继承Thread类
  • 实现runnable接口
  1. 项目中遇到的一些问题?
  • 索引越界异常,下标越界(IndexOutOfException)
  • 空指针异常(NullPointException)
  • 类型转化异常(有些需要强制类型转化ClassCastException)
  • 内存溢出异常(OutOfMemoryError)
  • 文件找不到异常(FileNotFoundException)
  1. Linux的常用的命令?
  • Ls (显示文件或者目录)
  • Cd (切换目录)
  • Vim(创建、编辑文件)
  • Cp(拷贝文件)
  • Mv(移动或者重命名)
  • Rm(删除文件)
  • Kill(杀进程)
  • Find(在文件系统中搜索文件)
  1. Ajax怎么实现同步异步请求?
  • Async:true(异步)或者false(同步)
  1. 微信公众号有哪些基本配置?
  • Token
  • Prefix
  • PaymchId
  • Code
  • Appid
  • Appsecret
  • Url
  • openid
  1. 写文件读文件?
  • Outputstream(读文件)
  • InputStream(写文件)
  1. Java中的异常?
  • 检查时异常(CheckedException)最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  • 运行时异常(RuntimeException 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  1. 实现定时任务的方式有哪些?
  • Jdk自带的TimerTask
  • 使用第三方包QuartZ
  • 使用Spring自带的定时任务管理
  1. 启动类添加注解 @EnableScheduling
  2. 类上添加注解@Component被容器扫描
  3. 需要定时执行的方法添加注解@Scheduled
  1. 左连接、右连接和内连接的区别?
  • Left Join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
  • Right join (右连接):返回包括表中的所有记录和表中连接字段相等的记录。
  • Inner join (内连接)内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
  1. APP是怎么调用接口的?
  • httpClient
  1. 集合的使用?

Collection:

  • List:
  1. ArrayList:以数组下标的形式存取数据,索引数据快而插入数据慢。数据增长时,默认增长一半。可以有重复的数据,没有排序。
  2. linkedList: 使用双向链表实现存储,按序号索引数据需要进行前项或后项遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数据比较快。
  3. Vector:以数组下标的形式存取数据,是线程同步的,是线程安全的,所以性能比ArrayList差一点。数据增长时,默认增长一倍。
  4. Stack:
  • Set:不允许有重复的数据,内部排序。

Map:

  • HashTable:是继承自dictionary类的,是线程同步的,不允许一个null键对应多个null值。
  • HashMap:是对map的实现,它把hashTable 的contains方法去掉了,改成了containsKey和containsValue。允许一个null键对应多个null值
  • WeakHashMap
  1. 面向对象的四个特征?
  • 封装:有选择的隐藏和暴露数据和方法,比如U盘是一个类,我们会隐藏内部组成和实现,只暴露USB接口以供使用。
  • 继承:子类可以直接使用父类的部分数据和方法,可以有选择的扩展。
  • 抽象:将一些事物的共性抽离出来归为一个类。对于动物,具有生命体征、活动能力等区别于其他事物的共同特征。
  • 多态:同一类的对象调用相同的方法表现出不同的行为。比如动物实现了say()方法,猴子、马等动物重写了这个方法,来表现不同的交流语言。
  1. 数据类型

Java中一共有八种基本类型。包括六种数字类型(四个整数型,两个浮点型),一种布尔型,一种字符类型

  • Byte(整数类型):byte数据类型是8位、有符号的,以二进制补码表示的整数。
  • Short(整数类型):short数据类型是12位的有符号的以二进制补码表示的整数。
  • Int(整数类型):int数据类型是64位、有符号的以二进制补码表示的整数。Int类型的10进制的范围是在20亿以内,如果大于这个数,必须要用long型,否则没必要。
  • Long(整数类型):long类型是64位的、有符号的以二进制补码表示的整数;
  • Float(浮点类型):float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;float 在储存大型浮点数组的时候可节省内存空间;float和double的范围是由指数的位数来决定的。
  • Double(浮点类型):double数据类型是双精度、64位;浮点数的默认类型都是double类型。
  • Boolean(布尔类型):Boolean数据类型表示一位的信息;只有两个值:true和false;默认值是false;
  • Char(字符类型):char 数据类型可以储存任何字符;
  • 注意String类型不属于Java的基本数据类型;
  1. GC垃圾回收的原理?

垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

  1. 垃圾回收的优点是什么?

它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。

  1. final、finally和finalize的区别?
  • Final(关键字):如果一个类被声明为final,意味着它不能再派生新的子类,不能作为父类被继承,因此一个类不能被声明为abstract又被声明为final的。
  • Final(关键字):如果一个变量或方法被声明为final,可以保证他们使用中不被改变。被声明为final的变量必须在声明时给出初始值,而以后的引用中只能读取,不可修改,被声明为final的方法也同样只能使用,不能重载。
  • Finally:在异常处理时提供finally块来执行清楚操作。如果抛出一个异常,那么相匹配的catch语句就会执行,然后控制就会进入finally块,如果有的话。
  • Finalize:是方法名,Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。这个方法是在垃圾收集器在确定了,被清理对象没有被引用的情况下调用的。Finalize是在object类中定义的,因此,所有的类都继承了它。子类可以覆盖finalize()方法,来整理系统资源或者执行其他清理工作。
  1. jQuery怎么使用多线程的?

           setTimeout();

  1. Java创建对象的几种方式?
  • 用new语句创建对象,这是最常用的创建对象的方式。
  • 运用反射手段,调用Java.lang.Class或者Java.lang.reflect.Class
  • 调用对象的clone方法;
  • 运用反序列化手段。
  1. Switch是否能使用String做参数?

       可以的,在jdk7以及之后的版本都可以了。

  1. Object有哪些公共方法?
  • Clone:保护方法,实现对象的浅复制 ,只有实现了Cloneable接口,才可以调用哪个该方法,否则抛出CloneNotSuportedExceptio异常。
  • Equals:在object与==是一样的,子类一般需要重写该方法。
  • HashCode:该方法用于哈希查找啊,重写了equal方法一般都要重写hashCode方法。这个方法。这个方法在一些具有哈希功能的Collection中用到。
  • GetClass:final方法,获得运行时类型。
  • Wait:使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 
    调用该方法后当前线程进入睡眠状态,直到以下事件发生: 
    1. 其他线程调用了该对象的notify方法 
    2. 其他线程调用了该对象的notifyAll方法 
    3. 其他线程调用了interrupt中断该线程 
    4. 时间间隔到了 
    此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常
  • Notify:唤醒在该对象等待的某个线程。
  • NotifyAll:唤醒在该对象上等待的所有线程。
  • ToString:转换成字符串,一般子类都有重写,否则打印句柄。
  1. Mysql中$和#的区别?
  • $一般是用来拼接sql语句的。
  • #一般是用来传递参数的

 

  1. &、|、^和&&、||有什么区别?
  • 前者是逻辑操作,后者是条件操作
  • 后者只能操作布尔型的数据,而前者不仅可以操作布尔型,而且可以操作数值型。
  • 前者操作不会产生短路。后者在前面的条件不满足之后,就不会执行后面的表达式了。

 

  1. Java字符串如何将GBK的编码转化成ISO-8859-1?

        String result=new String(s.getBytes(“UTF-8”),”ISO-8859-1”)

  1. 线程同步和异步的区别?
  • 同步(sync):所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。根据这个定义,Java所有方法都是同步调用的,因为必须等到返回结果后才会继续执行。我们在说同步、异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务。
  • 异步(async):异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。

 

  1. Redis数据类型
  • String(字符串)
  • Hash(哈希)
  • List(集合)
  • Set(集合)
  • Zset(有序集合)

 

  1. 定时任务的注解是哪个?

      @Scheduled

  1. Case穿透

          Jdk7之后可以使用String类型。

           产生这种现象的原因由于某个case语句中缺少或者漏写break语句所导致的结果。

  1. 经常使用的拦截器、过滤器、监听器有哪些?
  • 拦截器:LoginIntercepter(用于拦截没有账号权限的人访问数据,该拦截器通过获取前端用户的userToken,到后台解析账号密码数据,确认账号状态是否可以正常使用)。
  • 过滤器:DataFilter数据过滤,过滤对应的部门的数据,没有本部门的数据,也能查询本人的数据)。
  1. Java中==和equal有什么区别?
  • ==主要是判断两个对象的地址是否相同;equal是判断两个对象的内容是否相同
  • 如果两个对象值相同(x.equals(y)==true),那么hashCode肯定是相同的。

 

  1. SpringMVC的执行过程?
  • 用户发送请求至前端控制器DispatcherServlet。
  • DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  • 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  • DispatcherServlet调用HandlerAdapter处理器适配器。处理器适配器去执行handler。
  • HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
  • Controller执行完成返回ModelAndView。
  • HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
  • DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
  • ViewReslover解析后返回具体View。
  • DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
  • DispatcherServlet响应用户。
  1. Bean的作用域和生命周期?

作用域:1.singleton。2.prototype。3.request。4.session。5.globalSession

生命周期:

  • Spring对bean进行实例化,默认bean是单例;
  • Spring对bean进行依赖注入;
  • 如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法;
  • 如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来;
  • 如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;
  • 如果bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization方法将被调用;
  • 如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,该方法也会被调用;
  • 如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用;
  • 此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
  • 若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;
  1. Java中常用的集中线程池比较?
  2. HashMap、HashTable和concurrentHashMap的原理和区别?
  • HashMap:以键对值形式存储数据,允许一个null键对应多个null值。线程不安全。是实现了map。
  • HashTable:不允许有null键和null值,线程安全,实现线程安全的方式是在修改数据时锁住整个hashTable,效率低,concurrentHashMap做了相关优化。实现了Map接口,但是是基于dictionary类。
  • ConcurrentHashMap:底层采用分段数组,链表实现,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。允许多个修改操作并发进行,关键在于使用了锁分离技术。
  1. Redis为啥这么快?
  • 完全基于内存,绝大部分的请求都是基于内存操作的,非常快速,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
  • 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
  • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  • 使用多路I/O复用模型,非阻塞IO;
  • 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
  1. MySQL的优化方法?
  • 选择最优效率的表名顺序
  • 尽量避免在where子句中进行null值判断,否则将导致引擎放弃使用全表扫描
  • 查询的时候尽量避免全表查询,首先考虑在where以及order by 涉及的列上建立索引
  • 尽量避免在where子句中使用!=或<=>操作符,否则将引擎放弃使用索引而进行全表扫描。
  • In 和 not in也要慎用,否则将进行全表扫描。
  • 将外连接转化成内连接

 

  1. int 和 Integer?
  • int是Java的原始数据类型,Integer是为int提供的封装类。
  • Java为每个原始类型提供了封装类

 

  1. 抽象类和接口的区别?
  • 抽象类要被子类继承,接口要被类实现
  • 接口只能做方法声明,抽象类可以做方法声明,也可以做方法实现
  • 接口里定义的变量只能是公共的静态的常量,抽象类的变量是普通变量
  • 接口是设计的结果,抽象类是重构的结果
  • 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量
  • 类只能继承一个,接口可以实现多个

 

  1. Java中throws、throw、try、catch、fianlly分别代表什么?
  • throws:用来表明一个成员函数可能抛出的各种异常
  • throw:用来明确地抛出一个异常
  • try:一般用来放可能会出现的异常
  • catch:用来指定想要捕捉的异常
  • finally:为确保一段代码无论发生什么异常都会被执行的代码

 

  1. Git的提交顺序?
  • Git pull
  • Git status
  • Git add
  • Git commit
  • Git push
  1. AOP的实现原理以及常用注解?

Aop主要表现在两个方面。

  1. 面向切面编程的声明式事务管理。
  2. Aop用户自定义切面

面向切面编程将程序分解成各个层次的对象,面向切面编程将程序运行分解成各个切面。从程序运行角度考虑程序的结构,提取业务处理过程的切面,对应用执行过程中的步骤进行抽象,从而获得步骤之间的逻辑划分。

  1. Java中常用的设计模式?
  2. 单列模式写一个例子?

Public class singleton{

Private static singleton(){};

Private singleton instance=new singleto();

Private static singleton getSingleton(){

Return instance;

}

 

  1. IOC的实现原理?

依赖注入:通过注入的方式实例化对象,不在直接new对象,交给spring容器进行管理和维护。

控制反转:实例化对象的控制权交给了spring容器,而不再是某个单独类,控制权发生了变更。

作用:解耦,又IOC容器维护对象的生命周期和对象之间的相互引用

特性:类与类之间的关系同意交给IOC容器进行维护管理,同时将类注入到需要的类中,也就是类的使用者只负责使用。

实现原理:

  • 初始化IOC容器
  • 读取配置文件
  • 解析配置文件,将配置信息转换为IOC容器能够识别的数据结构
  • 将数据结构依次实例化相应的Java对象
  • 注入对象之间的依赖关系。
  1. 高并发的处理方法有哪些?
  • 数据库优化
  1. 数据库读写分离。
  2. 数据库集群和库表散列即分区分表。
  3. 数据库表结构优化。
  4. 批量读取和延迟修改
  5. SQL语句优化。
  6. 索引优化。
  7. 使用存储过程代替直接操作。
  • 使用缓存(Redis)
  • 负载均衡
  • 动静分离
  • Nosql

 

  1. Mybatis的分页方式有几种?
  • 数组分页
  • Limit分页
  1. Mybatis的一级缓存、二级缓存?

 

  1. SpringBoot的主要核心配置有哪些?
  • SpringBootApplication
  • SpringBootConfiguration
  • EnableAutoConfiguration

你可能感兴趣的:(Java后端)