A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-1-5 09:12 编辑

阶段学习笔记之集合小结


    在这半个月的学习生活中,自己又收获了很多,这些知识可以为以后的学习甚至是工作打下坚实基础,现在就小结一下集合所学习的相关内容的吧,在集合的学习中,我们学习了Collection,迭代器,增强for,泛型,List子集以及后边所学习的HashSet,HashMap以及Map集合嵌套,具体详细总结出来的笔记见下边所总结的内容:

* 集合
* 包含了不同的实现类, 向上抽取出了很多共性的接口, 形成了一个体系结构
* 数据结构
    *数据的组织和存储方式

* 迭代器
    *作用: 遍历集合
    *并发修改异常:
        *原因: 迭代集合时改变了集合的长度
        *解决:
            *不使用迭代器
            *使用迭代器对象中的修改方法
* 泛型
    *作用:
        *约束集合中元素的数据类型
        *将运行时发生的类型转换异常提前到了编译时期
* 遍历集合的3种方式
    *普通for循环
    *迭代器
    *增强for循环
        *优点: 快速简便的遍历集合元素
        *缺点: 不能在遍历过程中修改集合, 也没有索引可以使用
* 常见的数据结构
    *数组
        *特点:
            *长度一旦确定则不可改变
            *有整数索引
            *只能存储同一个数据类型的元素
            *既能存储基本数据类型, 又能存储引用数据类型
            *增删慢, 查询快
    *链表
        *特点:
            *增删快, 查询慢
    *
        *特点: 先进后出, FILO
    *队列
        *特点: 先进先出, FIFO
* Set
    *Set是一个接口, 继承自Collection接口
    *Set特点
        *元素无序(存入和取出顺序不一样)
        *元素不能重复(元素唯一)
        *没有索引
* HashSet
        *Set接口的实现类
        *方法
            *`boolean add(E e)`: 添加成功返回true; 添加失败(重复了)返回false
          * 保证元素唯一性的原理(hashCode()方法和equals()方法)
            *HashSetadd()方法, 首先使用当前集合中的每一个元素和新添加的元素进行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是无序的
   *MapCollection的区别
        *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)`: 删除指定键的值(keyvalue都会删除)
        *`Set<Map.Entry<K, V>> entrySet()`: 获取键值对的Set集合
        *`Set<K> keySet()`: 获取所有键的Set集合
        *`Collection<V> values()`: 获取所有值得Collection集合
    *Map遍历的2种方式
        *方式1:
            *`map.keySet()`获取keySet集合
            *遍历Set集合获取每一个key
            *通过`map.get(K key)`获取value
        *方式2:
            *`map.entrySet(K,V)`获取`Entry<K,V>`Set集合
            *遍历EntrySet集合, 得到一个Entry对象
            *调用Entry对象的getKey()获得key, 调用Entry对象的getValue()获取value
* 可变参数
    *原理: 底层是根据参数长度创建的数组(JVM操作)
    *格式: `形参数据类型... 形参名`
    *注意事项:
        *可变参数的数量可以从0个到多个
        *可变参数只能是一种数据类型
        *可变参数的定义位置必须在方法形参列表的最后一个
    *如何使用可变参数: 把可变参数的形参名作为一个数组变量名, 遍历获取元素



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马