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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

第二阶段笔记集合摘要
-石家庄校区黑马JavaEE基础6期

集合Collection
  • 包含了不同的实现类, 向上抽取出了很多共性的接口, 形成了一个体系结构
  • 数据结构
  • 数据的组织和存储方式
  • 迭代器
  • 作用: 遍历集合
  • 并发修改异常:
  • 原因: 迭代集合时改变了集合的长度
  • 解决:
  • 不使用迭代器
  • 使用迭代器对象中的修改方法
  • 泛型
  • 作用:
  • 约束集合中元素的数据类型
  • 将运行时发生的类型转换异常提前到了编译时期
  • 遍历集合的3种方式
  • 普通for循环
  • 迭代器
  • 增强for循环
  • 优点: 快速简便的遍历集合元素
  • 缺点: 不能在遍历过程中修改集合, 也没有索引可以使用
  • 常见的数据结构
  • 数组
  • 特点:
  • 长度一旦确定则不可改变
  • 有整数索引
  • 只能存储同一个数据类型的元素
  • 既能存储基本数据类型, 又能存储引用数据类型
  • 增删慢, 查询快


    • 链表
  • 特点:
  • 增删快, 查询慢



  • 特点: 先进后出, FILO


    • 队列
  • 特点: 先进先出, FIFO
// 增强for循环格式for (元素的数据类型 变量名 : 数组或集合对象) {    // 遍历出来的变量可以直接使用}
Collection接口(单列集合体系的顶层)    |    * boolean add(E e): 添加元素, 添加成功返回true, 否则false    |    * void clear(): 清空集合中的元素    |    * boolean contains(Object o): 判断集合中是否包含指定的对象    |    * boolean isEmpty(): 判断集合中是否没有元素. 与null区分    |    * boolean remove(Object o): 从集合中删除一个元素, 删除成功返回true, 否则false    |    * int size(): 获取集合的长度(元素的数量)    |    * Object[] toArray(): 将集合转换为Object[]数组    |    * Iterator<E> iterator(): 获取集合的迭代器对象    |- List接口(有序, 可重复, 有索引)        |    * void add(int index, E e): 添加元素到指定索引上        |    * E remove(int index): 删除索引上的元素, 并返回        |    * E set(int index, E e): 修改指定索引上的元素, 并返回被替换的元素        |    * E get(int index): 获取指定索引上的元素        |    * ListIterator listIterator(): 获取List特有的迭代器对象        |- ArrayList类(底层是数组, 查询快, 增删慢)        |- LinkedList类(底层是链表, 查询慢, 增删快)                * void addFirst(E e): 添加元素到集合的开头                * void addLast(E e): 添加元素到集合的末尾                * E getFirst(): 获取集合开头的元素                * E getLast(): 获取集合末尾的元素                * E removeFirst(): 删除开头的元素, 并返回                * E removeLast(): 删除末尾的元素, 并返回Iterator接口    |    * boolean hasNext(): 判断是否有下一个元素    |    * E next(): 获取下一个元素    |    * void remove(): 删除迭代器返回的最后一个元素    |- ListIterator接口            * void add(E e): 使用迭代器添加元素到集合            * void remove(): 使用迭代器删除元素
------------------------------------------------------------------------
Set接口,继承collection接口
  • 特点:
    • 元素存储无序(,存储和取出顺序不一样, 按照算法存储元素顺序)
    • 元素不可重复
    • 无索引
  • boolean add (Object o) 添加元素对象
  • 遍历方式
    • 调用toArray方法,转成数组遍历
    • 增强for循环遍历集合
    • Iterator<> i = set.iterator迭代器循环
HashSet,    Set的实现类 (自己总结:Set中的元素默认是根据其值的hash值从大到小排序)
  • 特点:
    • 元素存储无序
    • 元素不可重复
    • 无索引
  • HashSet存储自定义元素的注意事项
    • 重写equls方法必须重写hashCode方法
    • 去重方式
      • add底部是Map.put方法,利用Map中的K不能重复来存储
      • Map.put源码比较了K的hash值&&(比较地址值||equals方法),如果都有一样不同,则添加
  • HashSet唯一性规则
    • HashSet的add()方, 首先会使用当前集合中的每一个元素与新添加的元素进行hash值比较,hash值不一样则添加
    • 如果hash值一样,则比较地址值或使用equals方法比较
    • 如果equals比较不一样,则添加


Collections工具类
  • Collection和Collections的区别
    • Collection是集合体系的最顶层,包含了集合体系的共性, 而Collections是一个工具类
  • Collections的常用方法
    • static int binarySearch(List list, Object o) 使用二分查找法查找指定元素在指定列表的索引位置(折半查找)
      • 举例   Collections.binarySearch(list, 1);
    • static void copy (List dest,  List src); 将源列表的元素覆盖到指定列表,,目标类别的长度必须大于等于源列表
      • 举例    Collections.copy (dest, src);
    • static void fill(List list, Object o);使用指定的对象填充指定列表的所有元素
      • 举例  Collections.fill (list, "java");
    • static void reverse(List list);将指定列表元素进行反转
    • static void shuffle (List list); 将指定列表元素随机置换;
    • static void sort(List list); 按照列表中元素的自然顺序进行排序
    • static void swap(List list, intdex j, index i);将指定列表中的两个索引上的元素进行互换



Map集合

      概述(public interface Map<K,V>)
  • Map集合中的K(键)是唯一的,如果添加时K重复则会修改K对应的值
常用方法一
  • V put(K key, V value)
  • V get(Object key)  通过键获取值,如果没有键则返回null
  • int size()
  • boolean containsKey(Object key)
  • boolean containsValue(Object value)
  • boolean isEmpty()
  • void clear()
  • V remove(Object key)   通过键删除值,如果没有键则返回null
常用方法二
  • Set<K>   keySet();  返回此映射中包含键的Set视图

  • Collection<V>   values();  返回此映射用包含值的Collection视图
  • Set<Map.Entry<K, V>  entrySet(); 返回此映射中包含的映射关系的Set视图
Map集合的两种遍历方式:
  • 通过Keyset()方法获取所有的键,然后通过键获取对应的值


Set<String> key = map.keySet();
                for (String string : key) {
                        String value = map.get(string);
                        System.out.println(string + "=" + value);
                }


  • 通过Set<Map.Entry<K, V>>  entrySet();方式遍历


Set<Entry<String, String>> entrySet = map.entrySet();
                for (Entry<String, String> entry : entrySet) {
                        //System.out.println(entry);
                        String key = entry.getKey();
                        String value = entry.getValue();
                        System.out.println(key+ "=" + value);
                }
        
Map嵌套Map
Map< K , Map<K, V>>
先遍历第一个Map,拿到所以的K,然后用K得到所有的Map集合并遍历
//通過keySet()方法遍歷
                Set<String> keySet = itheima.keySet();
                for (String key : keySet) {
                        System.out.println(key);
                        Map<String, String> map = itheima.get(key);
                        Set<String> keySet2 = map.keySet();
                        for (String string : keySet2) {
                                System.out.println(string+"="+map.get(string));
                        }
                        
                        
                }
//通过 entrySet方法遍历
Set<Entry<String, Map<String, String>>> entrySet = itheima.entrySet();
                for (Entry<String, Map<String, String>> entry : entrySet) {
                        System.out.println(entry.getKey());
                        Map<String, String> value = entry.getValue();
                        
                        Set<Entry<String, String>> entrySet2 = value.entrySet();
                        for (Entry<String, String> entry2 : entrySet2) {
                                System.out.println(entry2.getKey()+"="+entry2.getValue());
                        }
                }




Map嵌套Collection
Map<K, Collection<E>>
先遍历第一个Map,拿到所以的K,然后用K得到所有Collection集合并遍历


//用Set<K> keySet()方法遍历
                Set<String> classNames = itheima.keySet();
                for (String className : classNames) {
                        System.out.println(className);
                        Set<Student> students = itheima.get(className);
                        for (Student student : students) {
                                System.out.println(student.getId()+"="+student.getName());
                        }
                        
                        
                }
               
//用Set<Map.Entry<K, V>>  entrySet()方法遍历
Set<Entry<String, Set<Student>>> classNames = itheima.entrySet();
for (Entry<String, Set<Student>> className : classNames) {
System.out.println(className.getKey());
Set<Student> students = className.getValue();
for (Student student : students) {
                                                              System.out.println(student.getId()+"="+student.getName());
                                
                        }
                        
                }


可变参数(数据类型明确,长度不明确时用)
  • 其本质是一个长度可变的数组(其实是根据传入的参数数量定义数组的长度)
  • 作为形参时格式:    数据类型...变量名
  • 作为实参时:   一个一个传入,逗号分隔
  • 注意
    • 可变参数后不能再追加添加变量
    • 可变参数前可以追加参数
    • 调用方法时,参数的数量可以给多个,也可以一个也不给






0 个回复

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