挑战第 5 天
java反射
- 定义:
- 运行时动态获取类信息和调用方法的特性。
- 应用场景:
- JDBC数据库连接。
- 框架如Hibernate和Struts等。
- 实现方式:
- 通过四种方法获取Class对象:
- Class.forName(“类的路径”)
- 类名.class
- 对象名.getClass()
- 基本类型的包装类通过Type属性获取Class对象。
- 核心类:
- Class:获取类和接口信息。
- Field:获取属性信息和动态访问权限。
- Constructor:获取构造方法信息和访问权限。
- Method:获取方法信息。
- 优缺点:
- 优点:
- 运行时动态获取实例,提高灵活性。
- 可与动态编译结合。
- 缺点:
- 性能较低,因为需要解析字节码。
- 破坏封装性,可以访问私有方法和属性。
- 性能优化方案:
- 使用setAccessible(true)关闭安全检查。
- 缓存Class对象以加快多次实例化速度。
- 使用ReflectASM工具类通过字节码生成加速反射。
List Set Map 区别
- List:
- 存储元素的顺序是有序的。
- 可以包含重复的元素。
- 允许元素引用相同的对象。
- Set:
- 不允许重复元素。
- 元素自动去重,不会有多个元素引用相同的对象。
- 无序的,但某些实现如LinkedHashSet和TreeSet可以保持元素的插入顺序或自然排序顺序。
- Map:
- 使用键值对存储数据。
- 每个键最多只能映射到一个值。
- 键不能重复,但值可以重复。
- 键通常使用String类型,但也可以使用任何对象。
- Map不保证元素的顺序,但某些实现如LinkedHashMap可以保持插入顺序。
Object 常用方法
- clone方法:
- 保护方法,用于实现对象的浅复制。
- 只有实现了Cloneable接口的类才能调用此方法,否则会抛出CloneNotSupportedException。
- 实现深拷贝需要成员变量也为引用类型并实现Cloneable,同时重写clone方法。
- finalize方法:
- 与垃圾收集器相关,用于判断对象是否可以被回收。
- 当对象即将被垃圾回收器回收时,由垃圾回收器调用此方法。
- equals方法:
- 用于比较对象的等价性。
- 默认行为与==相同,即比较对象的内存地址,通常需要在子类中重写。
- hashCode方法:
- 用于哈希查找,通常在重写equals方法时也需要重写此方法。
- JDK 1.6和1.7默认返回随机数,而JDK 1.8使用Marsaglia’s xorshift scheme算法生成随机数。
- wait方法:
- 与synchronized关键字配合使用,使当前线程等待对象的锁。
- 可以无限期等待或设置超时时间。
- 等待期间,线程进入睡眠状态,直到被通知、被中断或超时。
- notify方法:
- 与synchronized关键字配合使用,唤醒在此对象上等待的单个线程。
- notifyAll方法:
- 与synchronized关键字配合使用,唤醒在此对象上等待的所有线程。
- toString和getClass方法:
- toString方法用于返回对象的字符串表示,通常需要在子类中重写。
- getClass方法用于获取对象的运行时类信息,通常不需要讨论。