java- 基础整理

mysql优化:

1. 减少访问量 : 设置合理的字段,启用压缩通过索引减少与io磁盘的交互

2. 返回更少的数据 : 只返回我们需要的字段或分页数据,,减少磁盘io和网络io

3. 减少交互次数 : 减少与数据库的连接次数

4. 减少CPU的开销 : 尽量减少数据库排序操作以及全表扫描

5. 利用更过的资源,使用表分区,可以增加并行操作,更大限度的利用CPU的资源

总的来说 : 就是最大限度的利用索引 , 避免全表扫描 , 减少无效的数据查询

全表扫描如果数据库中数据非常大的时候会导致整个程序的性能相对降低 , 唯一性差的字段不适合建索引 ; 大于小于不等于或者or , is null ; not null , 模糊查询左模糊等会导致索引失效

进程 : 他是程序的一个可执行单元,有自己的工作内存

线程 : 是进程的可执行单元,有自己的工作内存

现在的安全性问题 :

1. 原子性问题 : 一个或者多个操作要么全部执行成功,要么全部执行失败,多个操作是不可分割的整体

2. 可见性问题 : 共享资源是存储在主内存中的,当线程进来的时候是将主内存中的数据拷贝一份到工作内存的的,在工作内存中对共享变量的修改,主内存中是不可见的

3. 有序性问题 : 进入编译 期是 时候,可能会进行代码重排,而代码的重排会对下一个线程访问的结果产生影响

解决线程安全性问题可以使用加锁的方式解决

悲观锁 : 每次拿资源的时候都认为别人会修改数据,所以每次都需要加锁,当一个线程进来拿资源的时候,共享资源被其他线程占用了,就会进入一个阻塞状态,直到拿到资源

乐观锁 : 每次拿资源的时候都会认为别人不会修改数据,所以每次都不会加锁,但是再进行更新数据的时候会判断这个资源是否被别人修改过 ; 一般这种情况我们可以使用版本号机制或者CAS(比较并交换)机制解决这一问题

乐观锁主要适用于读多写少的场景,这样可以大大提高数据的吞吐量

版本号机制 : 在表中加一个版本(version)字段,当前的版本为1 , 当两个线程同时操作他们拿到的版本都是1 ,但是线程A执行完版本号加1并且更新了数,线程B提交更新后的版本号是2,线程A操作并更新的版本号也是2,那么线程B的提交就会被驳回

CAS机制 : 比较并交换 ; 由线程可见性问题 ; 将工作内存中变量的值与主内存中变量的值进行比较,如果不同那就交换数据, 如果相同那就不交换,重新从主内存中拷贝一份

单例集合 :

arrayList : 查询快,增删慢,他是基于数据结构的,每次增删的时候都是在数组的尾部进行添加或删除

LinkedList : 查询慢,增删快, 他是基于链表结构的,他的查询操作是对整个链表的遍历,增删只需要指针指向即可

ArrayList的扩容机制 : 他的默认容量是10,每次扩容都是在原数组的基础上扩容1.5倍,一般我们在使用他的时候会设置一个容量这样可以避免数组的扩容

HashMap是双列集合 : 他的数据结构是数组和链表,对数据的查询和修改是继承了数组的线性查找和链表的寻址修改;

HashMap是线程不安全的在jdk1.7中会发生环形链和数据丢失的情况,在jdk1.8中HashMap的put过程会发生数据覆盖的情况

HashMap的put过程 : 

1. 对key计算求哈希值

2. 判断是否发生哈希碰撞, 没有发生碰撞就放入桶中

3. 发生了碰撞就以链表的方式链接到后面

4. 如果链表的长度大于8就转为红黑树,小于6就从红黑树转为链表

5.判断节点中是否有值,有就替换旧值

6. 如果桶满了就进行扩容2倍重排

设计模式 : 单例设计模式 , 工厂设计模型 , 代理模式 ,装饰者模式,抽象模式等等

单例设计模式 : 五大写法

1. 饿汉式   2. 懒汉式  3. 静态内部类  4. 双检索   5. 枚举

四大原则 :

1. 构建私有制

2. 以静态方法或者枚举返回一个实例

3. 确保只返回一个实例,尤其是在多线程的情况下

4. 确保反序列化时不会重新构建对象

Spring是一个轻量级的容器架构他的两大定理IOC和AOP

IOC : 容器去控制程序与对象之间的关系而不是直接使用代码去操作的,将对象的创建于销毁交给spring去管理,这也叫做控制反转,并且他还提供了依赖注入,当容器运行到一定的时候会将依赖动态的注入到组件中去

依赖注入的思想 : 就是通过反射机制,在实例化一个类时通过反射调用类中的set方法将事先保存在hashmap中类的属性注入到类中 ; 总的来说通常是由调用者去创建被调用者的实例,但是再spring中被调用者交给了spring去创建我们只需要注入调用者就可以了

IOC的优点 : 降低了组件之间的耦合度 , 降低了业务之间替换的复杂性 , 可以灵活的管理任何对象

AOP : 是一个面向切面编程,,我们可以将一个对象看作一个圆柱体,里面封装的是对象的属性和方法,将这个圆柱以切面的形式剖开,选择性的提供业务逻辑,然后后巧妙的将这个切面复原不留任何痕迹还达到效果

 AOP又分为了JDK动态代理和CGLIB动态代理

JDK动态代理 : 他的代理对象必须是某个接口的实现,他是通过运行期间创建一个接口的实现类来完成目标对象的代理

CGLIB动态代理 : 实现的原来类似于JDK动态代理 ; 而他是在运行期间生成的代理对象是针对目标类扩展的子类. 他还可以高效的生成包,底层是依靠ASM操作字节码实现的,性能也就比JDK强

spring中Bean的注入方式:

1. set方法注入 : 那么必须要为属性提供set方法,Spring容器就是通过调用bean的set方法为属性注入值的。而在xml文件中,使用set注入的方式就是通过property标签
2. 构造器注入 : 通过调用bean所属类的带参构造器为bean的属性注入值。为类提供包含参数的构造方法。
3. 静态工厂注入 : 编写一个静态的工厂方法,这个工厂方法会返回一个我们需要的值,然后在配置文件中,我们指定使用这个工厂方法创建bean。
4. 实例工厂注入 : 需要有一个实例对象,才能调用它的工厂方法。

静态工厂调用工厂方法不需要先创建工厂类的对象,因为静态方法可以直接通过类调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值