java面经

1. 搜索服务

  1. solr的具体配置

    先在schema.xml中配置搜索字段需要使用到的域,复制域,动态域,然后在pojo中的各个属性上加上@Filed注解,指明域名称。

  2. 使用的分词器,以及具体使用方法

    我使用的是IK Analyzer分词器。首先将IK分词器的jar包拷贝到solr工程的WEB-INF下的lib目录下,然后将停用词词典,扩展词词典,IK分词器的主配置文件拷贝到WEB-INF下的classes文件夹下。

  3. 怎么完成的solr索引库和数据库中的数据同步

    • 在运营商后台商品审核通过时,就根据商品的id,查询出商品的SKU列表,把此列表保存到solr索引库中即可。

    • 删除同理:在运营商后台删除商品时,将商品id此商品的SKU列表删除即可。

  4. 在做搜索功能的时候有没有遇到什么问题
    在做搜索功能的时候感觉逻辑稍微有些复杂,搜索方法的·····(感觉自己逻辑混乱,说的一团糟,现在自己都不知道自己在说什么)

  5. 搜索服务中用到了activeMQ,具体说一说你是怎么使用的

    • 在运营商后台商品审核通过时,就根据商品的id,查询出商品的SKU列表,得到的结果是一个List,如果用Map的方式发送到ActiveMQ的话,那么被传送的对象必须实现可序列化接口。但是List没有实现。所以解决的办法是,先将List转换成json字符串,然后再将此字符串以点对点的方式发送到ActiveMQ。最后在搜索服务端监听到activeMQ中的消息后,就将字符串取出来,转换成java对象,保存到solr索引库中即可。

    • 删除同理:在运营商后台删除商品时,将商品id通过activeMQ发送到搜索服务中,搜索服务接收到消息后,将此商品的SKU列表删除即可。

  6. 你这个duboox…

    这个问题我都没有搞清楚他问我的意思,他重复了一遍,我还是没有弄明白。所以就只能强行解释,就说这个项目采用的是SOA架构,dubbox是用来远程服务调用的。当服务启动提供者启动的时候,会将自己的服务地址注册到dubbox的注册中心中,服务消费者启动时会从dubbox注册中心中订阅服务提供者的服务地址。他们之间的关系就像…(好像我没有get到点,面试官有点听不下去了,就下一个问题了)

  7. 你是怎么想到搜索服务要这么做,要用到solr的

    这个搜索服务是模拟京东商场的做法,采用solr解决方案是在网上看的博客学的。

  8. 我看你这个项目还挺大的,这个是有什么项目背景吗,做了多久,现在做完了吗

    额,这个是我们课程设计,我和其他几个同学一起做的,目前还没有做完。

  9. 你这项目总共有几个服务,简单说一下

    搜索服务、购物车服务、支付服务、商家商品服务(我卡了半天,还是对项目的整个架构不太熟悉)

2. java基础

  1. 说一说你在平时用的比较多的java中的包

    lang包、util包、io包(沉默了一会儿实在是想不起来了)

  2. java的Util包中,你常用的都有哪些类

    平时根本就没怎么注意啊,我想说集合类,但是怕错了就没说。沉默了一会儿,面试官就说util包中有我们常用的一些集合类等等,我尴尬的说这个有些记不清了。

  3. 说说java中集合架构中各个类和接口的关系

    • 首先是List和Set都是单列集合,他们都继承了顶级接口Collection,然后List有ArrayList、LinkedList、Vector这些实现类。Set有TreeSet、HashSet、LinkedHashSet。(这里我说错了,LinkedHashSet应该是HashSet的子类)。

    • Map就是一个顶级接口,它的实现类有HashMap、HashTable、TreeMap

3. Spring

  1. spring是怎么将一个类注入到容器中的

    在service层用@service注解,在web层@Controller注解

  2. 怎么给spring的一个属性注入值

    用@Autowired注解

  3. 除了@Autowired注解你还使用过哪些注解

    还用过@Resource注解

  4. @Autowired注解和@Resource注解有什么区别吗

    @Autowired是自动注入,如果容器中相同类型的对象有多个的话,那么这时候spring就不知道该注入哪一个了。而@Resource注解可以在name属性中指明要注入的对象的名称。

  5. spring中的aop是什么意思

    aop是面向切面编程,就是把一些不同的方法中的重复代码抽取出来然后采用一种方式注入到各个方法中。

  6. 哪些地方用到了aop

    spring的事物就是采用的aop

  7. 除了spring中的事物,你还见过哪些地方用了aop

    额,目前只知道spring中的事物采用了这种编程思想

4. jvm

  1. jvm中的内存结构的划分

    • 首先分为两大块儿,线程独占区和线程共享区。线程共享区分为方法区和java堆。方法区使用来存放jvm加载的一些类的信息的。java堆中主要存的是java对象。java堆又分为新生代和老年代,新生代又分为····(面试官说好好好,不用说的那么细)。

    • 线程独占区分为java虚拟机栈、程序计数器、本地方法栈。虚拟机栈是为我们写的java方法而服务的,本地方法栈是为了本地方法而服务的。

  2. 常用的java虚拟机参数命令,比如说java -jar·····,怎么在虚拟机参数中分配堆内存的大小

    (没想到会问这些,有些懵,又进入了沉默阶段)额,记不清了。

5. mysql优化

  1. 数据库的范式

    有三大范式:

    • 第一范式:字段原子性,不可再分割,关系型数据库默认满足第一范式

    • 第二范式:去除对主键的部分依赖,解决方案单独加入与业务逻辑无关的属性列id(其实还应该加上满足第一范式的条件)

    • 第三范式:消除对主键的传递依赖(也应该加上在满足第二范式的基础上的条件)

  2. 数据库中索引的使用场景(索引覆盖的情况自己还不是很清楚)

    • where查询、order by、join查询、索引覆盖。当时面试官听我说到索引覆盖有些疑惑。我就解释说假如对name建立了(firstname和lastname索引······,我去自己说的是什么啊,记不清的东西,千万不能嘴多)。

    • 其实应该这么说,加入对数据库中的firstname和lastname两个字段都建立了索引,执行查询语句select fistname,lastname form student,虽然这种情况不在索引的三个使用场景中,但是刚好查询的两个字段都建立了索引,也会使用到索引查询,这种现象就叫做索引覆盖。

  3. 索引使用中的最左原则

    如果在复合索引中,查询的时候只用到了符合索引的最左侧字段,那么此时的查询是用到了索引的。如果查询的时候用的不是最左侧索引,那么查询就不会用到索引。

6. 整体感受

面试官很有耐心,自己都觉得自己表达的有点捉急(但是我也没办法啊,况且再加上我有点小紧张)。在面试过程中,有好几次没有听清楚面试官想表达的意思,让他再讲一遍(有点小尴尬)。问我没有答上来的问题的时候,他会给我正确答案。面试完成,他问我有没有什么想问他的。我说您能不能针对我今天的表现给我提一些建议,他笑了一下说,我感觉挺不错的啊,就是你的语言表达上还有些问题,有时候不能把自己的想法表达的很清楚。这方面你可以多参加一下演讲啊,在公共场合锻炼一下。

你可能感兴趣的:(面经)