您的位置:首页 > 职场人生

面试遇到的问题

2018-03-26 21:06 197 查看
HashMap的实现原理,底层结构

HashMap:数组+链表组合结构(数组型散列结构)

HashMap的链表元素对应一个静态的内部类Entry,包含三个元素(key,value,next)

主要有put(),get()。
put()原理:通过hash%Entry.length来计算index,此时加入的元素即 Entry[index]=该元素
如果index相同,就是新加入的元素放到Entry[index],原先的元素记做Entry[index].next(相当于A元素与B元素index都相同,但A先加进去的,后加入的B会将当前位置的A挤到下面,相当于在数组位置挂个链表)
get():先遍历数组,再遍历链表元素
null key总是放在Entry数组的第一个元素
解决Hash冲突:(链地址法)
在散列rehash的过程中:确定容器超过目前哈希表的容量时,重新调整table的容量大小,当超过容量的最大值时,取Integer.Maxvalue


Session对象

浏览器(客户端)首次访问服务器时,服务器会创建一个对象(也叫session对象,该对象有一个唯一的id与其对应) ,然后把id发送给浏览器(默认情况下,使用cookie机制发送),下一次访问的时候,浏览器会在url加入这一id,服务器拿到id后找到对应的session对象,来保存状态

保存session id的几种方式
A.使用cookie,在交互过程中可以按规则把这唯一标识发送给服务器。如果客户端支持Cokid,Web Server在返回Response时,在响应的Header部分加入一个
"set-cookid:jessionid=XXX(唯一标识)"属性
B.由于cookie常被人为的禁止。这时可以使用URL的重写,把sessionid附加在URL的后面,两种附加方法,一种是直接附加在URL路径的附加信息,另一种是作为查询字符串
附加在URL后面
C.表单隐藏字段,服务器会自动修改表单,添加一个隐藏字段,便于将sessionid传递给服务器

session什么时候被创建:某server端程序(如servlet)调用HttpservletRequest.getSession(true)语句才会被创建
session什么时候会删除:1.程序调用Httpsession.invalidate();2.session超时;3.服务器被停止


SpringMVC与Struts2的区别

Struts2是类级别的拦截,一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法又跟url对应,所以SpringMVC更容易实现

restful url。

由于上面的原因,SpringMVC方法之间基本独立,独享request response数据,请求数据通过参数获取,处理结果交给ModelMap交给框架,方法之间不共享变量,而Struts2就比较混乱,虽然方法之间也独立,但是Action变量是共享的,每次请求就要创建一个Action,从而又对应一个request上下文

Struts2需要对每个request进行封装,将request,session等servlet生命周期的变量封装成一个Map,供给每个Action使用,并保证线程安全,所以原则上Struts2是比较耗内存的

拦截机制的实现,Struts2有自己独立的拦截机制,而SpringMVC有独立的AOP方式,所以SpringMVC配置文件比Struts2小

SpringMVC集成了ajax,使用只要一个@ResponseBody就可以实现,而Struts2虽然在拦截器集成了ajax,但使用起来不如SpringMVC方便

SpringMVC和spring是无缝的,从这一方面看安全性比Struts更高

从设计模式来讲Struts2更符合oop思想,而SpringMVC比较谨慎,在servlet上扩展

SpringMVC开发效率和性能高于Struts2


SpringMVC工作原理

客户端发出http请求给web服务器,web服务器进行解析交给对应的DispatcherServlet请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet

DispatcherServlet根据请求信息以及HandlerMapping找到对应的处理器Handler,再将具体的处理权交给Handler,再具体由HandlerAdapter对Handler进行具体的调用

Handler对数据具体处理完成之后返回一个ModleAndView()对象给DispatcherServlet

DispatcherServlet通过ViewResolver将逻辑视图转换成视图View

DispatcherServlet通过Model解析出ModleAndView()中的参数进行解析最终返回一个完整的View返回给客户端

Spring中的BeanFactory和ApplicationContext的区别

BeanFactory才有延迟加载形式来注入Bean,即在我需要使用Bean才注入,这样就不能发现一些存在的spring的配置问题,而ApplicationContext则是在容器启动时,

一次性创建所有的Bean

Spring三种注入

接口注入,set注入,构造注入

Spring组成:

Spring核心容器(core):提供spring容器的基本功能,主要组件为BeanFactory,是工厂模式的实现,通过ioc模式将程序的配置与依赖性规范和实际的应用代码分离,从而达到降低耦合

SpringAOP:springAOP模块将面向切面编程功能集成到了spring,所以很容易使spring框架管理支持任何对象,通过springAOP可以很方便的将事务集成到项目中

SpringORM:springORM模块继承了很多ORM框架,比如常用的hibernate,MyBatis,从而提供了ORM的对象关系工具

SpringDao:jdbctemplate Dao实现类继承JdbcDaoSupport从而获取JdbcTemplate

SpringWeb:有了上下文(Context)为基于web的应用程序提供了上下文服务,所以spring支持Struts等框架的集成,web模块还简化了处理多部分请求及请求参数绑定到域对象的工作

Spring上下文(Context):为spring提供上下文信息

SpringMVC:高度可配置,可容纳大量视图技术,如jsp等

事务的4个特性

原子性,一致性,隔离性,持久性

事务的实现方式:编码方式,声明式事务管理方式

基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。

声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。

Java创建线程之后,直接调用start()方法和run()的区别

start()方法时一个新的线程将会被创建,并且run()方法中的代码将会在新的线程中执行(调用start()方法,之后相当于告诉jvm,我要新开辟线程,执行run()中代码),而直接调用run()方法时,程序并不会创建新线程,run()方法中的代码将在当前线程中执行

名称 说明 同一线程是否可以多次获取锁 是否公平 性能&使用便捷度 是否响应中断

Synchronized 同步关键字 no no jdk1.6之后和重入差不多 否

reentrantlock 重入锁 可以,要求释放锁的次数 支持公平锁ReentrantLock(true) 需手动释放以及获取锁 可以响应中断

和获取锁次数相同 表示公平锁,按排队顺序获取锁

定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术.

sql机读顺序:from>on>join>where>group by>having>select>order by>limit

来自于(from)MySQL的on(on)参加(join)了在InNoDB中(where)的选美,以年龄进行分组(group by),所有(having)被选拔(select)的以身高进行排序(order by)但同时限制(limit)人数。

过滤器与拦截器的区别:

拦截器:在AOP中用于在某个方法或字段被访问前进行拦截,从而在之前或者之后加入某些操作,拦截是AOP的一种实现策略

采用代理的方式调用,

过滤器:是一个程序,先于servlet或jsp页面运行在服务器,可附加到一个或者多个servlet或jsp页面上,并可以检查进入这些资源的请求信息

区别:
拦截器是基于java的反射机制,而过滤器是基于回调函数
拦截器不依赖与servlet容器,而过滤器依赖
拦截器只对action请求起作用,而过滤器几乎可以对所有请求起作用
拦截器可以访问action上下文,值栈里的对象,而过滤器不能
在action的生命周期中,拦截器可多次被调用,而过滤器只能在容器初始化时被调用一次


web监听器:是一种servlet中的特殊类,能帮助开发者监听web中的特定事件,如ServletContext,HTTPSession,ServletRequest的创建和销毁,变量的创建以及销毁

常用于统计在线人数,利用HTTPSessionLisener;加载初始化信息,利用ServletContextLisener,统计网站访问量,实现访问监控。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java面试题