尚硅谷 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中当实体类中的属性名和表中的字段名不一样,怎么办?(三种解决方案)

  1. 写sql语句时起别名
  2. 在MyBatis的全局配置文件中开启驼峰命名规则(前提只是将数据库中下划线映射)
  3. 在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:分布式版本控制工具

  1. 创建分支

  2. 切换分支

    一步完成:git checkout -b <分支名> #直接就完成了创建,并切换过去了

  3. 合并分支

    先切换到主干 git checkout master
    git merge <分支名>

  4. 删除分支

    先切换到主干 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的四大算法:

  1. 引用回收算法(对象有引用,就不回收,已淘汰,无法处理循环引用)
  2. 复制算法(发生在YG、效率高,无碎片,占空间)
  3. 标记清楚(发生在OG、省空间,产生碎片)
  4. 标记压缩(OG、成本高)
  5. 标记清除压缩(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搜索服务器基础上开发,高性能的企业级搜索服务。【它们都是基于分词技术构建的倒排索引方式进行查询】
区别:

  1. 当实时建立索引的时候,solr会产生io阻塞,而es则不会,es查询性能高于solr。
  2. 在不断动态添加数据的时候,solr的检索效率会下降,es则不会。
  3. Solr利用zk进行分布式管理,es自身带有分布式系统管理功能。Solr的本质是web项目,需要部署到web服务器上,启动服务器时需配置solr。
  4. Solr支持更多的格式数据[xml、json、csv],而es仅支持json文件格式。
  5. Solr是传统搜索应用的有力解决方案,但是es更适合新兴实时搜索应用。【solr适合已有数据搜索时,效率更好;需要动态增添数据时,es效率更高】
  6. solr的观望提供功能更多,es更注重核心搜索功能,高级功能需要三方集成。
  • Solr集群图
    11
    在这里插入图片描述

  • ElasticSearch集群图
    在这里插入图片描述

三、单点登录实现过程?

单点登录:一处登录、多处使用
(前提:单点登录多使用在分布式系统中)
【京东:单点登录是将token放入到cookie中】

四、购物车实现过程?

  • 购物车跟用户的关系!
    无论买多少商品,一个用户必须对应一个购物车。单点登录在购物车之前。
  • 跟购物车有关操作
  1. 添加购物车
    用户未登录:数据保存到Redis【京东将未登录购物车放在redis中,给未登录用户存储唯一标识uuid,保存用户未登录时的购物车信息】、cookie
    用户登录:Redis缓存[hash或string:hset(key,field,value)],读写速度快;保证数据安全性,将数据存到数据库中。
  2. 展示购物车
    未登录状态:直接从cookie中取得数据展示即可
    登录状态:用户一旦登录,必须显示数据库或Redis以及cookie中的购物车综合数据

五、消息队列的使用?

分布式系统中处理高并发的情景。
由于高并发的环境下,来不及同步处理大量请求,则会导致请求发生阻塞。这是使用消息队列的异步通信可以解决问题。

在这里插入图片描述
消息队列弊端:
消息的不确定性,延迟队列,轮询技术来解决该问题即可!(ActiveMQ java)

猜你喜欢

转载自blog.csdn.net/weixin_42838993/article/details/85199169