嗨各位粉宝们,图图目前已开启2020春季求职面试专场,及时为大家更新收录最新的Java面试题,以及线上帮助各位童鞋整理简历,帮助各位童鞋在新年伊始可以顺利找到一份满意的工作。
v Spring
² Spring的概念
Spring是一种多层的J2EE应用程序框架,其核心就是提供一种新的机制管理业务对象及其依赖关系。它是一种容器框架,用于创建bean,维护bean之间的关系,它可以管理web层,持久层,业务层等,可以配置各个层的组件并且维护各个层的关系。
² Spring原理
Spring是一个开源框架,为简化java企业级应用开发而生。Spring可以使得简单的JavaBean实现以前只有EJB才能实现的功能。Spring是遵从约定大于配置的框架,主要的核心在于依赖注入和控制反转;
² Spring的核心:
Ø 控制反转(IOC):
Spring容器使用工厂模式为我们创建了所需要的对象,不需要我们直接的过度耦合的new或者getInstance等构造一个对象实例。实现解耦的能力。这是控制反转的思想。主要表现在,当我们使用Spring Config XML文件时,在一面以标签的形式申明对象id和类路径。spring应用上下文加载该配置文件时读取相关配置时,通过调用工厂类和反射机制去创建该对象。不需要我们创建,直接调用spring提供的对象就可以了。
Ø 依赖注入(DI):
Spring使用JavaBean对象的set方法或者带参数的构造方法为我们创建所需对象时将其所属性自动设置所需要的值的过程,就是依赖注入的思想。
Ø 面向切面编程(AOP):
面向切面编程AOP的底层是动态代理,Spring提供了两种动态代理,一个采用接口的JDK动态代理,一个采用类的CGLIB方式实现动态代理。
² Spring特点
Ø 轻量级:
轻量级是针对重量级容器(EJB)来说的,Spring的核心包就不到1M大小,而使用Spring的核心包所需的资源也很小,所以可以在小型设备中使用。
Ø 非入侵式:
Spring目标是一个非入侵式的服务框架。原因是所有框架都是提供大量的功能供用户去使用,从而简化开发时间和成本,但由于大量的使用了框架的API,使应用程序和框架发生了大量的依赖性,无法从框架中独立出来,更加无法使程序组件在其他程序中使用。
Ø 容器:
Spring提供了容器功能,容器可以管理对象的生命周期、对象与对象间的关系、我们可以通过编写XML来设置对象关系和初始值,这样容器在启动之后,所有的对象都直接可以使用,不用编写任何编码来产生对象。Spring有两种不同的容器:Bean工厂以及应用上下文
² Spring工作原理
Spring内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象和调用对象里的方法的。
Spring还有一个核心就是AOP面向切面编程,可以为某一类对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。
Spring目地就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的
² Spring中的设计模式
单例模式——spring配置文件中的bean,@Bean注解的方法,@Autowire、@Controller、@RestController、@Service、@Component注解的方法默认为单例模式。
· 代理模式——动态代理使用者AOP
模板方法模式——用来解决代码重复问题。比如:RestTemplate、JmsTemplate、JpaTemplate;
工厂模式——使用工厂模式解决创建对象不会对用户暴露创建逻辑的问题。Spring使用BeanFactory来创建对象的实例。
² Spring的常用注解
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。@Scope注解 作用域@Lazy(true) 表示延迟初始化@Service用于标注业务层组件、 @Controller用于标注控制层组件(如struts中的action)@Repository用于标注数据访问组件,即DAO组件。@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。@Scope用于指定scope作用域的(用在类上)@PostConstruct用于指定初始化方法(用在方法上)@PreDestory用于指定销毁方法(用在方法上)@DependsOn:定义Bean初始化及销毁时的顺序@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。@PostConstruct 初始化注解@PreDestroy 摧毁注解 默认 单例 启动就加载@Async异步方法调用
v SpringMVC
² SpringMVC的概念
SpringMVC框架是以请求为驱动,围绕Servlet设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是DispatcherServlet,它是一个Servlet,顶层是实现的Servlet接口。
² SpringMVC的工作原理
用户发送请求至前端控制器DispatcherServlet。
DispatcherServlet收到请求调用HandlerMapping处理器映射器。
处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
DispatcherServlet调用HandlerAdapter处理器适配器。
HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
Controller执行完成返回ModelAndView。
HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
ViewReslover解析后返回具体View。
DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
DispatcherServlet响应用户。
v SpringBoot
² SpringBoot的概念
SpringBoot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
² SpringBoot的优点
Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。
Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。
Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
Spring Boot提供一系列端点可以监控服务及应用,做健康检测。
² Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解。
主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,
如关闭数据源自动配置功能:@SpringBootApplication(exclude =
{ DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
² 运行 Spring Boot 有哪几种方式?
1)打包用命令或者放到容器中运行
2)用 Maven/Gradle 插件运行
3)直接执行 main 方法运行
v Redis
² Redis 简介简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
² Redis 常见数据结构String、List、Set、Sorted Set、hashes
Ø String常用命令: set,get,decr,incr,mget 等。String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。常规key-value缓存应用;常规计数:微博数,粉丝数等。
Ø Hash
常用命令: hget,hset,hgetall 等。Hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。比如我们可以Hash数据结构来存储用户信息,商品信息等等。
Ø List
常用命令: lpush,rpush,lpop,rpop,lrange等list 就是链表,Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用Redis的 list 结构来实现。
Redis list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
另外可以通过 lrange 命令,就是从某个元素开始读取多少个元素,可以基于 list 实现分页查询,这个很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能高。
Ø Set
常用命令: sadd,spop,smembers,sunion 等。set 对外提供的功能与list类似是一个列表的功能,特殊之处在于 set 是可以自动排重的。
当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。可以基于 set 轻易实现交集、并集、差集的操作。
² 使用Redis有哪些好处?
速度快,数据是存储在内存中的有着丰富的数据类型,支持String、List、Set、Sorted Set、hashes支持事务,操作都是原子性有着丰富的特性,可以做缓存,消息等。
² Redis 有哪些适合的场景?
会话缓存,最常用的一种使用 Redis 的情景是会话缓存全页缓存,比如存储用户认证token队列,Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作排行榜/计数器,Redis 在内存中对数字进行递增或递减的操作实现的非常好发布/订阅,是 Redis 的发布/订阅功能
² Redis 集群最大节点个数是多少?
16384 个
² 为什么redis需要把数据放在内存中?
redis为了达到最快的读写速度将数据读到内存中,并通过异步的方式读写磁盘,所以redis的性能会非常的好,可以做到快速的读写。
² 怎么理解redis的事务?
事务所以的命令都是有顺序执行的,事务在执行过程中,不会被其他命令请求打断。所以事务是一个隔离的操作机制,事务也是一个原子的操作,执行事务要么全部执行,要么全部不执行。
² Redis怎么做内存优化?
尽可能使用散列表,因为散列表使用的内存会比较少,所以在使用的过程中尽可能将你的数据抽象到散列表中。比如说查询一个用户的数据,不要讲姓名,邮箱,地址单独设置一个key,而是应该讲所以信息保存到一个信息存储起来。
² 为什么Redis单线程还是那么快?
redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销
² Redis持久化的几种方式
快照AOF虚拟内存
v 多线程
² 线程的概念
进程process是操作系统中运行的一个任务,占有一定的内存资源;线程thread是进程中包含的一个或多个执行单元,归属于进程
² 多线程的应用场景
· 一个程序需要同时完成多个任务时
· 多个线程效率更高的情况下,比如下载
² 线程池的好处
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资
源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
v 面试题汇总部分
² 如何处理项目的高并发、大数据
HTML静态化
如果网站的请求量过大,我们可以将页面静态化提供访问来缓解服务器压力,能够缓解服务器压力加大以及降低数据库数据的频繁交换。适合于某些访问量过大,但是内容不经常改变的页面,如首页、新闻页等
文件服务器
顾名思义,文件服务器就是将文件系统单独拿出来提供专注于处理文件的存储访问系统,甚至于对个文件服务器。因为对于图片这种资源的访问存储是web服务最耗资源的地方,将文件服务器单独部署既可以将压力转移,交给专门的系统处理,又可以分担风险,如果图片服务器出现问题,那么主服务器能够保证正常,顶多就是文件请求不到。
负载均衡
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其原理就是将大量工作分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
反向代理
客户端直接访问的服务器并不是直接提供服务的服务器,它从别的服务器获取资源,然后将结果返回给用户。
动静分离
所谓动静分离就是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。上面的文件服务器就是动静分离的一部分。
动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。
对于相同功能的sql,如果数据库的sql没有做过优化和做过优化的sql比较起来,其处理能力完全是天壤之别,其差距可以有几倍甚至几十上百上千的速度差距、资源消耗差距。所以对于一个优秀的web应用,sql优化是必须做的。
(1) 对查询进行优化,应尽量避免全表扫描
(2) 应尽量避免在 where 子句中对字段进行 null 值判断。
(3) 应尽量避免在 where 子句中使用!=或<>操作符。
(4) 应尽量避免在 where 子句中使用 or 来连接条件
(5) in 和 not in 也要慎用
(6) 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率
对于缓存我想大家都不陌生,缓存可以让我们将一些有时效性的、经常访问的、不便于存储数据库等的数据,我们可以将数据存储在专门的用于缓存的应用程序中,如果有必要,还可以将缓存应用服务器单独部署,如果数据量过大,我们还可以组成缓存服务器集群,比如:cache、redis等都是比较专注于缓存数据的。
读写分离是为了提供程序的性能,随着用户的增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作。主数据库提供写操作,从数据库提 供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。Quest SharePlex就是比较牛的同步数据工具,听说比oracle本身的流复制还好,mysql也有自己的同步数据技术。mysql只要是通过二进制日志来复制数据。通过日志在从数据库重复主数据库的操作达到复制数据目的。这个复制比较好的就是通过异步方法,把数据同步到从数据库。
所谓的活跃数据就是经常用到的数据,比如经常活跃的用户数据等。不活跃数据,比如好长时间不登录的用户数据,还有几个月前的数据等等。
高并发情况可以将多个查询请求合并到一个。同一查询,同一返回处理,降低短时间内的数据库请求数量。高并发且频繁修改的可以暂存缓存中,然后统一进行修改。
通常对于一个服务器的处理的瓶颈大多在于数据库的瓶颈,对于大数据量的请求处理,单个数据库处理能力有限,所以我们可以部署多个数据库,然后将数据库组成一个集群。
² 索引
Ø 索引的作用索引的目的在于提高查询效率
Ø 索引的影响
在表中有大量数据的前提下,创建索引速度会很慢
在索引创建完毕后,对表的查询性能会大幅度提升,但是写性能会降低
Ø 常用索引
#创建普通索引
CREATE INDEX index_name ON table_name(col_name);
#创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name(col_name);
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
#创建普通组合索引
CREATE INDEX index_name ON table_name(col_name_1,col_name_2);
² HashTable和HashMap区别
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
HashMap是线程不安全的,在多线程环境下会容易产生死循环,但是单线程环境下运行效率高;Hashtable线程安全的,很多方法都有synchronized修饰,但同时因为加锁导致单线程环境下效率较低。
² HashMap和LinkedHashMap的区别
HashMap,LinkedHashMap,TreeMap都属于Map
主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值
重复。
HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMapLinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序
TreeMap
可以用于排序
linkedMap在于存储数据你想保持进入的顺序与被取出的顺序一致的话,优先考虑LinkedMap,hashMap键只能允许为一条为空,value可以允许为多条为空,键唯一,但值可以多个。linkedMap键和值都不可以为空