Java高频面试知识点-3

1. Mybatis 最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

  • 回答

      Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值。
      接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,
      就是传递给sql的参数。Mapper接口是没有实现类的,
      当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement。
    
  • 细节

      举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到
      namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。
      在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,
      都会被解析为一个MappedStatement对象。
      Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。
      Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,
      代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。
    

2. HashMap 底层是如何实现的?在 JDK 1.8 中它都做了哪些优化?

  • 回答

      在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,
      JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构。
    
      JDK 1.8 之所以添加红黑树是因为一旦链表过长,会严重影响 HashMap 的性能,
      而红黑树具有快速增删改查的特点,这样就可以有效的解决链表过长时操作比较慢的问题。
    

3. 如何监控和诊断 JVM 堆内和堆外内存使用?

  • 回答:

      了解 JVM 内存的方法有很多,具体能力范围也有区别,简单总结如下:
      可以使用综合性的图形化工具,
      如 JConsole、VisualVM(注意,从 Oracle JDK 9 开始,VisualVM 已经不再包含在 JDK 安装包中)等。
      这些工具具体使用起来相对比较直观,直接连接到 Java 进程,然后就可以在图形化界面里掌握内存使用情况。
      以 JConsole 为例,其内存页面可以显示常见的堆内存和各种堆外部分使用状态。
      · 也可以使用命令行工具进行运行时查询,如 jstat 和 jmap 等工具都提供了一些选项,可以查看堆、方法区等使用数据。
      或者,也可以使用 jmap 等提供的命令,生成堆转储(Heap Dump)文件,
      然后利用 jhat 或 Eclipse MAT 等堆转储分析工具进行详细分析。
      如果你使用的是 Tomcat、Weblogic 等 Java EE 服务器,这些服务器同样提供了内存管理相关的功能。
      另外,从某种程度上来说,GC 日志等输出,同样包含着丰富的信息。
      这里有一个相对特殊的部分,就是是堆外内存中的直接内存,前面的工具基本不适用,
      可以使用 JDK 自带的 Native Memory Tracking(NMT)特性,它会从 JVM 本地内存分配的角度进行解读。
    
  • 考点分析

      该问题是 Java 内存管理相关的基础实践,对于普通的内存问题,掌握上面给出的典型工具和方法就足够了。
      这个问题也可以理解为考察两个基本方面能力:
      第一,你是否真的理解了 JVM 的内部结构;
      第二,具体到特定内存区域,应该使用什么工具或者特性去定位,可以用什么参数调整。
    

4. 请列举出在JDK中几个常用的设计模式?

  • 回答:

      1、单例模式:保证被创建一次,节省系统开销。
    
      2、工厂模式(简单工厂、抽象工厂):解耦代码。
    
      3、观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
    
      4、外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。
    
      5、模版方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。
    
      6、状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
    
      7、装饰器设计模式:(Decorator design pattern)被用于多个 Java IO 类中。
    
posted @ 2020-05-10 12:21  Master_s  阅读(118)  评论(0编辑  收藏  举报