我是面试官,我准备这样出java面试题

目录

一.算法题

二.java基础题

1.java的三大特性,并说说你对特性的理解。

2.String 类的常用方法都有那些?

3.是否可以从一个static方法内部发出对非static方法的调用?

4.Servlet API中forward()与redirect()的区别?

5.HashMap和Hashtable的区别

三.框架相关题

1.使用Spring框架的好处是什么/探谈谈对Spring的理解?

2.SpringMVC的常用注解(说出5个);如何使用 SpringMVC完成JSON操作?

3.Mybatis的一级缓存和二级缓存?(就二级缓存顺便问下Redis)

4.MyBatis中使用#和$书写占位符有什么区别? 

5.MyBatis中的动态SQL是什么意思? 

四.设计模式

1.什么是单例模式?怎么实现线程安全的单例模式?

2.说出除了单例模式你还知道java主流框架中的哪个设计模式,大致介绍下?

五.数据库

1.查询语句中select from where group by having order by的执行顺序?

2.sql优化方式有哪些?

六.根据项目的提问


 上周领导让写招聘要求,准备面试新人了。这次机会让我第一次开始在面试中站在原来角色的对面的角度思考问题。

  首先思考招人的标准和目的,此次招人的目的是分担我的开发工作,所以招人的标准基本是java基础扎实,会使用框架进行基本的开发,稍微会点前端,能尽快加入开发流程就可以。

 因此结合我们公司项目中近期使用的技术栈,我总结之后大致写了几个方面的要求和题目,当然具体还是要根据项目经验去发问的。

一.算法题

算法题准备了两个,算法题的目的是为了考察计算机专业基本必修课程的掌握程度,或者是说对编程基础的考察。

二分查找是一个非常基础的查找算法,要求是至少能描述出伪代码。

 二分查找法 

—————————————————————————————————————————————————————

 冒泡排序

—————————————————————————————————————————————————————   

二.java基础题

java基础题是一般面试的必考题,主要考察对java的基础知识的掌握程度,及对java语言的理解,准备了五个,根据实际情况扩展发问。

1.java的三大特性,并说说你对特性的理解。

https://www.cnblogs.com/thelovelybugfly/p/9641367.html

2.String 类的常用方法都有那些?

 indexOf():返回指定字符的索引。
        charAt():返回指定索引处的字符。
        replace():字符串替换。
        trim():去除字符串两端空白。
        split():分割字符串,返回一个分割后的字符串数组。
        getBytes():返回字符串的 byte 类型数组。
        length():返回字符串长度。
        toLowerCase():将字符串转成小写字母。
        toUpperCase():将字符串转成大写字符。
        substring():截取字符串。
        equals():字符串比较。

ps:顺便问字符串的拼接方式。

3.是否可以从一个static方法内部发出对非static方法的调用?

    不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部无法发出对非static方法的调用。

4.Servlet API中forward()与redirect()的区别?

  1.从地址栏显示来说     

        forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
        redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。
    2.从数据共享来说
        forward:转发页面和转发到的页面可以共享request里面的数据.
        redirect:不能共享数据.
        redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.
        forward方法只能在同一个Web应用程序内的资源之间转发请求.forward 是服务器内部的一种操作.
        redirect 是服务器通知客户端,让客户端重新发起请求.
   所以,你可以说 redirect 是一种间接的请求, 但是你不能说"一个请求是属于forward还是redirect "
    3.从运用地方来说
        forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
        redirect:一般用于用户注销登录时返回主页面和跳转到其它的网站等.
    4.从效率来说
        forward:高.
        redirect:低.

5.HashMap和Hashtable的区别

       HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。

        HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

        Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

        最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供同步。

     就HashMap与HashTable主要从三方面来说。
        一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
        二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
        三.值:只有HashMap可以让你将空值作为一个表的条目的key或value.

—————————————————————————————————————————————————

三.框架相关题

java相关框架是日常开发中使用的工具,必须有一定的认识且能熟练的使用,这个模块准备了五个,当然也需要根据项目经验发问。

1.使用Spring框架的好处是什么/谈谈对Spring的理解?

        轻量:Spring 是轻量的,基本的版本大约2MB。

        控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。

        面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。

        容器:Spring 包含并管理应用中对象的生命周期和配置。

        MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。

        事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。

        异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。

2.SpringMVC的常用注解(说出5个);如何使用 SpringMVC完成JSON操作?

常用的 5 个注解
    @RequestMapping 、 @PathVariable 、 @RequestParam 、 @RequestBoy 、@ResponseBody
    如何使用 SpringMVC 完成 JSON 操作:
    ①. 配置 MappingJacksonHttpMessageConverter
    ②. 使用 @RequestBody 注解或 ResponseEntity 作为返回值

3.Mybatis的一级缓存和二级缓存?(就二级缓存顺便问下Redis)

        Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
        Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。

4.MyBatis中使用#和$书写占位符有什么区别? 

       #将传入的数据都当成一个字符串,会对传入的数据自动加上引号;

       $将传入的数据直接显示生成在SQL中。

        注意:使用$占位符可能会导致SQL注射攻击,能用#的地方就不要使用$,写order by子句的时候应该用$而不是#。

5.MyBatis中的动态SQL是什么意思? 

        对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,如果不使用持久层框架我们可能需要自己拼装SQL语句,不过MyBatis提供了动态SQL的功能来解决这个问题。MyBatis中用于实现动态SQL的元素主要有: 
        - if    - choose / when / otherwise    - trim    - where    - set     - foreach

—————————————————————————————————————————————————

四.设计模式

      框架相关的设计模式需要了解几个,毕竟跟代码质量是息息相关的,还能提高工作效率,对框架的理解也尤为重要。

1.什么是单例模式?怎么实现线程安全的单例模式?

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中只维护一个特定类实例,它被所有组件共同使用。

      线程安全回答出方法中声明synchronized关键字即可。

2.说出除了单例模式你还知道java主流框架中的哪个设计模式,大致介绍下?

        https://zhuanlan.zhihu.com/p/66790602

—————————————————————————————————————————————————

五.数据库

数据库也是后端开发必备的技能,一手流利的sql也是提升工作效率的必备技能。

1.查询语句中select from where group by having order by的执行顺序?

(8)SELECT(9)DISTINCT    
(1)FROM 
(3) JOIN 
(2)ON 
(4)WHERE 
(5)GROUP BY 
(6)WITH {CUTE|ROLLUP}
(7)HAVING 
(10)ORDER BY 
(11)LIMIT 
  • 可以看到,一共有十一个步骤,最先执行的是FROM操作,最后执行的是LIMIT操作。每个操作都会产生一个虚拟表,该虚拟表作为一个处理的输入,看下执行顺序:

    (1) FROM:对FROM子句中的左表和右表执行笛卡儿积,产生虚拟表VT1;
    (2) ON: 对虚拟表VT1进行ON筛选,只有那些符合的行才被插入虚拟表VT2;
    (3) JOIN: 如果指定了OUTER JOIN(如LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表VT2,产生虚拟表VT3。如果FROM子句包含两个以上的表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1~步骤3,直到处理完所有的表;
    (4) WHERE: 对虚拟表VT3应用WHERE过滤条件,只有符合的记录才会被插入虚拟表VT4;
    (5) GROUP By: 根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生VT5;
    (6) CUBE|ROllUP: 对VT5进行CUBE或ROLLUP操作,产生表VT6;
    (7) HAVING: 对虚拟表VT6应用HAVING过滤器,只有符合的记录才会被插入到VT7;
    (8) SELECT: 第二次执行SELECT操作,选择指定的列,插入到虚拟表VT8中;
    (9) DISTINCT: 去除重复,产生虚拟表VT9;
    (10) ORDER BY: 将虚拟表VT9中的记录按照进行排序操作,产生虚拟表VT10;
    (11) LIMIT: 取出指定街行的记录,产生虚拟表VT11,并返回给查询用户

  • 对此题的理解程度能说明你sql语句编写的能力,复杂sql语句中,对sql执行顺序的理解十分关键。

2.sql优化方式有哪些?

子查询变成left join
        limit 分布优化,先利用ID定位,再分页
        or条件优化,多个or条件可以用union all对结果进行合并(union all结果可能重复)
        不必要的排序
        where代替having,having 检索完所有记录,才进行过滤
        避免嵌套查询
        对多个字段进行等值查询时,联合索引

—————————————————————————————————————————————————

六.根据项目的提问

根据项目的提问是针对对面所做的项目进行发问,除涉及的知识进行提问外,还要考察对项目的理解程度,以及日常工作情况,能把自己负责的部分阐述清楚,对负责部分用到的技术必须牢记掌握,至少需要知道技术是什么,为什么用,怎么用。其次是对项目的整体业务有大概的了解即可。当然,心得体会和谈改进思考以及对知识盲区的学习过程这类开放性的问题有独到的见解会加分。

重点:基础大差不差的情况下我更关注实际技术应用能力,口述能部分的反应你的逻辑能力,对使用技术的理解能力。

 

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