* 迭代器 *作用: 遍历集合
*并发修改异常:
*原因: 迭代集合时改变了集合的长度
*解决:
*不使用迭代器
*使用迭代器对象中的修改方法
* 泛型 *作用:
*约束集合中元素的数据类型
*将运行时发生的类型转换异常提前到了编译时期
* 遍历集合的3种方式
*普通for循环
*迭代器
*增强for循环
*优点: 快速简便的遍历集合元素
*缺点: 不能在遍历过程中修改集合, 也没有索引可以使用
* 常见的数据结构
*数组
*特点:
*长度一旦确定则不可改变
*有整数索引
*只能存储同一个数据类型的元素
*既能存储基本数据类型, 又能存储引用数据类型
*增删慢, 查询快
*链表
*特点:
*增删快, 查询慢
*栈
*特点: 先进后出, FILO
*队列
*特点: 先进先出, FIFO
* Set *Set是一个接口, 继承自Collection接口
*Set特点
*元素无序(存入和取出顺序不一样)
*元素不能重复(元素唯一)
*没有索引
* HashSet类 *是Set接口的实现类
*方法
*`boolean add(E e)`: 添加成功返回true; 添加失败(重复了)返回false
* 保证元素唯一性的原理(hashCode()方法和equals()方法)
*HashSet的add()方法, 首先使用当前集合中的每一个元素和新添加的元素进行hash值比较
*如果hash值不一样, 则不重复, 直接添加新元素
*如果hash值一样, 则继续比较地址值或使用equals方法进行比较
*如果比较结果一样, 则认为重复, 不添加
*如果for循环所有比较都不一样, 则不重复, 添加元素
*如何让自定义对象去重?
*重写`hashCode()`和`equals()`方法
* Collections工具类 *作用: 提供Collection类的一些工具方法
*静态方法
*`static int binarySearch(List list, T key)`: 使用二分查找来查找元素在指定列表的索引位置
*`static void copy(List dest, List src)`: 将源列表中的数据覆盖到目标列表
*注意: 目标列表的长度至少等于源列表的长度
*`static void fill(List list, Object obj)`: 使用指定对象填充指定列表的所有元素
*`static void reverse(List list)`: 反转集合中的元素
*`static void shuffle(List list)`: 随机打乱集合中元素的顺序
*`static void sort(List list)`: 将集合中的元素按照元素的自然顺序排序
*自然顺序: 元素要具有比较性
*`static void swap(List list, int i, int j)`: 将指定列表中的两个索引进行位置互换
* Map接口 * `Map<K,V>`是接口, 是双列集合的顶层
*Map的特点
*存储方式是key-value(键值对)方式, 即一个键对应一个值
*每个键只能映射一个值
*Map中的键不能重复, 值可以重复
*key是无序的
*Map和Collection的区别
*Map是双列集合, 用于处理有对应关系的数据, key不能重复且无序
*Collection是单列集合, 有不同的子体系, 有的允许重复且有序, 有的不允许重复且无序
*创建对象
*`Map<K, V> map = new HashMap<>();` 多态
*`HashMap<K, V> map = new HashMap<>();` 正常
*方法
*`V put(K key, V value)`: 添加键值对
*`V get(Object key)`: 通过指定键获取值
*`int size()`: 获取集合长度
*`containsKey(Object key)`: 是否包含指定的键
*`containsValue(Object value)`: 是否包含指定的值
*`boolean isEmpty()`: 是否为空
*`void clear()`: 清空集合
*`V remove(Object key)`: 删除指定键的值(key和value都会删除)
*`Set<Map.Entry<K, V>> entrySet()`: 获取键值对的Set集合
*`Set<K> keySet()`: 获取所有键的Set集合
*`Collection<V> values()`: 获取所有值得Collection集合
*Map遍历的2种方式
*方式1:
*`map.keySet()`获取key的Set集合
*遍历Set集合获取每一个key
*通过`map.get(K key)`获取value
*方式2:
*`map.entrySet(K,V)`获取`Entry<K,V>`的Set集合
*遍历Entry的Set集合, 得到一个Entry对象
*调用Entry对象的getKey()获得key, 调用Entry对象的getValue()获取value
* 可变参数
*原理: 底层是根据参数长度创建的数组(JVM操作)
*格式: `形参数据类型... 形参名`
*注意事项:
*可变参数的数量可以从0个到多个
*可变参数只能是一种数据类型
*可变参数的定义位置必须在方法形参列表的最后一个
*如何使用可变参数: 把可变参数的形参名作为一个数组变量名, 遍历获取元素