Java面试总结

一、说一下SpringBoot的启动类?它主要由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,它是SpringBoot的核心注解
主要组合包含了以下3个注解:
@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude{DataSourceAutoConfiguration.class})。
@ComponentScan:Spring组件扫描。

二、Springcloud与springboot的区别?

1、springboot专注于快捷、方便的开发单个个体微服务
2、SpringCloud关注全局的微服务协调治理框架,他将springboot开发的一
个个单体微服务整合管理起来,为各个服务之间提供、配置管理、服务发现、断
路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务。
3、springboot可以离开springcloud独立的进行开发项目,反之springcloud
是离不开springboot的,属于依赖的关系
(service)spring业务层(IOC和AOP容器,可以通过事务操作)
(controller)springmvc表现层
(dao)mybatis持久层(操作数据库)

三、传参注解@requestBody和@requestParam的区别

  1. @requestBody主要用来接收前端传递给后台的jsion
    字符串中的数据的,最多只能有一个,get方法无请求体所以前端不能用get方法提交
  2. @requestParam可以有多个,用于接收url中的K-v参数的传递

javase

一、八种基本数据类型

1、int
2、short
3、byte
4、long
5、float
6、double
7、boolean
8、char

二、list、map、set集合的区别?

  1. list集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象
  2. map中是以键值对的方式出现的,键不可以重复,值可以重复
  3. set集合中对象不按照特定的方式排序,且没有重复对象,它的实现类能对集合中的对象按照特定的方式排序。例如TreeSet

三、SSM框架

springMVC,spring和mybatis框架的整合,是标
准的MVC模式,将整个系统划分为表现层,controller层,service
层,DAO层四层使用springMVC负责请求的转发和视图管理spring
实现业务对象管理,mybatis作为数据对象的持久化引擎

四、springmvc的工作原理?

  1. 用户发送请求到前端控制器、前端控制器对请求url进行解析,得到相应的处理器映射器
  2. 调用处理器映射器获得该处理器的Handdler配置的所有相关对象,最后以HandlerExecutionchain对象的形式返回到前端控制器
  3. 前端控制器选择到一个合适的处理器适配器来调用处理器、处理器返回一个modelAndview对象返回到前端控制器、此时的modelAndview只是一个逻辑视图并不是一个真正的视图
  4. 前端控制器通过视图解析器将modelAndview分别解析为模型对象model和视图对象view,并返回到前端控制器
  5. 视图渲染将model数据填充到request域,request根据view响应客户端

Mybatis:mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

五、Hashmap底层

Jdk1.8以后Hashmap的底层由数组+链表+红黑树组成,当链表的长度超过阈值(8)时链表 会转换为红黑树。是map的一个子接口,不允许键值重复,允许空键和空值,线程不安全,效率高

六、什么是红黑树?

红黑树是一种自平衡的二叉查找树,

  1. 左子树上的所有结点的值均小于或等于根结点的值,右子树与之相反;
  2. 结点是红色或者黑色,根节点是黑色的,每个叶子的结点都是黑色的空结点;
  3. 从每个叶子到根的所有路径上都不能有两个连续的红色结点;
  4. 从任一结点到其每个叶子的所有路径都包含相同数目的黑色节点。
    当插入或者删除节点时打破了规则后,应该做出一些调整(变色和旋转(左旋和右旋))

七、创建线程有哪些方式?

  • 继承Thread类创建线程
  • 通过Runnable接口创建线程类
  • 通过Callable和Future创建线程
  • 通过线程池创建

八、synchronized和Lock有什么区别

  1. synchronized是java内置关键字,在jvm层面,Lock是个java接口;
  2. synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
  3. synchronized会自动释放锁,Lock需在finally中手工释放锁(unlock()方法释放锁)
  4. synchronized线程A占用锁后,线程B会一直等待;而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了。
  5. synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可);
  6. Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

九、synchronized和volatile的区别是什么

  1. volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
  2. synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  3. volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
  4. volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
  5. volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
  6. volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

十、网络编程

  1. 什么是网络:将不同区域的计算机连接在一起(区域:局域网、城域网)
  2. 地址的概念:IP地址,确定网络上,一个绝对的地址或位置(例如房子的地址)
  3. 端口:区分计算机软件的(房子的门牌号,2个字节,0-65535,工65536个)在同一个协议下端口号不能重复,不同协议下可以重复(协议是用来传输数据的)
  4. 资源定位:URL统一资源定位符,URI统一资源

十一、数据的传输

  • 协议:TCP、UDP协议(前者先连接后通信)
  • IO流四大类:InputStream(字节输入流),OutputStream(字节输出流)Reader(字符输入流),Writer(字符输出流)
  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射制。
  • 反射就是把java类中的各种成分映射成一个个的Java对象

十二、什么是多线程?

一个程序被运行,就开启了一个进程,一个进程可以开启多条线程(cpu调度的最小单位),多条线程可以并发(同时)执行不同的任务。

创建线程有哪些方式?
  1. 继承Thread类创建线程
  2. 通过Runnable接口创建线程类
  3. 通过Callable和Future创建线程
  4. 通过线程池创建

十三、怎么保证多线程的运行安全【并发编程三要素】

  • 原子性(一个或多个操作,要么全部执行并执行的过程不被打断,要么都不执行)
  • 可见性(多个线程操作一个共享变量时,其中一个线程对线程变量进行修改后,其他线程可以立即看到修改的结果)
  • 有序性(程序执行的顺序按照代码的先后顺序执行)

十四、线程和进程的区别?

  • 进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。
  • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。
  • 线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执 行。

十五、死锁是什么?怎么防止死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互 相等待的现象,若无外力作用,它们都将无法推进下去。

  • 死锁的四个必要条件:
  • 互斥条件:一个资源每次只能被一个进程使用
  • 请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺环路
  • 等待条件:若干进程之间形成一种头尾相接的循环等待资源关系避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。

十六、说一下runnable和callable有什么区别

  • Runnable接口中的run()方法的返回值是void
  • Callable接口中的call()方法是有返回值的,是一个泛型,和Future、
  • FutureTask配合可以用来获取异步执行的结果。

十七、sleep()和wait()有什么区别

  • 最大的不同是在等待时wait会释放锁,而sleep一直持有锁。wait通常被用于线程间交互,sleep通常被用于暂停执行。
  • sleep()方法是Thread类的静态方法,是线程用来控制自身流程的。而wait()方法是Object类的方法,用于线程间的通信。
    调用wait()的时候方法会释放当前持有的锁,而sleep方法不会释放锁。
  • sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
  • 调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

十八、创建线程池有哪几种方式

  • newFixedThreadPool(intnThreads) 创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直
    到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未 预期的错误而结束时,线程池会补充一个新的线程。
  • newCachedThreadPool()
    创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。
  • newSingleThreadExecutor()
    这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。
  • newScheduledThreadPool(intcorePoolSize)
    创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

十九、多线程锁的升级原理是什么

在Java中,锁共有4种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。

  • 无锁:没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功,其他修改失败的线程会不断重试直到修改成功。
  • 偏向锁:对象的代码一直被同一线程执行,不存在多个线程竞争,该线程在后续的执行中自动获取锁,降低获取锁带来的性能开销。偏向锁,指的就是偏向第一个加锁线程,该线程是不会主动释放偏向锁的,只有当其他线程尝试竞争偏向锁才会被释放。偏向锁的撤销,需要在某个时间点上没有字节码正在执行时,先暂停拥有偏向锁的线程,然后判断锁对象是否处于被锁定状态。如果线程不处于活动状态,则将对象头设置成无锁状态,并撤销偏向锁;如果线程处于活动状态,升级为轻量级锁的状态。
  • 轻量级锁:轻量级锁是指当锁是偏向锁的时候,被第二个线程B所访问此时偏向锁就会升级为轻量级锁,线程B会通过自旋的形式尝试获取锁,线程不会阻塞,从而提高性能。当前只有一个等待线程,则 该线程将通过自旋进行等待。但是当自旋超过一定的次数时,轻量级锁便会升级为重量级锁;当一个线程已持有锁,另一个线程在自旋, 而此时又有第三个线程来访时,轻量级锁也会升级为重量级锁。
  • 重量级锁:指当有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。重量级锁通过对象内部的监视器(monitor)实现,而其中monitor的本质是依赖于底层操作系统的MutexLock实现,操作系统实现线程之间的切换需要从用户态切换到内核态,切换成本非常高。

二十、ThreadLocal是什么?有哪些使用场景

  • 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。
  • Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。

二十一、说一下synchronized底层实现原理

  • synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。
  • Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法,锁是当前实例对象静态同步方法,锁是当前类的class对象同步方法块,锁是括号里面的对象

二十二、synchronized和volatile的区别是什么

  • volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  • volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
  • volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
  • volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
    volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

二十三、synchronized和Lock有什么区别

  • synchronized是java内置关键字,在jvm层面,Lock是个java接口;
  • synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
  • synchronized会自动释放锁,Lock需在finally中手工释放锁(unlock()方法释放锁)
  • synchronized线程A占用锁后,线程B会一直等待;而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了。
  • synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可);
  • Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

二十四、synchronized和ReentrantLock区别是什么

  • synchronized是关键字,ReentrantLock是类,这是二者的本质区别。
  • ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量

ReentrantLock扩展性体现在几点上:

  • ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁
  • ReentrantLock可以获取各种锁的信息
  • ReentrantLock可以灵活地实现多路通知

二者的锁机制其实也是不一样的:ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中markword。

二十五、synchronized和Lock底层实现

  • synchronized用的锁是存在java对象里的,通过对代码反编译,可以看出被synchronized修饰的代码块,在执行之前先使用monitorenter指令加锁,然后在执行结束之后再使用monitorexit指令释放锁资源,在整个执行期间此代码都是锁定的状态,这就是典型悲观锁的实现流程。
  • lock锁使用的是CAS和volatile来实现同步的,CAS使用硬件命令实现缓存一致性保证了原子性,volatile保证了可见性,多线程环境下所有的线程通过CAS进行竞争资源,只能有一个成功,其它的都会自旋。

二十六、在多线程中,什么是上下文切换

上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。是多任务操作系统和多线程环境的基本特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值