尚硅谷 Java面试题 第一季 - 20181221
SSM
一、SpringBean的作用域之间有什么区别?
其实就是scope属性里设置singleton
| prototype
两个属性,默认是singleton单例的
prototype是多实例。
其他的request
:每次HTTP请求会创建新的bean,该作用域仅适用于WebApplicationContext环境。
session
:同一个HTTP session共享bean,该作用域仅适用于WebApplicationContext环境。
二、Spring支持的常用数据库事务传播属性和事务隔离级别?
三、SpringMVC解决中如何解决POST请求中文乱码问题
springmvc提供了过滤器CharacterEncodingFilter:这个类有两个变量String类型的encoding、boolean类型forceEncoding默认false,核心方法doFilterInternal,方法中有request.setCharacterEncoding设置请求字符集,设force那个为true的话,可以设置response.setCharacterEncoding。
那么在web.xml里需要配置这一属性:
<!--post方式字符集-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--初始化参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--响应乱码,可设可不设-->
<init-param>
<param-name>force-encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
get方式,修改Tomcat的server.xml中的配置。
四、简单的谈一下SpringMVC的工作流程
springmvc在处理模型数据有两种方式:方式一.返回值是ModelAndView、方式二.在参数中传入Map,Model或者ModelMap;最后都会转换为一个 ModelAndView对象(所以是以request作用域来响应用户)
流程如下图:
总结
请求过来后,先到DispatcherServlet中央处理器,之后它会调用处理器映射器找到HandlerMapping处理器映射器里的方法,返回HandlerExecultionChain对象,这个对象包含了所有的拦截器和处理器。
之后拿到HandlerAdapter处理器适配器,由它找到对应的处理器去调用请求,相当于调用controller之后,会返回ModelAndView对象,这个对象返回到中央处理器。
中央处理器通过我们在springmvc配置文件中配的InternalResourceViewResolver视图解析器,得到视图InternalResourceView。
得到视图之后,调用里边的方法进行渲染视图,将我们的模型数据,在页面给用户呈现出来,响应给用户。
五、MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办?(三种解决方案)
- 写sql语句时起别名
- 在MyBatis的全局配置文件中开启驼峰命名规则(前提只是将数据库中下划线映射)
- 在Mapper映射文件中使用ResultMap自定义映射
Java高级
一、Linux常用服务类相关命令
CentOS 6
- 常用基本命令-进程类
- 注册在系统中的标准化程序
- service 服务名 start
- service 服务名 stop
- service 服务名 restart
- service 服务名 reload
- service 服务名 status
- 通过chkconfig 命令设置自启动程序
- chkcongfig --list #可以查看所有对应服务自启动状态开关
- chkcongfig --level 3 服务名 off #on自启动、off不自启动
运行级别runlevel(centos6),
常用级别3和5
0 停机、1 单用户root状态、2 多用户状态、3 有网多用户状态
、4. 保留、5 图形模式
、6、重启
CentOS 7
- 注册在系统中的标准化程序
- systemctl start 服务名
- systemctl restart 服务名
- systemctl stop 服务名 #示例:停防火墙 systemctl stop firewalld
- systemctl reload 服务名
- systemctl status 服务名
- 查看服务的命令
- systemctl list-unit-files #示例:systemctl list-unit-files |grep firewalld
- systemctl --type service
- 设置自启动/不自启动
- systemctl enable 服务名
- systemctl disable 服务名
二、git分支相关命令
Git:分布式版本控制工具
-
创建分支
-
切换分支
一步完成:git checkout -b <分支名> #直接就完成了创建,并切换过去了
-
合并分支
先切换到主干 git checkout master
git merge <分支名> -
删除分支
先切换到主干 git checkout master
git branch -D <分支名>
工作流:
master分支,分出多个develop分支,并行开发互不影响;出现bug了,可以有master分出一个临时分支,处理完后再合并到master中合并上线;之后将临时分支合并到develop分支,保证版本一致,避免bug重复出现。
开发人员开发完成了,先合并到dev分支,创建测试分支进行测试,没问题了在合并到master上线,之后再和dev合并保证一致。
三、redis持久化几种类型及区别?
两种:
-
RDB(Redis DataBase)快照,将所有内存数据进行
全量保存
;优点:省空间,效率高;缺点:数据量大耗性能,最后一次持久化可能数据丢失 -
AOF(Append Of File)日志,以日志形式来记录每个写操作
增量操作
;优点:备份稳健,可读日志处理误操作;缺点:占更多磁盘,备份慢,占性能
四、Mysql建索引的时机?
MySQL官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构。简而言之,索引本质是数据结构。
优:提高检索
效率,降低数据库IO成本;通过索引列对数据进行排序
,降低排序成本,降低cpu消耗。
劣:降低更新表的速度
,因为更新表时,不仅要保存数据,还要保存索引更新了的索引列字段,不断调整索引信息。
实际上,索引也是一张表
,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
- 创建索引
主键自动唯一、频繁查询字段、外键关联字段、组合索引性价比高、排序字段、统计或分组字段(分组更伤性能)
- 不创建索引
表记录太少、频繁增删改、where用不到字段、过滤性不好字段(例:性别)
五、JVM垃圾回收机制 - GC发生在JVM哪部分,有几种GC,它们的算法是什么?
GC发生在heap堆
中。
GC是分代收集算法
:频繁收集年轻代``Minor GC
、次数较少老年代``Full GC
、永久区不GC
GC的四大算法:
- 引用回收算法(对象有引用,就不回收,已淘汰,无法处理循环引用)
- 复制算法(发生在YG、效率高,无碎片,占空间)
- 标记清楚(发生在OG、省空间,产生碎片)
- 标记压缩(OG、成本高)
- 标记清除压缩(OG、③④混合)
Java项目
一、redis在项目中的使用场景 (各数据类型)
-
String
绑定ip地址,可以记录ip地址的操作。 -
Hash
存储用户信息
【id,name,age】
Hset(key,field,value)
Hset(userKey,id,101)
当我修改用户信息某一项属性的时候,可以直接取出单一的值。
不建议使用String类型
是因为,在反序列化时,会全部序列化出来,会增加IO次数,降低性能。 -
List
实现最新消息的排行
,
还可以利用List的push命令,将任务存在list集合中,同时使用另一个命令,将任务从集合中取出[pop]。
Redis — List 数据类型来模拟消息队列。【电商中的秒杀就可以采用这种方式来完成一个秒杀活动】
-
Set
特殊之处:可以自动排重(非重复)。比如说微博中将每个人的好友存在集合(Set)中
,
这样求两个人的共通好友的操作。我们只需要求交集即可。 -
Zset (SortedSet)
以某一个条件为权重,进行排序。 京东:商品详情的时候,都会有一个综合排名,还可以按照价格进行排名。
二、ES和solr的区别?
它们都是基于Lucene搜索服务器基础上开发,高性能的企业级
搜索服务。【它们都是基于分词技术
构建的倒排索引
方式进行查询】
区别:
- 当实时建立索引的时候,solr会产生io阻塞,而es则不会,es查询性能高于solr。
- 在不断动态添加数据的时候,solr的检索效率会下降,es则不会。
- Solr利用zk进行分布式管理,es自身带有分布式系统管理功能。
Solr的本质是web项目
,需要部署到web服务器上,启动服务器时需配置solr。 - Solr支持更多的格式数据[xml、json、csv],而es仅支持json文件格式。
- Solr是传统搜索应用的有力解决方案,但是es更适合新兴实时搜索应用。【solr适合已有数据搜索时,效率更好;需要动态增添数据时,es效率更高】
- solr的观望提供功能更多,es更注重核心搜索功能,高级功能需要三方集成。
-
Solr集群图
-
ElasticSearch集群图
三、单点登录实现过程?
单点登录:一处登录、多处使用
(前提:单点登录多使用在分布式系统中)
【京东:单点登录是将token放入到cookie中】
四、购物车实现过程?
- 购物车跟用户的关系!
无论买多少商品,一个用户必须对应一个购物车。单点登录在购物车之前。 - 跟购物车有关操作
- 添加购物车
用户未登录:数据保存到Redis
【京东将未登录购物车放在redis中,给未登录用户存储唯一标识uuid,保存用户未登录时的购物车信息】、cookie
用户登录:Redis
缓存[hash或string:hset(key,field,value)],读写速度快;保证数据安全性,将数据存到数据库中。 - 展示购物车
未登录状态:直接从cookie中取得数据展示即可
登录状态:用户一旦登录,必须显示数据库或Redis以及cookie中的购物车综合数据
五、消息队列的使用?
分布式系统中处理高并发的情景。
由于高并发的环境下,来不及同步处理大量请求,则会导致请求发生阻塞。这是使用消息队列的异步通信
可以解决问题。
消息队列弊端:
消息的不确定性,延迟队列,轮询技术来解决该问题即可!(ActiveMQ java)