Java-JavaSE-集合Collection

  • 概述
    • 理解集合的关键:要清楚各实现类的内部数据结构!
    • 集合是用来存储对象的容器
    • 长度是可变的
    • 不可以存储基本数据类型值
    • 方法
      • boolean add(E e)\addAll(Collection<? extends E> c)
      • void clear();
        • 清空集合
      • remove(Object obj)\removeAll(Collection c)
        • 方法会改变集合的长度
        • 若存在多个相同的obj,那么只移除1个
      • boolean contains(E e)
      • Iterator<E> iterator()!!!!!!!!!
      • boolean retainAll(Collection c)
        • 取交集
      • Object[] toArray()
        • 将集合转成数组
      • int size()
        • 返回此集合的元素数
      • boolean contains(Object o)
        • 与HashSet不同,这里判断元素是否相同,仅依据对象的equals()方法
  • Interface Iterator<E>
    • 不同集合的共性的取出元素的特性的抽象
    • 迭代的过程中,是不允许对集合进行操作的!不然会抛concurrentModificationException
      • 为了能够在迭代过程中对集合做添加动作,所以出现了listIterator(),注意:是使用迭代器去操作
    • 方法
      • boolean hasNext()
      • E next()---返回迭代器中的下一个元素
    • 用法
      • for( Iterator it=c.iterator(); it.hasNext(); ){it.next()....}
    • sub Interface
      • ListIterator
        • 可以在迭代的过程中对List元素进行修改
        • 方法
          • boolean hasNext()
            • 正向
          • boolean hasPrevious()
            • 逆向
          • E next()\ E previous()
          • void add(E e)
          • void remove(E e)
          • void set(E e)
  • List
    • 有序(存入取出的顺序一致),元素都有角标,允许重复
    • 特有方法(多与角标的操作有关)
      • void add(index, element)
      • void addAll(index, collection)
      • E remove(index)
      • E set(index, element)
      • E get(index)
      • int indexOf(E e)
      • int lastIndexOf(E e)
      • List subList(start, end)
        • 包含头,不包含尾
      • listIterator()!!!!!!!!
    • 子类
      • Vector
        • 内部是可增长数组数据结构
        • 同步的
        • since 1.0
        • 方法
          • Enumeration elements()-与iterator()功能重复
      • ArrayList
        • 可变的数组数据结构
        • 不同步
        • 查询的速度快
          • 数组在内存空间是连续的,所以查询快
      • LinkedList
        • 链接列表,链表
        • 不同步
        • 增删元素的速度很快
          • 内存空间不连续
        • 方法:
          • addFirst()
          • offerFirst()
          • addLast()
          • offerLast()
          • getFirst()
            • 若链表是空,则抛异常
          • removeFirst()
            • 移除第一个,会return这个元素
          • peekFirst()
            • 获取但不移除,若链表是空,则返回null
          • pollFirst()
            • 返回第一个并移除,若为空,返回null
  • 堆栈和队列数据结构
    • 堆栈
      • 先进后出
    • 队列
      • 先进先出
  • Set
    • 元素不可重复,无序
    • 方法与Collection方法一致
    • 子类
      • HashSet
        • 内部还是一个数组
        • 由哈希表(实际是HashMap的一个实例)支持
        • 不保证迭代顺序,且不保证内部顺序是恒定的
        • 不同步
        • 往里面存元素的时候,就按照一定的规则选择存储位置
          • 这个规则按照哈希算法给定
          • 往里存的时候,先判断元素的哈希值,确定元素应该存储的位置
          • 若位置上已有元素,那么equals()判断两个元素是否相同
          • 不同,就存,怎么存,顺延?接一个挂链?
          • 所以,你要存自定义对象的话,那么要自定义hashCode()和equals()方法,让它按照你的规则去判断俩对象是否相同
        • 子类
          • LinkedHashSet
            • 可预知迭代顺序的Set,由hash表和链表共同支持
            • 有序,无重复
      • TreeSet
        • 使用元素的自然顺序对元素进行排序,或根据创建Set时提供的Comparator进行排序,具体取决于所使用的构造方法
        • 往里存自定义对象的时候(超过1个),对象要实现Comparable接口,覆盖compareTo()方法
          • 这个方法里定义的排序规则,叫自然排序
          • 若对象无自然排序,或者我不想用对象已定义好的自然排序,那么,就通过TreeSet的带参构造函数,传入一个排序规则Comparatorcomparator
            • 若自然排序和比较器comparator同时存在,会依据比较器comparator
            • 自定义比较器需要实现Comparator接口,并实现compare()方法
          • compareTo()方法的返回值是负整数、0、正整数
        • TreeSet判断元素是否相同的依据就是compareTo()方法的返回值,0就是相同,就无法存入TreeSet(Set是元素唯一的)
        • 内部数据结构是二叉树
  • interface Comparator
    • methods
      • int compare(T o1, T o2)
      • boolean equals(Object obj)
    • 定义一个自定义比较器类,实现Comparator,将此类的一个对象作为TreeSet的构造函数的参数
  • 泛型
    • ArrayList<String> s =new ArrayList<String>();
    • Iterator<String> i=s.iterator();
    • since JDK1.5
    • 应用于编译时期,避免强转的麻烦
    • 编译后,生成的class文件时不带泛型的(泛型的擦除),因为老的类加载器不识别的
    • 泛型应用于引用数据类型
    • 定义一个泛型类
      • class Demo<T>{}
        • 这个类中的某些方法的参数会是T
      • public <S> void show(S s1){}这个方法的参数是泛型,且与类中的T不一致
        • 当方法是静态时,不能使用类上声明的泛型,只能按上边这个方法去定义泛型
          • public static <S> void method(S s1){}
        • 也可以将泛型作为方法的返回值类型
          • public <T> T get( T t ){}
    • 注意:
      • Collection<Person> c=new ArrayList<Student>(); //Student是Person的子类
        • 这种情况是不被允许的。
    • 泛型的通配符 ?
    • 泛型的限定的两种场景:
      • ? Extends E
        • 允许E类型或者E的子类型
      • ? super E
        • 允许E类型或者E的父类型
  • Map<K,V>
    • 存储的是键值对
    • 必须保证键的唯一性,且每个键最多对应一个值
    • 方法:
      • V put(K k, V v)
        • 相当于添加元素
        • 会返回这之前与k关联的v值,若之前没有对应的v,则返回null
      • V remove(Object k)
        • 删除这个键值对
      • V get(Object k)
        • 若没有这个k,则返回null
      • boolean containsKey(Object k)
      • boolean containsValue(Object v)
      • int size()
        • 获取键值对的个数
      • Set<K> keySet()
        • 返回键的Set集合
      • Set<Map.Entry<K,V>> entrySet()
        • Map.Entry<K,V>保存着K和V的映射关系
        • 利用Set的iterator()方法获得Map.Entry对象
        • 单个Map.Entry对象保存着单对键值对,利用其getKey()\getValue()获取键值
      • Colleciton<V>values()
        • 值并不是唯一的,所以返回值类型是Collection
    • 子类
      • Hashtable
        • 角色类似于Vector
        • 内部结构是哈希表
        • 同步的
        • 不允许null的键或值
        • 子类
          • Properties
            • 存储配置文件信息,多和 IO技术相结合
            • System.getProperties()
            • Set<String> stringPropertyNames()
            • list(PrintStream out)
            • store(流,注释 )
              • 把东西从流中存储到硬盘
            • load(流)
              • 把东西从硬盘读到流中
      • HashMap
        • 内部结构是哈希表
        • 不同步
        • 允许null的键或值
        • 存内容时要注意覆写键的hashCode()\和equals()方法
      • TreeMap
        • 内部结构是二叉树
        • 不同步
        • 可以对键进行排序
        • 存内容时要注意键的比较规则的定义
posted @ 2018-08-09 20:57  wonewo  阅读(149)  评论(0编辑  收藏  举报