1 hash
• string的hashcode计算:
hashcode=hashcode*31+string值
• hash下标的计算:
[(hashcode>>16)异或hashcode]&(n-1),n是2的倍数(,负载因子默认0.75
• resize的实现
首先容量翻倍(便于resize的实现),然后,计算(hashcode)&n 的首位(即高四位的最低一位),如果是0的位子,下标不变,如果是1的位子,下标变为之前的值+空间容量增量。一条链表变成两条链表。进行判断,改变索引。
2.反射的三种方式
• 通过Class类的静态方法实现:
class1=Class.froName(“类名");
• 通过class属性:
class=Personcc.class;
• 通过getClass方法:
Person person=new Person();
Class<?> class=peison.getClass();
3.静态代理和动态代理
• 静态代理:
代理对象和目标对象均实现同一个行为接口,代理类和目标类分别具体实现接口逻辑,在代理类的构造函数中实例化一个目标对象,在代理类中调用目标对象的行为接口。
• 动态代理:
提供实际类,利用反射机制,自动生成代理类,也可对需要增强的方法进行定位,避免静态带来的麻烦。
4.序列化
序列化是一种持久化存储文件
实现serializable接口的类中,所有变量会自动序列化,只有transient描述的变量不会被序列化
实现externalizable接口的类中,所有变量都不会自动序列化。需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关
5.try catch finally
finally块的语句在try或catch中的return语句执行之后返回之前执行,且finally里的修改语句可能影响也可能不影响try或者catch中的return已经确定的返回值,(若果try中返回引用数据类型,finally中可以返回修改后的值)。
6.线程
• 创建线程的三种方法:
1.继承thread类,重写run方法,创建子类对象,对象.start()开启线程。
当前线程:this关键字即为当前线程。
2.实现runnable()接口,重写run方法,new thread(实现类,”线程名“).start()开启线程
当前线程:thread.currentthread
3.实现callable()接口,重写可有返回值的call方法,创建future task对象开启线程,参数为接口实现类。
当前线程:thread.currentthread
线程池工作原理:
核心线程池——工作队列——线程池
7.锁
• 死锁的产生条件
互斥:一个资源每次只能被一个线程使用。
请求与保持:一个线程因为请求资源而阻塞时,对已经获得的资源保持不放
不剥夺:线程已经获得的资源,在未使用完之前,不能强行剥夺
循环等待:若干县城之前形成一种头尾相接的循环等待资源关系
• 死锁三种情况
1.静态的顺序思索:不同方法不同顺序获得了相同的锁
解决方法:把所顺序调整一致
2.动态所顺序死锁:同一方法,不同顺序调用相同参数
解决方法:生成对应的哈希吗。然后按照哈希吗分配锁顺序
3.协作对象之间发生思索:持有锁的同时调用了外部方法
解决方法:设置标记,要调用,在不持有锁时才调用
8.线程间通信
• wait方法,等待并释放锁(故,必须拿着锁,故必须在synchronized代码块中)
与sleep的区别:wait放弃锁进入等待,sleep一直拿着锁睡去。
• notify唤醒:在两类大量存在的消费者/生产者同类线程时,可能由于一直唤醒同类,导致家私。故有了singall全唤醒。并且用while替换了if的判断,避免逻辑混乱。(多类线程互锁)
9.volatile
保证可见性:直接写入内存,做持久化操作,而不是仅在工作内存
保证有序性:保证被修饰的前后指令顺序不变(单例中,防止出现返回空对象的情况)
不保证原子性
10.乐观锁和悲观锁
• 悲观锁,每个线程独占资源
• 乐观锁,采用CAS算法
11.static关键字的作用
• 被static修饰的变量属于类变量,可以通过类名.变量名直接引用
• 被static修饰的方法属于类方法,可以通过类名.方法名直接引用
• static内部类是内部类中一个比较特殊的情况,Java文档中是这样描述static内部类的:一旦内部类使用static修饰,那么此时这个内部类就升级为顶级类。也就是说,除了写在一个类的内部以外,static内部类具备所有外部类的特性。且静态内部类可以有静态元素。
• 与内部类不同,内部接口自动具备静态属性,不需要static修饰,也就是说,普通类是可以直接实现内部接口的。
1、静态方法能不能引用非静态资源?不能,new的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它。
2、静态方法里面能不能引用静态资源?可以,因为都是类初始化的时候加载的,大家相互都认识。
3、非静态方法里面能不能引用静态资源?可以,非静态方法就是实例方法,那是new之后才产生的,那么属于类的内容它都认识。
12.final关键字
根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
• final类不能被继承,没有子类,final类中的方法默认是final的。
• final方法不能被子类的方法覆盖,但可以被继承。
• final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
• final不能用于修饰构造方法
1、final数据:
一个永不改变的编译时常量。
一个在运行时被初始化的值,而之后无法被改变;
一个既是static又是final的域:是一段不能改变的存储空间;
final类型运用于数据:
基本数据类型(int、double、char…)运用final时,使数值恒定不变;
对象引用运用final时,final使得引用恒定不变,引用内部的数据若不是final型,可以进行修改。
数组类型运用final时,final使得数组引用恒定不变,数组内部的数据若不是final型,可以进行修改。
final与static
final指明数据为一个常量,恒定无法修改;
static指明数据只占用一份存储区域;
2、final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
• 把方法锁定,防止任何继承类修改它的意义和实现。
• 高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
3、final类
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
13.装饰者设计模式
存在的目的:在只能获取类,而不能改变原本代码的情况下,对某些类方法进行修改,增强。
被装饰类和装饰类都实现同一个接口。被装饰类是实类,装饰类可以是接口也可以是抽象类,还可以是普通类。(注意,抽象类中可以有构造函数)
然后,实现抽象类或者接口或者就用普通类当做装饰品,在装饰品的有参构造中,参数传入被装饰类的对象,然后调用希望调用的方法,在方法前后可随意修改。
来源:CSDN
作者:Victoria Coleone
链接:https://blog.csdn.net/qq_33581012/article/details/103846224