1、2016 年阿里内推1. Hashmap,hashtable,concurrentHashmap 底层实现和区别Hashmap 不加锁,执行的效率比较高Hashtable 每个方法都加锁,执行的效率比较低ConcurrentHashMap 采用了二次哈希的方式,第一次哈希映射到对应的 segment,然后对segment 加锁,第二次 hash 映射到不同的 segment 的不同桶中2.Spring 框架的原理,springAOP 可以使用哪些代理,有什么区别Spring 主要包括两个方面 IOC 和 AOPSpring 的控制反转:把对象的创建、初始化、销毁等工作交给 spring 容器来
2、做。由 spring容器控制对象的生命周期。AOP:面向切面编程,使用动态代理是实现JDK 的动态代理(松耦合) 因为利用 JDKProxy 生成的代理类实现了接口CGLIB 的动态代理 用 CGlib 生成代理类是目标类的子类JDKProxy 代理 SpringAop目标对象 目标对象拦截器类 切面拦截器类中的方法 通知被拦截到的目标类中方法的集合 切入点在客户端调用的方法(目标类目标方法) 连接点代理类 AOP 代理代理类的代理方法生成的过程 织入 aop:1、切面事务、日志、安全性框架、权限等都是切面2、通知切面中的方法就是通知3、目标类 4、切入点 只有符合切入点,才能让通知和目标方法
3、结合在一起5、织入:形成代理对象的方法的过程 springAOP 的具体加载步骤:1、当 spring 容器启动的时候,加载了 spring 的配置文件2、为配置文件中所有的 bean 创建对象3、spring 容器会解析 aop :config 的配置 1、解析切入点表达式,用切入点表达式和纳入 spring 容器中的 bean 做匹配如果匹配成功,则会为该 bean 创建代理对象,代理对象的方法=目标方法+通知,如果匹配不成功,不会创建代理对象4、在客户端利用 context.getBean 获取对象时,如果该对象有代理对象则返回代理对象,如果没有代理对象,则返回目标对象说明:如果目标类没
4、有实现接口,则 spring 容器会采用 cglib 的方式产生代理对象,如果实现了接口,会采用 jdk 的方式3 如何实现一个 ORM 框架ORM 是对 JDBC 的简单封装,我们要对三类文件进行解析文件 解析方法 作用映射类 反射映射文件 Saxreader dom 描述类的属性和数据库字段的映射关系数据库配置文件 Saxreader dom 使用 JDBC 链接数据库从对象到数据库 根据映射文件,使用 jdbc 进行设置从数据库到对象 有对应的属性名,采用反射技术,进行值得设置(set 方法)另外的工作:管理数据库连接池,session4.hibernate 一级缓存和二级缓存,hibe
5、rnate 其他缓存 一级缓存:session 级别的缓存,session 的 save(),get(),load(),select()都会将对象放到session 缓存中。 二级缓存:sessionFactory 级别的缓存二级缓存应用场景:(1 )经常被访问(2)改动不大(3)数量有限(4 )不是很重要的数据,允许出现偶尔并发的数据二级缓存策略,是针对于 ID 查询的缓存,对于条件查询则毫无作用。 Hibernate 提供了针对条件查询的 Query Cache。5.hibernate 事务传播行为种类事务传播行为类型 说明PROPAGATION_REQUIRED 如果当前没有事务,就新建
6、一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。PROPAGATION_NESTED 如果当前存在事务,则
7、在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。6 springmvc 原理Spring 工作流程描述1.用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获;2.DispatcherServlet 对请求 URL 进行解析,得到请求资源标识符( URI) 。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及Handler 对象对应的拦截器) ,最后以 HandlerExecutionChain 对象的形
8、式返回;3.DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。如果成功获得HandlerAdapter 后,此时将开始执行拦截器的 preHandler(.)方法4.提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller)。 在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:HttpMessageConveter: 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息数据转换:对请求消息进行数据转换。如 St
9、ring 转换成 Integer、Double 等数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等数据验证: 验证数据的有效性(长度、格式等) ,验证结果存储到 BindingResult 或 Error中5.Handler 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;6.根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet ;7.ViewResolver 结合 Model 和
10、View,来渲染视图,将渲染结果返回给客户端7.Spring 为什么要结合使用 HandlerMapping 以及 HandlerAdapter 来处理 Handler?符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如 HandlerAdapter 可能会被用于处理多种 Handler8.web 中安全性问题的考虑,如何防止表单验证,防止表单重复提交,权限拦截9 web 系统整体架构MVC 整体架构,松耦合,代码重用性好模型(Model)代表应用程序的数据( data)和用于控制访问和修改这些数据的业务规则(business rule)当模型发生改变时,它会通
11、知视(View) ,并且为视提供查询模型相关状态的能力。同时,它也为控制器(Controller)提供访问封装在模型内部的应用程序功能的能力。控制器(Controller)定义了应用程序的行为;它负责对来自视的用户要求进行解释,并把这些要求映射成相应的行为,这些行为由模型负责实现。为什么要分层:主要目的是为了解耦比如工程的 view 是用 jsp 做的,现在想做成桌面软件,那么我只需要修改 view 层和部分的controller 层就可以了, model 层不需要变化。10.hibernate 如何实现声明式事务11.java 并发包12. volatile 关键字volatile 让变量每
12、次在使用的时候,都从主存中取。而不是从各个线程的“工作内存” 。volatile 具有 synchronized 关键字的“可见性” ,但是没有 synchronized 关键字的“并发正确性” ,也就是说不保证线程执行的有序性。也就是说,volatile 变量对于每次使用,线程都能得到当前 volatile 变量的最新值。但是volatile 变量并不保证并发的正确性。13. 平常都看哪些书推荐系统实战,java 核心卷14.如何进行反射,如何提高反射的性能缓存15. 如何实现 java 的代理,为什么需要实现接口因为 JDK 的代理对象也 implements 了这些接口,这样可以保证调用
13、代理对象和调用被代理对像没有区别16. Struts 的漏洞 可以远程执行服务器脚本代码 重定向漏洞17.数组和 List 的互相转换Arrays.asList()list.toArray()18.TCP 协议的三次握手19.滑动模块协议滑动窗口协议中,允许对方发送多个分组(当有多个分组可用时)而不需等待确认,但它受限于在流水线中为未确认的分组数不能超过某个最大允许数 N。滑动窗口协议是 TCP 使用的一种流量控制方法,此协议能够加速数据的传输。只有在接收窗口向前滑动时(与此同时发送了确认) ,发送窗口才有可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议称为滑动窗口协议。当
14、收发窗口的大小都等于 1 时,就是停止等待协议。20. mybatis 与 hibernate 有什么区别,为什么不用 hibernate 直接写 sql 语句?Hibernate 和 Mybatis 都是 orm 对象关系映射框架,都是用于将数据持久化的框架技术。Hiberante 较深度的封装了 jdbc,对开发者写 sql 的能力要求的不是那么的高,我们只要通过 hql 语句操作对象即可完成对数据持久化的操作了。另外 hibernate 可移植性好,更换数据库只需要修改配置文件的数据库方言即可。因此使用Hibernate 框架,数据库的移植较为方便。hibernate 不足:生成的 sq
15、l 语句较为死板,占用资源,难于优化,支持存储过程的能力较弱。Hibernate 优点:懒加载、缓存、 策略模式Mybatis 也是对 jdbc 的封装,但是封装的没有 hibernate 那么深,我们可以再配置文件中写sql 语句,可以根据需求定制 sql 语句,易于优化,尤其对于复杂的查询涉及到大数据的系统使用 Mybatis 比较好,因为优化较方便。涉及的数据量不是很大且对优化没有那么高,可以使用 hibernate21. .项目中使用了哪些数据结构?22.TCP 中断连接四次挥手?23.项目遇到什么问题,怎么解决?文件目录树状结构展示,需要Easyui 展示文件系统,怎么后退?24.J
16、DK1.8 有什么新特性? Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法 Lambda 表达式 DATE API Hashmap:因为如果冲突链太长,查询效率太低,所以超过一定范围,java 会给冲突链建红黑树 25.Class 的加载过程bootstrap classloader:引导(也称为原始)类加载器,它负责加载 Java 的核心类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader 的子类,而是由 JVM 自身实现的。因为 JVM 在启动的时候就自动加载它们,所以不需要在系统属性
17、CLASSPATH 中指定这些类库extension classloader 扩展类加载器,它负责加载 JRE 的扩展目录(JAVA_HOME/jre/lib/ext 或者由 java.ext.dirs 系统属性指定的)中的 JAR 包。这为引入除Java 核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个 JRE中启动的 JVM 都是通用的,所以放入这个目录的 JAR 类包对所有的 JVM 和 system classloader 都是可见的。extension classloader 是 system classloader 的 parent,而 bootstrap c
18、lassloader 是 extension classloader 的 parent,但 bootstrap classloader 不是一个实际的 classloader。system classloader 系统(也称为应用)类加载器,它负责在 JVM 被启动时,加载来自在命令 java 中的 -classpath 或者 java.class.path 系统属性或者 CLASSPATH 操作系统属性所指定的 JAR 类包和类路径。可以通过静态方法 ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器
19、作为它的父加载器。classloader 加载类用的是全盘负责委托机制。全盘负责:即是当一个 classloader 加载一个 Class 的时候,这个 Class 所依赖的和引用的所有 Class 也由这个 classloader 负责载入,除非是显式的使用另外一个 classloader 载入委托机制:先让 parent(父)类加载器 (而不是 super,它与 parent classloader 类不是继承关系)寻找,只有在 parent 找不到的时候才从自己的类路径中去寻找。l 类加载还采用了 cache 机制:如果 cache 中保存了这个 Class 就直接返回它,如果没有才从文
20、件中读取和转换成 Class,并存入 cache,这就是为什么修改了 Class 但是必须重新启动JVM 才能生效的原因。1. 检测此 Class 是否载入过(即在 cache 中是否有此 Class) ,如果有到 8,如果没有到 22. 如果 parent classloader 不存在(没有 parent,那 parent 一定是 bootstrap classloader 了) ,到 43. 请求 parent classloader 载入,如果成功到 8,不成功到 54. 请求 jvm 从 bootstrap classloader 中载入,如果成功到 85. 寻找 Class 文件(从与此 classloader 相关的类路径中寻找) 。如果找不到则到 7.6. 从文件中载入 Class,到 8.7. 抛出 ClassNotFoundException.8. 返回 Class.