文章目录
-
-
- 1.String和StringBuilder和StringBuffer的区别
- 2.String为什么不可变StringBuilder为什么可变
- 3.StringBuilder为什么线程不安全StringBuffer为什么不安全 , 什么场景下使用StringBuilder什么场景使用StringBuffer
- 4.HashMap底层用到了什么数据结构?
- 5.Spring、SpringMVC、SpringBoot、SpringCloud的区别
- 6.介绍一下Spring框架的组成
- 7.说一下你对IOC的理解
- 8.说一下你对AOP的理解
- 9.BeanFactory和ApplicationContext有什么区别
- 10.Spring的Bean被指定为singleton以及prototype有什么区别?
- 11.Spring的Bean懒加载和非懒加载有什么区别
- 12.Spring的依赖注入方式有哪些?
- 13.有哪些方式可以注册一个Bean到容器中
- 14.将一个类声明为Spring的Bean的注解有哪些?
- 15.Spring的IOC启动原理?
- 16.Spring是如何管理事务的?
- 17.Spring用到了哪些设计模式?
- 18.RequestMapping 和 GetMapping有什么区别?
- 19.SpringMVC怎么样设定重定向和转发的
- 20.SpringMVC如何对时间格式的参数进行格式化?有哪些方式?
- 21.SpringMVC常用的注解有哪些
- 22.如何定义SpringMVC的拦截器
- 23.HandlerInterceptor和HandlerInterceptorAdapter的区别
- 24.SpringMVC的执行原理
- 25.SpringMVC的Controller是单例还是多例,有没有并发安全问题,如何解决?
- 26.Spring Boot有哪些优点
- 27.SpringBoot如何做全局异常处理?
- 28.SpringBoot如何读取配置文件中的配置项?
- 29.@SpringBootApplication标签的组成
- 30.SpringBoot是如何整合SpringMVC的?
- 31.SpringBoot是如何整合DataSource的?
- 32.SpringBoot的启动流程
- 33.SpringBoot和SpringCloud的区别?
- 34.SpringCloud常用组件和作用?
- 35.Eureka心跳和服务剔除机制是什么
- 36.Eureka的服务注册与发现的工作流程
- 37.对于CAP理论,Eureka选择的是AP还是CP?它保证了一致性还是可用性?
- 38.说一下Eureka的自我保护
- 39.说下Ribbon和Feign的区别呢?
- 40.如何实现Eureka的高可用集群?
- 41.Hystrix的限流有几种方式,有什么区别?
- 42.Hystrix的熔断有几种状态?这几种状态是怎么变换的?
- 43.服务A使用ribbon调用服务B,Ribbon是如何工作的?
- 44.为什么Feign的接口可以直接注入进来用?
- 45.Ribbon的负载均衡算法有哪些?
- 46.你们项目是如何做服务降级的?
- 47.Zuul有哪几类Filter,他们的执行顺序是怎么样的?
- 48.在Zuul中做登录检查如何实现?
- 49.在Zuul中如何做限流?
- 50.介绍一下Java中的集合体系
- 51.如果需要从一个List集合中频繁的删除和添加元素,是选择ArrayList还是LinkedList?为什么?
- 52.什么是Hash冲突(碰撞)?
- 53.HashMap为什么要使用链表,又为什么要使用红黑树?
- 54.HashMap是否是线程安全的,如果不是,那么在多线程环境中我们应该使用哪个集合?
- 55.HashMap扩容机制?
- 56.创建线程的3种方式?
- 57.Synchronized和Lock的区别?
- 58.线程的生命周期?
- 59.synchronized 锁的原理,JDK1.5之后做了什么样的优化?
- 60.乐观锁的使用场景?
- 61.AtomicInterger怎么保证并发安全性的?
- 62.ThreadLocal的作用和原理?
- 63.synchronized 和 volatile 的区别是什么?
- 64.常用的线程池有几种,分别是什么意思?
- 65.线程池的执行流程?
- 66.解释一下线程池构造器的7个参数?
- 67.EurekaClient拉取注册表&心跳续约用到了什么技术来实现?
- 68.Redis如何实现分布式锁?
- 69.Zookeeper实现分布式锁的原理?
- 70.说下你对Hash算法的理解?
- 71.说一下ES用到了什么数据结构?
- 72.说一下你对树的理解(二叉查找树的优缺点,平衡树的优缺点,红黑树的优缺点,B-树的优缺点 ,B+树的优缺点)
- 73.HashMap底层用到了那些数据结构?为什么要用到这些结构?为什么要用到链表结构?为什么要用到红黑树?链表和红黑树在什么情况下转换的?
- 74.HashMap在什么情况下扩容?HashMap如何扩容的?
- 75.什么是Hash冲突?
- 76.HashMap是如何Put一个元素的?
- 77.HashMap是如何Get一个元素的?
- 78.还有哪些解决Hash冲突的方式?
- 79.LinkedHashMap与HashMap的关系?
- 80.HashSet和HashMap是什么关系?
- 81.TreeSet底层用到了什么结构来实现?
- 82.TreeSet默认是如何排序的?如何自定义排序规则?
- 83.手写一个冒泡排序
- 84.手写一个二分查找
- 85.线程的三种创建方式?
- 86.ConcurrentHashMap原理?
- 87.说一下常见的数据结构,以及他们的特点?
- 88.ArrayList和 LinkedList的区别,使用的时候如何选择?
- 89.常见的设计模式,哪些地方涉及到这些设计模式?
- 90.单例有几种实现方式?
- 91.讲一讲JDK动态代理如何实现?
- 92.事务隔离级别主要解决什么问题?
- 93.Mysql的事务隔离级别有哪些,每种隔离级别能解决什么问题?
- 94.事务的隔离级别是如何实现的?(InnoDB事务隔离的实现原理是什么)
- 95.MVCC机制是什么?
- 96.Redis 持久化存储方案?
- 97.什么是事务?
- 98.事务的四大特性?
- 99.InnoDB如何保证原子性和持久性的?
- 100.解释一下数据库丢失更新问题,如何解决?
-
会从较为基础的逐渐递进,希望对大家有帮助,保护发际线,从你我开始
1.String和StringBuilder和StringBuffer的区别
String:是不可变得字符序列,底层是’private final char’
StringBuilder:可变字符序列,效率较高,但是线程不安全
StringBuffer:可变字符序列,效率低,但是线程安全

2.String为什么不可变StringBuilder为什么可变
从String类的源码中可以看到,String是通过char value[]保存字符的。而且声明为private final,并且不提供我们写value的接口。所以String类不可变。
而StringBuilder是底层是一个char数组,而且没有被final,初始化容量应该为16。
3.StringBuilder为什么线程不安全StringBuffer为什么不安全 , 什么场景下使用StringBuilder什么场景使用StringBuffer
StringBuffer中的方法都加了synchronized关键字
多线程不要用StringBuilder,使用StringBuffer,StringBuilder的效率要StringBuffer高。
4.HashMap底层用到了什么数据结构?
JDK1.7及之前:数组+链表
JDK1.8:数组+链表或红黑树
基本架构是使用得数组结构,但是如果发生哈希冲突得时候,就会启动链表,当链表结构长度大于8时,就转换为红黑树
数组的特点:查询效率高,插入、删除效率低。
链表的特点:查询效率低,插入、删除效率高。
5.Spring、SpringMVC、SpringBoot、SpringCloud的区别
spring: 是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc)、业务层(Ioc)、持久层(jdbcTemplate)等都提供了多种配置解决方案
springMVC: 是spring基础之上的一个MVC框架,主要处理web开发的路径映射和视图渲染,属于spring框架中WEB层开发的一部分
springBoot:(简化了spring配置流程)框架相对于springMVC框架来说,更专注于开发微服务后台接口,不开发前端视图,同时遵循默认优于配置,简化了插件配置流程,不需要配置xml,相对springmvc,大大简化了配置流程
springCloud:(用于微服务的服务治理)大部分的功能插件都是基于springBoot去实现的,springCloud关注于全局的微服务整合和管理,将多个springBoot单体微服务进行整合以及管理; springCloud依赖于springBoot开发,而springBoot可以独立开发
6.介绍一下Spring框架的组成

7.说一下你对IOC的理解
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
8.说一下你对AOP的理解
AOP即Aspect Oriented Program,面向切面编程,是面向对象编程(OOP)的一种增强模式,可以将项目中与业务无关的,却为业务模块所共同调用的非核心代码封装成(比如事务管理、日志管理、权限控制等等)一个个切面,然后在运行的时候通过动态代理的方式织入到核心业务功能中。
9.BeanFactory和ApplicationContext有什么区别
BeanFactory:
是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;
ApplicationContext:
应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;
两者装载bean的区别:
BeanFactory:
BeanFactory在启动的时候不会去实例化Bean,有从容器中拿Bean的时候才会去实例化(类似懒加载);
ApplicationContext:
ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化(迫切加载);
10.Spring的Bean被指定为singleton以及prototype有什么区别?
singleton: Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。简单的说:当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean,并且默认使用得就是这种单例模式。
prototype: 每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作。
有状态的bean都使用prototype作用域,而对无状态的bean则应该使用singleton作用域。可以理解为我们singleton是一种单线程,每次操作都会带着上次操作以后得状态,很危险!
11.Spring的Bean懒加载和非懒加载有什么区别
懒加载:对象使用的时候才去创建。节省资源,但是不利于提前发现错误;
非懒加载:容器启动时立马创建。消耗资源,但有利于提前发现错误
12.Spring的依赖注入方式有哪些?
一:目前使用最广泛的 @Autowired:自动装配
二:setter 方法注入
这是最简单的注入方式,假设有一个SpringAction类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口)
三:构造器注入
这种方式的注入是指带有参数的构造函数注入,假设创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第二种注入方式,这里的注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来
四:静态工厂的方法注入
静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取
五:实例工厂的方法注入
实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法
13.有哪些方式可以注册一个Bean到容器中
一,通过xml配置文件
二,通过注解,例如@Controller、@Component、@Service,@Bean等
三,通过实现FactoryBean接口
四,通过@Import注解
五,向BeanDefinitionRegistry 注册表中直接注册一个bean
14.将一个类声明为Spring的Bean的注解有哪些?
@Component :通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,可以使用
@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
@Service :对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
@Controller : 对应 Spring MVC控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
15.Spring的IOC启动原理?
- 加载配置XML;或者配置类
- 解析配置(xml Dom解析);或者扫描要被管理得类(@Service等等)
- 对Bean进行定义或者封装成BeanDefinition
- 通过BeanDefinitionRegistry注册BeanDefinition到一个ConcurrentHashMap中
- 如果Bean是迫切初始化就会根据BeanDefinition通过反射创建Bean得实力,缓存到一个HashMap中
- 当通过容器getBean得时候,如果是单例得,就会从缓存得Map中获取Bean,获取不到就用反射创建,并添加到缓存,返回
- 当通过容器getBean得时候,如果不是单例得,就会使用反射重新创建Bean得实例返回
16.Spring是如何管理事务的?
Spring的事务机制包括声明式事务和编程式事务。
编程式事务管理:Spring推荐使用TransactionTemplate,实际开发中使用声明式事务较多。
声明式事务管理:将我们从复杂的事务处理中解脱出来,获取连接、关闭连接、事务提交、回滚、异常处理等这些操作都不用我们处理了,Spring都会帮我们处理。
声明式事务管理使用了AOP面向切面编程实现的,本质就是在目标方法执行前后进行拦截。
Spring事务管理主要包括3个接口,Spring的事务主要是由他们三个共同完成的。
1)PlatformTransactionManager:事务管理器–主要用于平台相关事务的管理
2)TransactionDefinition:事务定义信息–用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用
3)TransactionStatus:事务具体运行状态–事务管理过程中,每个时间点事务的状态信息。
@Translation
- 首先Spring使用得是AOP来管理事务得,实现原理是动态代理
- 事务本身是MySQL得,Spring只是通过JDBC得API去操作MySQL得事务命令、提交、回滚等
- Spring只是制定了事物得一些API,实现还是JDBC
- 通常我们得Service需要打@Translation得注解,Spring扫描这样得标签,就知道那些类、方法需要事务
- 使用Aop思想,基于动态代理得原理来为这些Service生成代理类
- 代理类会对原生得Service做增强,比如会在代理类中执行开启事务(设置手动提交),然后执行原生Service中得方法,接下来就是手动提交事务,如果失败了就执行回滚
17.Spring用到了哪些设计模式?
1、代理模式:在AOP和remoting中被用的比较多
2、单例模式:在spring配置文件中定义的bean默认为单例模式
3、模板方法模式:解决代码重复问题
4、前端控制器模式:spring提供了DispatcherServlet来对请求进行分发
5、依赖注入模式:贯穿于BeanFactory和ApplicationContext接口的核心理念
6、工厂模式:BeanFactory用来创建对象的实例
18.RequestMapping 和 GetMapping有什么区别?
@RequestMapping可以指定GET、POST请求方式
@GetMapping等价于@RequestMapping的GET请求方式
19.SpringMVC怎么样设定重定向和转发的
1.地址栏
转发:不变,不会显示出转向的地址
重定向:会显示转向之后的地址
2.请求
转发:一次请求
重定向:至少提交了两次请求
3.数据
转发:对request对象的信息不会丢失,因此可以在多个页面交互过程中实现请求数据的共享
重定向:request信息将丢失
4.原理
转发:是在服务器内部控制权的转移,是由服务器去请求,客户端并不知道是怎样转移的,因此客户端浏览器的地址不会显示出转向的地址。
重定向:是服务器告诉了客户端要转向哪个地址,客户端再自己去请求转向的地址,因此会显示转向后的地址,也可以理解浏览器至少进行了两次的访问请求。
(1)转发:在返回值前面加"forward:",
譬如"forward:user.do?name=method4"
(2)重定向:在返回值前面加"redirect:",
譬如"redirect:http://www.baidu.com"
20.SpringMVC如何对时间格式的参数进行格式化?有哪些方式?
方式一:在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。
方法二:使用@DateTimeFormat 注解方式,建议使用此方式,简单且代码量少
21.SpringMVC常用的注解有哪些
@ResponseBody:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
@PathVariable:用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数
@GetMapping:是@RequestMapping(method = RequestMethod.GET)的缩写。
@ControllerAdvice:统一处理异常
@Controller:用来定义控制器类
@RestController:是@ResponseBody和@Controller的合集
@RequestParam:用于将请求参数区数据映射到功能处理方法的参数上
22.如何定义SpringMVC的拦截器
第一种通过实现HandleInterceptor接口,或者继承HandleInterceptor接口的实现类HandleInterceptorAdapter来定义;
第二种通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。
拦截器的定义:以实现HandleInterceptor接口为例
(1)、preHandle()方法
该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当返回值为true时,表示继续向下执行;当返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。
(2)、postHandle()方法
该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
(3)、afterCompletion()方法
该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
注册拦截器有两种:springMVC需要在XML中进行配置,而spring boot需要写一个配置类WebMvcConfigurer
23.HandlerInterceptor和HandlerInterceptorAdapter的区别
一、相同
都是用来实现Spring拦截器
可以作为日志记录和登录校验来使用
二、区别
HandlerInterceptorAdapter需要继承,HandlerInterceptor需要实现
注:在JDK1.8以后HandlerInterceptorAdapter过时了,因为在HandlerInterceptor中提供了default方法
24.SpringMVC的执行原理
看图说话!!!!!

25.SpringMVC的Controller是单例还是多例,有没有并发安全问题,如何解决?
controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。
正因为单例所以不是线程安全的。
解决方法:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。
3、在Controller中使用ThreadLocal变量,ThreadLocal底层是使用map方法,将当前线程作为key值传入,而设置得value作为value来实现线程之间得隔离
26.Spring Boot有哪些优点
1、简化开发流程,减少时间,实现快速开发
2、避免大量jar包得导入与冲突问题,方便管理
3、减少配置,对于配置类,可以使用@configuration注解配置类;通过注解@Bean添加类;通过@Autowired注入需要得类,使用spring的自动装配
4、Spring Boot内嵌有tomcat,方便使用
27.SpringBoot如何做全局异

最低0.47元/天 解锁文章
2092





