集合体系- 集合:
- 是一个统称, 包含很多集合的实现类. 根据不同数据结构, 提供了不同的集合类
- 数据结构:
- 体系结构:
- 将不同的集合实现类的共性向上抽取出父类, 从而形成一种体系
- 如何学习一种体系结构:
Collection接口 - 是单列集合体系的顶层
- 如何创建Collection对象?
- 本身是接口, 实际使用的是子类对象. 使用多态, Collection c = new ArrayList<>();
- 常用方法
- 增
- boolean add(E e): 向集合中添加元素, 添加成功返回true, 添加失败返回false. 永远能够添加成功
- 删
- boolean remove(Object o): 删除元素中的指定元素, 删除成功返回true, 删除失败返回false
- void clear(): 清空集合中的元素
- 判断
- boolean contains(Object o): 判断集合中是否包含指定元素, 包含返回true, 否则false
- boolean isEmpty(): 判断集合是否为空集合, 即没有元素. 没有元素返回true, 否则false
- 获取个数
- 转换
- Object[] toArray(): 将集合转换为Object[]
迭代器的概述和测试Iterator接口:
- 迭代器
- 作用:
- 获取迭代器:
- 使用集合对象调用Interator<E> iterator()方法
- 成员方法
- boolean hasNext(): 是否有下一个元素
- E next(): 返回下一个元素
- void remove(): 从迭代器指向的 collection 中移除迭代器返回的最后一个元素
foreach的概述(也叫增强for循环)```java // foreach格式 for (元素类型 变量名: 数组或集合对象) { // 每次循环都会遍历出一个元素, 保存到变量名中 } int[] arr = {1,2,3}; for (int i : arr) { System.out.println(i); } ``` - 注意:
- 增强for循环中不能修改集合(改变集合长度), 会发生并发修改异常
- 原因: 因为增强for循环内部使用的是迭代器进行迭代
增强for的优缺点:
- 优点: 简单快捷的拿到每一个元素
- 缺点:
- 循环过程中不能修改集合
- 不能像普通for循环那样使用索引
常见数据结构: 数组- 数组的特点:
- 长度一旦确定则不可改变
- 元素有整数索引
- 只能存储同一类型的元素
- 既可以存储基本数据类型, 也可存储引用数据类型
- 数组的增删改查:
- 增加/插入元素:
- 创建一个新数组, 长度为原数组长度+1
- 遍历原数组, 将原数组的元素复制到新数组的相同索引位置, 直到遇到要增加元素的索引位置
- 将要增加的元素值赋值到索引位置
- 继续复制剩余元素
- 删除元素:
- 创建一个新数组, 长度为原数组长度-1
- 遍历原数组, 将原数组的元素复制到新数组的相同索引位置, 直到遇到要删除元素的索引位置
- 跳过要删除的元素, 继续将剩余元素复制到后续索引位置
- 修改元素: arr[0] = 10;
- 获取元素: int i = arr[0];
- 通过以上增删改查的操作, 总结出数组的特点:
List的特点和特有功能List接口
- 继承自Collection接口. 在java.util包下
- 特点
- 元素有序(存入和取出的顺序一样)
- 有整数的索引
- 元素可以重复
- 特有功能
- void add(int index, E element): 添加元素
- E remove(int index): 删除元素
- E set(int index, E element): 修改元素
- E get(int index): 获取元素
Set体系的特点- Set接口:
- 继承自Collection接口
- 特点
- 元素无序(存入和取出的顺序不一致)
- 元素不能重复(元素唯一)
- 没有索引
- 注意:
- 无序: 指的是存入的顺序和取出的顺序不一样, 而不是说每次取出来是随机顺序, 存入后每次取出来的顺序都一样, 但和存入的顺序不一样
- 直接打印和获取元素都属于取出, 所以不要把打印当成是HashSet内部存储的样子
HashSet存储自定义对象并遍历HashSet类: 是Set接口的实现类
- 成员方法
- boolean add(E e): 添加成功true, 添加失败(重复了)返回false
HashSet存储自定义对象并遍历HashSet类: 是Set接口的实现类
- 成员方法
- boolean add(E e): 添加成功true, 添加失败(重复了)返回false
Map接口的概述- Map<K, V>接口
- 是双列集合的顶层, 和Collection属于同级
- 特点
- 存储方式是key-value(键值对)方式, 即一个键对应一个值
- 一个键只能映射一个值
- 键不能重复, 值可以重复
- 键是无序的
- Map和Collection的区别
- Map是双列集合, 用于处理有对应关系的数据,键不能重复且无序
- Collection是单列集合, 有不同的子体系, 有的允许重复且有序, 有的不允许重复且无序
- 反射
- 概念: 在程序运行时, 获取任何一个类的所有属性和方法(包括私有的). 调用任意一个对象的所有属性和方法(包括私有的)
- 前提:
- 获取字节码对象的3种方法
- 对象.getClass()
- 类名.class
- Class.forName(String fullClassName)
- 反射能干的事
- 获取一个类的字节码对象, 通过该字节码对象:
- 获取一个类的构造方法(public或全部权限的)
- 创建一个类的对象
- 获取一个类的成员属性(public或全部权限的)
- 获取一个类的成员方法(public或全部权限的)
- 反射使用的相关类和方法
- java.lang.Class类: 类的字节码对象
- 获取构造方法
- Constructor<?>[] getConstructors(): 以数组形式返回该类中所有public的构造方法. 如果没有public的, 则数组长度为0
- Constructor<?>[] getDeclaredConstructors(): 以数组形式返回该类中所有权限的构造方法, 包括private的. 如果该类是接口, 基本类型, 数组, void, 则数组长度为0
- Constructor<T> getConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的public的构造方法. 参数列表填写参数的字节码对象
- Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的所有权限的构造方法, 包括private的. 参数列表填写参数的字节码对象
- 获取成员属性
- Field[] getFields(): 获取所有public的成员变量
- Field[] getDeclaredFields(): 获取所有权限的成员变量, 包括private的
- Field getField(String fieldName): 通过指定的成员变量名获取指定的public的成员变量
- Field getDeclaredField(String fieldName): 通过指定的成员变量名获取指定的所有权限的成员变量, 包括private的
- 获取成员方法
- Method[] getMethods(): 返回所有public的方法数组
- Method[] getDeclaredMethods(): 返回所有权限的方法数组
- Method getMethod(String name, Class<?>... parameterTypes): 获取public的方法, 传入方法名和方法形参字节码对象
- Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取所有权限的指定方法, 传入方法名和方法形参字节码对象
- 创建对象
- T newInstance(): 使用该类的无参构造创建一个对象
- java.lang.reflect.Constructor类: 构造方法对象
- T newInstance(): 通过无参构造方法对象创建一个类的对象
- T newInstance(Object... initargs): 通过有参构造方法对象创建一个类的对象, 传入构造方法所需的参数列表
- void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的构造方法
- java.lang.reflect.Field类: 成员变量对象
- Object get(Object obj): 获取指定对象的属性值
- void set(Object obj, Object value): 将指定对象的属性值设置为指定的值
- void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的成员属性
- java.lang.reflect.Method类: 成员方法对象
- Object invoke(Object obj, Object... args): 调用指定对象的成员方法
- void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的成员方法
- JavaBean
- 就是一个类
- 作用: 用于封装和存储数据
- 规范
- 类必须是public修饰的
- 成员变量必须是private的
- 必须有public的set/get方法
- 至少提供一个无参构造方法
- 实现Serializable接口
- Jar包
- Java ARchive, 后缀名为.jar, 是一个压缩文件, 里面包含编译后的class文件和说明信息
- 作用: jar包中是写好的代码编译出来的class文件, 有了这些类文件, 就可以调用其中的方法
- 导入jar包的步骤
- 项目根目录下创建名为lib的目录
- 复制jar文件, 粘贴到项目根目录下的lib目录下
- 选中项目中的jar包, 右键, 选择Build Path, 点击Add to Build Path. 此时项目中的Referenced Libraries中会出现jar包名称的奶瓶, 说明已经添加成功
- 导入的jar包整个项目都能使用
- BeanUtils
- Apache组织提供的第三方类库Commons中的一个组件
- 作用:
- 利用反射技术给一个类的对象的成员属性赋值或获取值, 用于快速封装数据到JavaBean
- BeanUtils类常用的3个方法
- static void setProperty(Object bean, String name, Object value): 给JavaBean对象的成员属性赋值, 传入对象, 成员属性名, 属性值
- static String getProperty(Object bean, String name): 获取JavaBean成员属性的属性值, 传入对象, 成员属性名, 返回属性值的字符串形式
- static void populate(Object bean, Map properties): 给JavaBean对象的成员属性赋值, 传入对象, Map的key是属性名, value是属性值
|
|