单例模式

饿汉式

static 是默认全剧配置 ,运用java加载类的机制 ,在线程中是安全的
通过方法 获取 这个对象

优点是: 在类加载的时候就创建好了。是没有延迟的,没有加锁效率高
缺点是: 浪费内存,产生垃圾对象,对于反射不安全,反序列化也是不支持的
image.png

登记式

加强版的饿汉式
静态内部类,返回静态内部类中的属性
可以实现延时加载。过去实例对象的时候才进行加载。
image.png
image.png
可以通过代码实现 反 反射 (反射就报错)
原理是:当你 调用get方法回去初始化 ,因为是一个静态的属性,在虚拟机是全局作用域,反射再去创建 ,通过构造方法的 ,会我们会抛出一个异常 ,也可以通过read 方法让他反序列化也是安全的

枚举式

image.png
image.png
jdk1.5,没有构造函数,就自动防止反射了, 也支持反序列化,但是用到继承就不很恰当

懒汉式

image.png
但是是线程不安全的 , 有可能线程进入先后顺序在判断完成后,没有初始化完成,另一个就进入了
可以加线程安全关键字
image.png
也可以写成同步代码块
image.png
然后主线程运行不完成的情况 ,可以先让主线程阻塞

image.png

双重检索

因为每次同步代码块效率低

image.png
也就是双重检索,在第一次两个都没有创建的时候,第一次判断有可能只需要一次同步,在下一次进行判断的时候,就在外层判断的时候就会被拦截 ,不会再去多次同步

指令重排

使懒汉式不一定是百分之百单例模式 ,
在运行中是没问题的,在多线程中,有可能会出现 别的线程过来拿走一个指向为空的地址
image.png
解决方法
在对象上加一个 volatile 关键字 ,保证不会重排
image.png

ThreadLocal

本身不加锁,为每个线程提供一个独立副本 。只能保证在一个线程里 是单例的,在多个线程里就会不一定是单例的(也就是 开了多个线程后 ,每个线程里 new多次是单例,但是每个线程之间的地址不一样,不是单例)

image.png

CAS

image.png
for 死循环 ,会产生很多的垃圾对象,但是 会最后保证得到单例的唯一性 ,对服务器压力比较大

总结

image.png

异常

image.png

image.png

image.png

image.png

int 和 integer 的区别

image.png

算法题

大位数加法

image.png
image.png

image.png
image.png

大位数乘法

image.png

image.png
image.png

出现次数的字符串(多,少)

双层循环 逐个去比较
也可以用map 去存值,然后每次取值比较
基本数据类型不能用在泛型里
image.png

第一个重复的值

image.png
通过set 集合 , set方法不允许出现重复的,如果插入进去就说明没重复,如果重复了就输出

第一个只出现一次的字符

先统计次数,然后遍历第一个出现的字符
image.png

或者通过判断位置
image.png

看一段数字中出现的个数,并将他们按升序排序

image.png

按照输入字符,和字节数量 ,进行截取

image.png

字符串中截取匹配字符

image.png

字符串反转

三种方法
image.png

输入一个字符串(含分隔符),以分隔符进行分割 ,反转输出

image.png

给定一个字符串,反转字符串每个单词字符的顺序,保留单词和空格的初始位置

image.png

验证是不是ipv4

image.png

求和最大的子序列值,开始位置和结束位置

1暴力破解法 ,就是穷举 ,所有的情况
2动态规划

image.png
主要是看前面一个集合是否为正数,自身是否为正数 ,如果前一个集合为正,自身也为正就加上,
前一个集合为负就不加

image.png

2

image.png

image.png

3

image.png
image.png

4

image.png
image.png
image.png

5

image.png
image.png