Java实习面试经验一

Java大三实习面试经验

由于在春招大厂面试时不给力,只能靠在BOSS直聘、拉钩等网址投简历,正好学校有个毕业招聘会,过去面试了Java的后台开发,以下是面试的一些问题,分享出来,大家可以借鉴下。

  • SpringBoot和SpringMVC区别

    类比来看:
    spring boot 相当于 腾讯的 Wegame,里面装了自家的各种游戏 如 spring data 、spring mvc……
    你通过 We game 可以轻松 快速 安装、使用(引入、整合)Wegame旗下的游戏

    springmvc与springboot的联系和区别:

    联系:
    Spring最初利用工厂模式(DI)和代理模式解耦应用组件,为了解耦开发了springmvc;而实际开发过程中,经常会使用到注解,程序的样板很多,于是开发了starter,这套就是springboot。
    
    区别:
    1.springboot是约定大于配置,可以简化spring的配置流程;springmvc是基于servlet的mvc框架,个人感觉少了model中的映射。
    2.以前web应用要使用到tomat服务器启动,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可。例如:
    
  • 拦截器和过滤器区别

    ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
    ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
    ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
    ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
    ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
    ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
    
    过滤器使用场景:
    比如:过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。
    1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
    2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
    3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
    4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
    5、OpenSessionInView:如hibernate,在进入处理器打开Session,在完成后关闭Session。
    
    拦截器使用场景:
    拦截未登录用户等
    

    filter Interceptor
    多个的执行顺序 根据filter mapping配置的先后顺序 按照配置的顺序,但是可以通过order控制顺序
    规范 在Servlet规范中定义的,是Servlet容器支持的 spring容器内的,是Spring框架支持的。
    使用范围 只能用于Web程序中 既可以用于Web程序,也可以用于Application、Swing程序中。
    深度 Filter在只在Servlet前后起作用 拦截器能够深入到方法前后、异常抛出前后等
  • 面试官:“当使用过滤器时,此时Spring还没有注入bean,过滤时怎么进行业务操作?”

    答:“不使用过滤器,使用Interceptor”

    问:“如果一定要使用过滤器呢”

    答:“母鸡”

    后来经过查询,其实原理很简单,具体如下:

    • 解决Filter不能注入Spring 的bean问题

      来自博客https://blog.csdn.net/Evan_QB/article/details/82894834

      我们都知道Filter的优先级大于Servlet,而springMVC又是基于Servlet来进行注入bean的,所以这就导致了Filter无法注入bean

      接下来我们进行配置Filter,在web.xml中有:

      <filter>
        	<filter-name>loginFilterfilter-name>
        	<filter-class>com.ipp.filter.LoginFilterfilter-class>
        filter>
        <filter-mapping>
        	<filter-name>loginFilterfilter-name>
        	<url-pattern>/loanref/*url-pattern>
        filter-mapping>
      

      在loginFilter中继续进行注入

      @Component
      public class LoginFilter implements Filter{
          @Autowired
          private IUserService userService;
      }
      

      接下来编写一个Utils进行手动注入bean

      @Component
      public class SpringUtils implements ApplicationContextAware{
      	private static ApplicationContext applicationContext;
       
          @Override
          public void setApplicationContext(ApplicationContext applicationContext)
                  throws BeansException {
              if (SpringUtils.applicationContext == null) {
                  SpringUtils.applicationContext = applicationContext;
              }
       
          }
       
          public static ApplicationContext getApplicationContext() {
              return applicationContext;
          }
       
          //根据name
          public static Object getBean(String name) {
              return getApplicationContext().getBean(name);
          }
       
          //根据类型
          public static <T> T getBean(Class<T> clazz) {
              return getApplicationContext().getBean(clazz);
          }
       
          public static <T> T getBean(String name, Class<T> clazz) {
              return getApplicationContext().getBean(name, clazz);
          }
       
      }
      

      接着在init方法中将userService的bean通过SpringUtils给注入进行

      @Override
      public void init(FilterConfig config) throws ServletException{
          if(userService==null){
              userService=(IUserServcie)SpringUtils.getBean("userServiceImpl");
          }
      }
      
  • SSO原理图(实现)

https://github.com/Hpsyche/note/blob/master/面试题/29.单点登录详解.md

  • jsp可以访问SpringBoot吗

    因为没试过,我傻傻地回答了“可以”,然后就被面试官怼了,事后,查询资料,发现如下:

    以下转自https://blog.csdn.net/yingxiake/article/details/51288727:
    
    spring boot 在springmvc的视图解析器方面就默认集成了ContentNegotiatingViewResolver和BeanNameViewResolver,在视图引擎上就已经集成自动配置的模版引擎,如下: 
    1. FreeMarker 
    2. Groovy 
    3. Thymeleaf 
    4. Velocity (deprecated in 1.4) 
    6. Mustache
    
    JSP技术spring boot 官方是不推荐的,原因有三: 
    1. 在tomcat上,jsp不能在嵌套的tomcat容器解析即不能在打包成可执行的jar的情况下解析 
    2. Jetty 嵌套的容器不支持jsp 
    3. Undertow
    

    综上,springboot官方是不推荐使用JSP技术的,但是如果迫不得已要使用,也是有办法的,详情配置也可见以上博客。

  • Redis实现

    就简单问了下redis的数据结构、在项目中的使用、还有实体存入redis的前提(序列化)

  • solr原理(索引原理)

    这个其实我也是简单用了下,原理没怎么了解过,本想着“类似数据库索引的B+树”?,害怕出错就没说了,就简单讲了下linux上我索引的配置过程,中文切词器的导入,及索引、高亮的设置;面试官可能也看出我不太懂原理,就没有刁难我,事后查询了全文索引的原理,具体大概如下:

    先了解两个概念,正排索引和倒排索引:

    • 正排索引:

      主要的意思就是说,当网络爬虫在Internet上收集信息的时候,会把收集到的网页进行处理,就是把对网页的内容进行分词(关键词),可以看成这样:

      网页 关键词
      网页A= 关键词1+关键词2+…….
      网页B= 关键词1+关键词2+…….
      网页C= 关键词1+关键词2+…….

      具体分词的话不同分词器有不同的规则,不过大同小异,去辅助词、切词组等;

      把一个网页分成一个个的关键词的过程就是一个正排索引的过程。

    • 倒排索引:

      用户查信息的时候,一般都是通过关键词来查询相应的信息。

      倒排索引是这样的,倒排索引这个关键词之后跟了一堆网页。

      关键词 网页
      关键词1= 网页A+网页B+网页C+网页O+…….
      关键词2= 网页B+网页P+网页Z+…….
      关键词3= 网页D+网页T+网页Y+网页Z+……

      而solr就是一个倒排索引、基于Lucene的Java全文搜索引擎服务器。

      当然,索引过程还涉及到tf-idf、svm等算法,此处不做详解。

  • 商品上架和下架过程

    就简单讲了下商品上下架时数据库的操作,还有(消息队列、索引库)的操作。

  • 线程安全是什么?怎样算是线程安全?

    如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

  • 如何实现线程安全?

    怎么实现的话,我讲了同步的实现方法:同步方法、同步代码块、还有volatile关键字,其实应该还有使用重入锁实现线程同步;

  • volatile原理

    以上两问详情均可见本人github地址:

    [https://github.com/Hpsyche/note/blob/master/面试题/13.同步实现方法.md]

  • java重点有哪些

    答:多线程、IO、集合、泛型、多态、 异常

  • mybatis二级缓存

    答:大概知道二级缓存是以application为生命周期的(一级缓存是基于sqlsession为生命周期的),但没深入了解和使用过;

!!!!在面试完之后,面试官说挺好的,然后翻了一下我的简历,发现我是大三的,然后就说!!不招实习生!!也好,取了点面经!!

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