面试总结

1.java基础

    (1)算法找出一个数组中最大的值?

    (2)排序的算法(效率最高的)?

    (3)数据结构 链表简单的实现???

2.spring  AOP 的应用

        面向切面编程 ,主要用于日志输出,安全控制(事务管理)。详谈事务的在项目中的运用和底层技术的实现.

 一. 事务在项目中的应用。

 二、实现技术?
       AOP(这里的AOP指的是面向切面编程思想,而不是Spring AOP)主要的的实现技术主要有Spring AOP和AspectJ。

1、AspectJ的底层技术。

       AspectJ的底层技术是静态代理,即用一种AspectJ支持的特定语言编写切面,通过一个命令来编译,生成一个新的代理类,该代理类增强了业务类,这是在编译时增强,相对于下面说的运行时增强,编译时增强的性能更好。

2、Spring AOP

       Spring AOP采用的是动态代理,在运行期间对业务方法进行增强,所以不会生成新类,对于动态代理技术,Spring AOP提供了对JDK动态代理的支持以及CGLib的支持。

       JDK动态代理只能为接口创建动态代理实例,而不能对类创建动态代理。需要获得被目标类的接口信息(应用Java的反射技术),生成一个实现了代理接口的动态代理类(字节码),再通过反射机制获得动态代理类的构造函数,利用构造函数生成动态代理类的实例对象,在调用具体方法前调用invokeHandler方法来处理。

       CGLib动态代理需要依赖asm包,把被代理对象类的class文件加载进来,修改其字节码生成子类。

       但是Spring AOP基于注解配置的情况下,需要依赖于AspectJ包的标准注解,但是不需要额外的编译以及AspectJ的织入器,而基于XML配置不需要。

3. Hibernate 和Mybatis区别,Hibernate的四种状态???

mybatis:

1. 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

2. 可以进行更为细致的SQL优化,可以减少查询字段。

3. 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

4. 二级缓存机制不佳。

hibernate:

1. 功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。

2. 有更好的二级缓存机制,可以使用第三方缓存。

3. 缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。

     1、瞬时状态(Transient)

        通过new开辟内存空间创建的实体对象,但是它没有纳入hibernate session的管理之中,如果没有变量对它引用,它将会被JVM(垃圾回收器)回收。瞬时状态的对象在内存中是孤立的,它与数据库无任何关联,仅仅是一个信息携带的载体。 一个瞬时状态对象被持久化状态对象引用,它也会自动变为持久化状态对象。例如调用session的save、saveorupdate等方法的时候。


     2、持久化状态(Persistent)

     持久化状态对象存在与数据库中的数据关联,它总是与会话状态(Session)和事务(Transaction)关联在一起。当持久化状态对象发生变动时并不会立即执行数据库操作,只有当事务结束时,才会更新数据库,以便保证Hibernate的持久化对象和数据库操作的同步性。 当持久化状态对象变为托管状态对象时,它将不在Hibernate持久层的管理范围之内。

     3、游离状态(Detached)

       当持久化对象的Session关闭之后,这个对象就从持久化状态变为托管状态。托管状态的对象仍然在与数据库中的数据关联,但是他并不在Hibernate的Session管辖范围之内。 
如果将脱管状态的对象重新关联到某个新的Session上,它将变回持久化状态对象。
     4、删除状态   

  调用session的delete方法时,对象转为删除态。删除态只能等待被回收

 

4. springboot 的加载原理??

5.spring 的生态??

参考:::https://www.cnblogs.com/nuccch/p/10958254.html

6 springclould 微服务 分布式  待学 Redis  mogbd,nginx ??

7 数据库sql 优化主要涉及到那些,索引建立的规则?

    (1).避免全表扫描,应该考虑在where及order by 涉及的列上建立索引。

          索引的建立规则:

               (1).索引不是越多越好,因为索引越多,对update和insert操作也会有性能的影响,涉及到索引的新建和重建操作。

                 (2).多数查询经常使用的列,很少进行修改操作的列,索引需要建立在数据差异化大的列上。

  (2).like语句的优化,查询必然走全表查询,除非必要,否则不要在关键词前加%。

  (3).where子句中使用 != 或 <>操作符,索引将被放弃使用,会进行全表查询

    (4).在where子句中使用 IS NULL 或 IS NOT NULL 判断,索引将被放弃使用,会进行全表查询

    (5).使用union all 或 union(必要的时候)的方式替换“or”会得到更好的效果。where子句中使用了or,索引将被放弃使用。

    (6)in和not in 也要慎用,否则也会导致全表扫描。

     方案一:between替换in

       如SQL:SELECT id FROM A WHERE num in(1,2,3) 优化成:SELECT id FROM A WHERE num between 1 and 3

     方案二:exist替换in

       如SQL:SELECT id FROM A WHERE num in(select num from b ) 优化成:SELECT num FROM A WHERE num exists(select 1 from B where B.num = A.num)

     方案三:left join替换in

      如SQL:SELECT id FROM A WHERE num in(select num from B) 优化成:SELECT id FROM A LEFT JOIN B ON A.num = B.num

     (7).避免疏浚类型的转换(where) colunm 的数据类型和传入的数据类型不一致,会导致索引失效。

   (8).exist 代替 in

SELECT * from A WHERE idin (SELECT id from B)
SELECT * from A WHERE id EXISTS(SELECT 1 from A.id= B.id)
  in 是在内存中遍历比较

  exist 需要查询数据库,所以当B的数据量比较大时,exists效率优于in.

  in()只执行一次,把B表中的所有id字段缓存起来,之后检查A表的id是否与B表中的id相等,如果id相等则将A表的记录加入到结果集中,直到遍历完A表的所有记录。

  In 操作的流程原理如同一下代码

    List resultSet={};
    Array A=(select * from A);
    Array B=(select id from B);
    for(int i=0;i<A.length;i++) {
      for(int j=0;j<B.length;j++) {
        if(A[i].id==B[j].id) {
          resultSet.add(A[i]);
          break;
        }
      }
    }
   return resultSet;


  可以看出,当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次

  如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差。

  再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升。

  结论:in()适合B表比A表数据小的情况

  exist()会执行A.length()次,执行过程代码如下

    List resultSet={};
    Array A=(select * from A);
    for(int i=0;i<A.length;i++) {
      if(exists(A[i].id) { //执行select 1 from B where B.id=A.id是否有记录返回
        resultSet.add(A[i]);
      }
    }
    return resultSet;


  当B表比A表数据大时适合使用exists(),因为它没有那么多遍历操作,只需要再执行一次查询就行。

  如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等。

  如:A表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果。

  再如:A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,

  我们都知道查询数据库所消耗的性能更高,而内存比较很快。

  结论:exists()适合B表比A表数据大的情况

   当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用。

8. 项目中你认为做的比较突出方面???

9.shiro 项目中用到那些方面?

参考::::https://www.cnblogs.com/xifengxiaoma/p/9508760.htm

10.Liunx 的部署??

 

转载于:https://www.cnblogs.com/xiaofuzi123456/p/11403356.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值