没有合适的资源?快使用搜索试试~ 我知道了~
首页JAVA面试重点话术(张大大吐血整理).doc
JAVA面试重点话术(张大大吐血整理).doc
需积分: 15 1.1k 浏览量
更新于2023-05-26
评论 2
收藏 172KB DOC 举报
springmvc工作原理、堆和栈、锁机制、redis、dubbo、zookerper问题分析,有都是一些面试官爱问的问题,有了它在面试官面前不用紧张,珍藏版哦
资源详情
资源评论
资源推荐

1 springmvc 工作原理:
tomcat 启动时,也是先加载 web.xml,找到 spring mvc 的前端总控制器 DispatcherServlet,并
且通过 DispatcherServlet 来加载相关的配置文件信息。
当浏览器发出一个请求之后,首先找到 DispatcherServlet,通过这个控制器和代码中的
requestMapping 注解找到对应的 controller 中的方法,参数直接通过方法参数接收就可以,
然后调用 service、dao 操作数据库,返回数据。如果页面跳转,controller 的方法可以返回
ModelAndView 和 string 类型,再通过 spring-mvc 配置文件中的视图解析器找到对应的页面。
数据可以用 request 或 ModelAndView 返回到页面。如果是 ajax 请求,可以直接返回 List 或
对象,加上 responseBody 注解,进行返回。
2 堆和栈
栈的空间比较小,存放函数的参数值,局部变量的值等。
堆的空间比较大,用于存放 new 的对象。
与 C++不同,Java 自动管理栈和堆,程序员不能直接地设置栈或堆。
堆(数据结构):堆可以被看成是一棵树,如:二叉树。
栈(数据结构):一种先进后出的数据结构。
3 Java 集合
Java 里边主要有两种集合,collection 接口和 map 接口,其中 collection 下又包含 list 和 set
两个子接口;
List 子接口:有序,可以有重复元素。和数组类似,List 可以动态增长,查找
元素效率高,相对的插入删除元素效率低,因为会引起其他元素位置改变。
Set 子接口:无序,不允许重复。检索元素效率低下,删除和插入效率高,插入
和删除不会引起元素位置改变。set 集合中的元素不按特定方式排序,只是简
单的把对象加入集合中,就像往口袋里放东西。
List 接口下有三个实现类 ArrayList 、LinkedList 和 Vector
Vector 是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用

ArrayList 实现一个动态数组,它的规模可变并且能像链表一样被访问。它提供的功能
类似 Vector 类但不同步,它是以 Array 方式实现的 List,允许快速随机存取。特点是读
快改慢;
LinkedList 实现一个链表,提供最佳顺序存取,适合插入和移除元素。由这个类定义的
链表也可以像栈或队列一样被使用。提供最佳顺序存取,适合插入和移除元素。特点是改
快读慢
Set 接口有 HashSet和 TreeSet两个实现类
HashSet能够快速定位一个元素,
要注意的是:存入 HashSet 中的对象必须实现 HashCode()方法;ð
TreeSet将放入其中的元素按序存放。它实现的是 SortedSet 接口,也就是加入了对象
比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。
Map 接口的实现类主要有 HashMap、HashTable 和 TreeMap;
当元素的顺序很重要时选用 TreeMap,当元素不必以特定的顺序进行存储时,使用
HashMap。HashMap 不是同步的,Hashtable 是同步的,但 Hashtable 不推荐使用,
因为 HashMap 提供了所有类似的功能,并且速度更快。当需要在多线程环境下使用
时,HashMap 也可以转换为同步的。HashMap 没法保证映射的顺序一直不变,但是作为
HashMap 的子类 LinkedHashMap 可以。
HashMap 可以通过 Map m = Collections.synchronizedMap(hashMap)来达到同步的效
果。
4 锁机制:
4.1 sql 锁:
悲观锁:就是考虑问题很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数
据的时候都会上锁;
实现:sql 语句后边加上 for update
例子:Select id,nam from biao for update
乐观锁:就是考虑问题很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁
实现:在表里边加一个 vesion
例子:
Select max(nub) ,version from biao
Update biao set nub=nub+1,version=vsersion+1 where id=id and version =version

4.2 方法锁:
方法锁主要包括:synchronized 锁和 lock 锁
区别:
1)Lock 是一个接口,而 synchronized 是 Java 中的关键字;
2)synchronized 当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等
待,等待获取锁的线程释放锁,不能够响应中断,(释放:1 执行完线程自动释放 2 发生异常
jvm 让线程释放)((比如调用 sleep 方法)),这样的好处是不会导致死锁现象发生。
Lock 锁,可以不让等待的线程一直无期限地等待下去,比如只等待一定的时间或者响应中断。
但 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此
使用 Lock 时必须在 try{}catch{}块中进行,需要在 *nally 块中释放锁;
3)通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时
(即有大量线程同时竞争),此时 Lock 的性能要远远优于 synchronized。所以说,在具
体使用时要根据适当情况选择。
在并发量比较小的情况下,使用 synchronized 是个不错的选择,但是在并发量比较高
的情况下,其性能下降很严重,此时 ReentrantLock(可重入锁,唯一实现了 Lock 接口
的类)是个不错的方案。
5 Reids
Redis 是一个继 memcached 后的又一个第三方缓存数据库,他比 memcached 强大很
多,支持更多的数据类型(String、list、set、sort set、hash),支持持久化,支持集
群;Redis 虽然支持持久化,但是他并不适合持久化的保存数据。因为他不是很稳定。但是由
于他是保存在内存中,读取速度非常快,所以在项目中一般都用它作为数据库和应用程序直接
的中间层来使用,已减轻数据库压力,提高运行效率。
我们项目中很多地方用到了 redis;比如商品的三级分类、省市县、关于我们、联系我
们、友情链接,常见问题等经常查询但是不经常改变的数据.redis 还可以在 tomcat 集群里
边实现 session 的共享。由于他的单线程的,所以在电商平台里边也经常用他做“防止超卖”,
生成规则的商品编号等。还有就是购物车也用到了 redis
代码中,我们一般都通过 spring 整合 redis 官方提供的 jedis 工具包来操作
redis。可以是单机版,也可以是集群。Redis 本身就支持集群操作 redis_cluster,另外
redis 还支持主从复杂,还有他独特的哨兵模式,在主服务器宕机时,从服务器可以自动转换

为主服务器。另外,他也有他的分片机制,就像 mysql 的水平分表设计,数据量大时,可以把
数据存储到不同的库中,来减轻 redis 负担。
Redis 的持久化方式主要有 2 种,RDB 和 AOF,RDB 是一种快照方式,默认每隔 5 分钟创
建一个快照副本,这种方式占用空间大,而且会丢失间隔时间 5 分钟之内的数据,但是他适合
做备份,恢复时,可以根据需要恢复任意间隔时间点的数据。AOF 是一种日志的持久化记录方
式,每秒钟,都把 redis 中新增的数据记录到日志文件中,这种方式只有一个文件,占用空间
少,最多丢失 1 秒内的数据。相对比较好,但是如果想要恢复 5 分钟或 10 分钟前某个时间点
的数据,就不行了。所以实际项目中,我们一般会两种方式同时使用。如果搭建集群的话,还
可以通过集群互相备份数据,只要集群不同时挂掉,单个 redis 就可以从集群中的其他服务器
获取到最新数据。
还有就是 ,由于 redis 不是很稳 定,有时候会发生“ 穿透”和“雪崩”;
redis,都是按照 key 去缓存查询,如果不存在对应的 value,就应该去数据库
查找。如果 key 对应的 value 是一定不存在的,并且对该 key 并发请求量很
大,就会对后端系统造成很大的压力。这就叫做缓存穿透。当缓存服务器重启
或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统
(比如 DB)带来很大压力,这就叫“缓存雪崩”。解决办法是,对查询结果为空的
情况也进行缓存,并且给缓存设置不同的有效期。当然 redis 容灾的最有效的
方法还是搭建集群。
6 Solr
Solr 是一个基于 Lucene 开发的全文搜索引擎,项目中一般用它做首页的全文搜索或
者做文件管理系统中的文件检索,因为他提供了分词的支持,同时采用文件存储数据,所
以无论是查询速度还是匹配精确度方面,都比数据库的 like 查询方便了很多。比如:电商
网站上,用户想买手机,输入“苹果手机”,但是系统中录入的是 ipone 手机,那么用 like 查
询就很难匹配到,但 lucene 就可以解决这个问题。
使用时,Lucene 官方紧紧提供了核心实现的 jar 包,我们只能通过 api 文档,自己实
现创建索引和查询的逻辑,并进行优化处理,开发比较繁琐,但比较基础,更灵活,做文档
的检索时可能相对更好点。而 solr 是 Apache 开发的一个开源的 web 工程,他帮我们实现了
创建索引、查询等操作,经内部进行了一定的优化,然后以 restful 风格对外提供了接口。
并且提供了 solrj 的 sdk 工具包,方便 Java 开发者直接使用。一般做电商等网站的全文搜
索,我们使用时,只需要官方下载到 solr 工程的 war 包,根据我们的实际情况,修改
solrhome 、solrconfig.xml 和 schema.xm 文件,简单配置一下使用的数据库和创建索引的 sql
和字段,然后把 war 包进行部署就可以了。可以通过他提供的页面进行创建和查询索引的
操作。也可以在项目中集成 solrj 的 jar 包,直接调用他的方法,进行创建索引和查询的操

作。
Solr 支持高亮显示搜索关键字,支持匹配权重配比(无特殊排序要求时,默认根据查询相关
度来进行排序,可以在配置文件中配置,通过权重配置相关度) 、支持分页,支持自动分词
等。我们一般都采用 IK 分词器,代替他默认的标准分词器。因为 IK 对中文的支持比较
好。如果想要支持拼音,还可以使用它的拼音分词器。Solr 也支持集群部署,官方提供了
SolrCloud 的部署方案,一般通过 solrcloud+zookeeper 实现,zookeeper 在 solr 集群中主要有
两大作用:1 负载均衡 2 集中式配置管理。需要注意的是:zookeeper 一般采用选举机制,
所以一般都是 2n+1(奇数)台。
另外由于 solr 查询时,不是直接查询数据库,而是开始时,先把数据库中的数据同步到索
引文件中,查询时,直接查询索引文件。索引数据库数据修改时,需要同时同步到 solr 的
索引文件中,也就是创建索引。创建索引分为全量创建和增量创建。可以通过配置文件实
现自动增量更新,自动增量更新可定时将数据库中的数据导入到 solr 索引库中,并可定时
重建索引库,合并小索引文件为大的索引文件。除了 solr 以外,最近又出了一个搜索引擎
叫 ElasticSearch,我简单了解了一下,他和 solr 一样,也是一个基于 Lucene 的,rest 风格
的,分布式搜索引擎。Solr 特点是:查询快,但更新索引时慢(即插入删除慢),对用于电
商等提前录入好数据,之后查询特别多的应用;而 ElasticSearch 简称 ES 建立索引快、查询
相对慢点,但综合上表现为实时性查询快,用于新浪了,facebook 了等搜索。
1、zookerpper 的作用;
2、solr、Lucene、es 的区别;
3、solr 集群搭建主要步骤,和集群方案;
4、solr 高亮和分页
5、solr 权重配置;
6、索引创建;全局索引和增量索引;
7、solr 部署主要步骤;
8、solrhome
9、solrconfig.xml,主要定义 solr 的处理程序(handler)和一些扩展程序;
solrconfig.xml 文件不仅指定了 Solr 如何处理索引、突出显示、分类、搜索以及其他请求,
还指定了用于指定缓存的处理方法的属性,以及用于指定 Lucene 管理索引的方法的属性。
10、schema.xml,主要定义索引的字段和字段类型。
fieldtype、Fields、copyField、dynamicField
7 数据库比较
1、 首先主要是关系型数据库、nosql 数据库和缓存数据库的区别;我觉的:
关系型数据库(mysql、Oracle)就想当于一个储物柜,里边分了各种小格子,把各种数据
有序的保存在里边,查询时非常方便;有比较完善的 sql 语句;
mysql 免费开源,自动提交事务,是基于表级别的一个事务,而 Oracle 不自动提交,是
基于行级别的事务;mysql 安装包小,使用简单,Oracle 安装包较大,还会收费,更适
合于大数据的处理、并发量高;
剩余28页未读,继续阅读







安全验证
文档复制为VIP权益,开通VIP直接复制

评论0