学习笔记之Java基础

77 阅读4分钟
  1.  java中wait和sleep有什么区别?多线程条件下如何保证数据安全?
  • wait会释放线程锁,当前线程进入等待池,sleep不会释放锁,休眠时间到时后继续执行当前线程
  • sleep方法是Thread的,wait方法是Object类的
  1.  IOC实现原理:

传统应用程序都是在类的内部手动创建其他类的依赖,而ioc的做法则是把创建和查找依赖对象的控制权交给了容器,由容器来进行组合对象

好莱坞原则:----"别找我们,我们找你" 即由ioc容器帮对象查找相应的依赖对象并注入,而不是由对象主动去寻找

  1.  AOP:
    1. 基于ioc的一个扩展功能
    2. bean的创建过程中有一个步骤是对bean进行扩展实现,aop本身就是一个扩展功能,所以在BeanPostProcessor的后置处理方法中来进行实现
    3. 核心:切面、横切关注点、通知、连接点、切入点、织入
    4. 一句话描述:剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为Aspect,即为切面,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑封装起来,便于减少代码的重复性,并且有利于未来的可操作性和可维护性。
  1.  Java集合:
  2. Redis:
  3.  事务:
    1. 先做准备工作,解析各个方法上事务相关的属性,根据具体的属性来判断是否开启新的事务
    2. 当需要开启新事务的时候,获取数据库连接,关闭自动提交功能,开启事务
    3. 执行具体的sql逻辑操作
    4. 在操作过程中如果失败了,通过completeTransactionAfterThrowing来执行回滚操作,回滚的具体逻辑是通过doRollback方法来实现的,实现的时候也是先获取数据库连接,通过连接对象来进行回滚
    5. 如果操作成功了,通过commitTransactionAfterReturning来完成事务的提交,提交的具体逻辑是通过doCommit方法来实现的
    6. 当事务完成后,需要清楚事务的相关信息,cleanupTransactionInfo
  1.  sql优化:

a. 最大化利用索引

      1. 避免不使用索引的场景
      2. 避免使用in或者not in
      3. 避免使用不等号
      4. 避免使用or,会导致数据库放弃所以进行全表扫描
      5. 尽量不要在where语句中的等号左边进行表达式、函数等操作
      6. order by要和where条件保持一致

b. 减少无效数据的查询

i. 避免出现select *

ii. 避免出现不确定结果的函数

iii. 小表驱动大表

c. 尽量避免全表扫描

  1.  抽象类和接口:
    1. 抽象类要被子类继承,而接口需要被实现
    2. 接口只能做方法声明,而抽象类既可以做方法声明,也可以做方法实现
    3. 抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别更高
    4. 抽象类可以有具体的方法和属性,但是接口不可以,他只能有抽象方法和不可变常量
    5. 抽象类主要用于抽象类别,接口主要用于抽象功能
  1. 索引:
    1. 总结:排好序的快速查找数据结构
    2. 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构之上使用高级查找算法,而这种数据结构就是索引。
    3. 平常所说的索引,如果没有特别声明,都是B树(多路搜索树,不一定是二叉的)结构组织的索引。其中聚集索引、次要索引、覆盖索引、复合索引、唯一索引等默认都是B+树索引,统称索引,除了B+树索引以外还有哈希索引