黑马程序员技术交流社区

标题: 集合体系和反射 [打印本页]

作者: 沉默之人    时间: 2018-1-4 19:39
标题: 集合体系和反射
集合体系
Collection接口
迭代器的概述和测试foreach的概述(也叫增强for循环)
  • 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是属性值










欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2