反射,泛型,容器
反射
类加载(加载,验证,准备,解析,初始化),class文件包含了所有的类信息,

反射是发生在运行期, 
他们俩的区别图为: 
普通的new对象, 编译器加载class。然后查找构造函数,通过构造函数生成对象
反射:运行期加载class,创建构造函数,通过构造函数生成对象
反射:
三种获取class方式: Class.forName() :类.class . 实体类.getclass()
创建构造函数:getConstuctor();
通过无参构造方法创建对象: newInstance();
/** 首先:获得Person的字节码 */
Class personClazz = Class.forName("com.xx.reflect.Person");
/** 其次:通过Class对象,创建构造方法对象 */
Constructor constructor1 = personClazz.getConstructor(String.class, Integer.class, Byte.class,
Boolean.class); // 初始化有参构造方法对象
Constructor constructor = personClazz.getConstructor(); // 初始化无参构造方法
/** 最后:通过构造方法创建对象 */
// 调用无参数构造方法创建Person对象
Person person = (Person) constructor.newInstance();
person.setName("muse1");
System.out.println("person=" + person);
// 调用有参数构造方法创建Person对象
Person person1 = (Person) constructor1.newInstance("muse1", 10, (byte) 1, true);
System.out.println("person1=" + person1);
获取public对象直接用
Field nameField = personClazz.getField("name");
获取private对象
Field sexField = personClazz.getDeclaredField("sex");
sexField.setAccessible(true);

BeanUtils
泛型 (不用强转 安全 )
类型参数化
允许在定义类、接口、方法时使用类型形参,当使用时
指定具体类型
所有使用该泛型参数的地方都被统一化,保证类型一致。
如果未指定具体类型,默认是Objec t类型。集合体系中
的所有类都增加了泛型,泛型也主要用在集合
PECS(Producer Extends Consumer Super)
https://www.cnblogs.com/huoqm/p/13931363.html
/**
* 【读取】
* 如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer Extends)
*/
/**
* 【写入】
* 如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer Super)
* <p>
* 如果既要存又要取,那么就不要使用任何通配符。
*/
泛型擦除(类加载成class后会擦除泛型,里边的T变成object) 和桥接(重写object调用super.method)
-
容器
arraylist 底层数组 默认容量10 负载因子0.5
linklist 底层双向链表
hashmap 数组+链表/红黑树 默认16 负载因子。0.75
当链表长度>8 并且 table的size大于64 链表才会转换为红黑树
add方法
懒加载模式 第一次add才会初始化map
key.hash 高16不变,低16与高16位异或得出key的hash
判断在数组的那个位置是(table.size-1)&key.hash 来决定哪一个槽

浙公网安备 33010602011771号