DD的Java后台开发实习生

本文记录了一次DD公司Java后台开发实习生的面试经历,涉及Android项目经验、SpringMVC工作流程、Controller层的请求匹配、SpringAOP与Spring Web MVC模块的理解、并发编程中的Lock和Synchronized区别、volatile关键字的用法、Java虚拟机和垃圾回收机制、数据结构的选择如LinkedList和ArrayList,以及数据库索引和事务等技术问题。

(1)挑一个你最熟悉的项目我们聊一下?

讲了一下,自己做Android时候的项目,讲完之后,面试官说,我们这里暂时,没有Android方面的业务,还是谈一下Java知识吧!

(2)你了解SpringMVC吧!那你简单说一下,SpringMVC的工作流程?

这个问题还好,自己以前写的也比较熟悉,就说了一通。

(3)那你简单说一下,我有个http://8080/test.do请求,这个请求在controller层中找到了test()方法,controller层是怎么找到的?

首先,用@Controller用于标记一个类上,使用它标记的类就是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的方法,并检查该方法是否使用了@RequestMapping注解,这个@RequestMapping里的参数是不是(“/test.do”),如果是的话,就访问这个Controller类中的test()方法。@Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是真正处理请求的处理器。

拓展:分发处理器如何扫描找到Controller控制器类呢?

单单使用@Controller标记在一个类上还不能真正意义上的说它就是SpringMVC的一个控制器类,因为这个时候Spring还不认识它。那么要如何做Spring才能认识它呢?这个时候就需要我们把这个控制器类交给Spring来管理。

这个时候有两种方式可以把MyController 交给Spring 管理,好让它能够识别我们标记的@Controller 。

第一种方式是在SpringMVC 的配置文件中定义MyController 的bean 对象。

<bean class="com.host.app.web.controller.MyController"/>

第二种方式是在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。

< context:component-scan base-package= "com.host.app.web.controller">

< context:exclude-filter type= "annotation" 

expression= "org.springframework.stereotype.Service"/>

</ context:component-scan >

注:上面 context:exclude-filter 标注的是不扫描 @Service 标注的类

具体了解请参考:http://blog.youkuaiyun.com/program_developer/article/details/79026162

(4)Spring中的SpringAOP和Spring Web MVC模块了解么?

这个不是很了解哦!

学习:

AOP技术是建立在Java语言的反射机制与动态代理机制上的。业务逻辑组件在运行过程中,AOP容器会动态创建一个代理对象供使用者调用,该代理对象已经按Java EE程序员的意图将切面成功切入到目标方法的链接点上,从而使切面的功能与业务逻辑的功能同时得以执行。从原理上讲,调用者直接调用的其实是AOP容器动态生成的代理对象,再由代理对象调用目标对象完成原始的业务逻辑处理,而代理对象则已经将切面与业务逻辑方法进行了合成。

具体的SpringAOP技术可以参考:http://blog.youkuaiyun.com/program_developer/article/details/79026724

Spring Web MVC,其实就是我们常说的SpringMVC框架,该模块建立在spring核心功能之上,这使它能拥有spring框架的所有特性,能够适应多种多视图、模板技术、国际化和验证服务,实现控制逻辑和业务逻辑的清晰分离。说说mvc在jsp的作用,这里引入了“控制器”这个概念,控制器一般由servlet来担任,客户端的请求不再直接送给一个处理业务逻辑的jsp页面,而是送给这个控制器,再由控制器根据具体的请求调用不同的事务逻辑,并将处理结果返回到合适的页面。因此,这个servlet控制器为应用程序提供了一个进行前-后端处理的中枢。一方面为输入数据的验证、身份认证、日志及实现国际化编程提供了一个合适的切入点;另一方面也提供了将业务逻辑从jsp文件剥离的可能。业务逻辑从jsp页面分离后,jsp文件蜕变成一个单纯完成显示任务的东西,这就是常说的view。而独立出来的事务逻辑变成人们常说的model,再加上控制器control本身,就构成了mvc模式。实践证明,mvc模式为大型程序的开发及维护提供了巨大的便利。 

(5)下面,我们了解一下Java里面的并发编程,Java里面的加锁机制了解么?比如说:Lock,Unlock

关于lock的用法可以看这篇博文:http://blog.youkuaiyun.com/program_developer/article/details/79032769

(6)Java里面的Synchronized的用法?那你了解Synchronized和Lock的区别么?

关于synchronized的用法可以看这篇博文:http://www.cnblogs.com/dolphin0520/p/3923737.html

重点说一下lock和synchronized的区别和联系:

(1)Lock是一个接口,而synchronized是java中的关键字,synchronized是内置的语言实现的。

(2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象的发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock()时候需要在finally块中释放锁。

(3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断。

(4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

(5)Lock可以提高多个线程进行读操作的效率。

在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

(7)Java里面的volatile关键字的用法?

1、保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程来说都是立即可见的。

2、禁止进行指令重排序。

在访问volatile变量时,不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。

(8)现在,有这么个业务场景,我有两个Tomcat,连接了一个Ngnix,现在达到了一个1:1的负载均衡,比如说,我有一个数据库插入用户的这么一个操作,这个操作是并发的,同步的,那我怎么做到两个Tomcat的处理,只能有一个做处理呢?

(9)Java虚拟机,你了解多少?能简单说一下,Java虚拟机么?

(10)Java的垃圾回收机制,一个没有用的Java对象,垃圾回收机制是如何回收的?

(11)java中LinkedList和ArrayList都在什么场景下使用?

LinkedList是基于链表的数据结构,对于插入和删除数据LinkedList比较占优势时间是0(1),查找的时间是O(n)。

ArrayList是基于数组的数据结构,对于插入和删除需要移动表长一半的元素时间为O(n),查找的时间为O(1)。

对数据读取比较频繁的操作,需要用ArrayList,对数据插入和删除操作比较频繁,需要用LinkedList。

(12)讲一下HashMap、HashTable、concurrentHashMap的区别,和线程安全情况,加锁机制?

(13)讲一下String、StringBuffer、StringBuilder的区别?

(14)说一下,你对数据库的事务的理解?

(15)那我问一下,你对数据库多索引的一个问题,假如你的数据库有三列a,b,c三列,每一列都有索引,那么把这三个索引相加,那么where a and b,能用到这个索引么?那么where b and c能用到这个索引么?

(16)说一下数据库中的左连接和右连接吧?

(17)说一下算法吧!你对快速排序了解么?那你说一下3、2、5、4怎么进行快速排序吧!

主要就问了这些问题,其他就是问了一下,我去要做的项目问题,还有几面啊!等等吧!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值