Java_常用API_0_集合

集合

java.util 包下的API。

Collection<E>

综述

  • Collection<E> 集合体系结构:

    继承
    继承
    实现
    实现
    实现
    继承
    间接实现
    «接口»
    Collection<E>
    add(E e)
    remove(Object o)
    size()
    contains(Object o)
    isEmpty()
    clear()
    iterator()
    «接口»
    List<E>
    add(int i, E e)
    remove(int i)
    set(int i, E e)
    get(int i)
    listIterator()
    «接口»
    Set<E>
    «类»
    ArrayList<E>
    «类»
    LinkedList<E>
    addFirst(E e)
    addLast(E e)
    getFirst()
    getLast()
    removeFirst()
    removeLast()
    «类»
    HashSet<E>
    «类»
    LinkedHashSet<E>
    «类»
    TreeSet<E>
  • Collection<E> 集合概述:

    • 它是单例集合的顶层接口,它表示一组对象,这些对象也称为 Collection<E> 的元素;

    • JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如 Set<E>List<E> )的实现,它的对象的创建也要通过多态的方式。

  • 常用方法:

    方法名说明
    boolean add(E e)添加元素
    boolean remove(Object o)从集合中移除指定的元素
    int size()集合的长度,也就是集合中元素的个数
    boolean contains(Object o)判断集合中是否存在指定的元素
    boolean isEmpty()判断集合是否为空
    void clear()清空集合中的元素
    Iterator<E> iterator创建一个此集合的迭代器对象并返回
  • Collection<E> 集合的通用遍历方式:

    • 显式地使用迭代器:

      调用 iterator() 方法(为其实现类所重写的),返回一个迭代器对象( Iterator<E> ),用它的 hasNext() 方法作为判别条件、 next() 方法得到下一个元素,用循环结构完成遍历。

      注意:当一个迭代器对象被创建之后,要保证其正常使用,类似像add()remove() 等会修改此集合长度的方法不能被调用,因为每次用此迭代对象调用 next() 方法时都会作一次判断,若是检测到集合长度被修改过,则抛出并发修改异常 ConcurrentModificationException

    • 使用增强 for 循环:

      • 在 Java 中,所有实现 Iterable<E> 接口的类的对象,都可使用增强 for 循环语法来遍历,因此它可以简化数组和 Collection<E> 集合的遍历。
      • 增强 for 循环实质上就是隐式地使用了迭代器 Iterable<E>
      for (元素类型 变量名 : 被遍历对象) {
        // 使用上面的变量名 
      }
      
  • 补充——常见数据结构

    • **栈:**是一种数据先进后出的模型。

      • 数据进入栈模型的过程称为压/进栈;

      • 数据离开栈模型的过程称为:弹/出栈;

    • **队列:**是一种数据先进先出的模型。

      • 数据从后端进入队列模型的过程称为:入队列;

      • 数据从前端离开队列模型的过程称为:出队列;

    • **数组:**是一种查询快,增删慢的模型。

      • 查询数据通过索引定位,查询任意数据耗时相同,查询效率高;

      • 删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低;

      • 添加数据时,添加位置后的每个数据后移,再添加元素,添加效率低;

    • **链表:**是一种增删快、查询满的模型。

      • 查询数据是否存在必须从头节点开始;

      • 删除数据时,将节点中存储的下一节点的地址改为下下个节点的地址,再删除下一节点数据即可;

      • 添加数据时,将后一个节点的地址信息存到要添加的节点中,再将要添加的节点的地址存到前一个节点中即可;

    • **哈希表:**可以说是一种元素为链表的数组。

List<E>

  • List<E> 集合特点:

    • 它被称为有序集合,也称为序列;

    • 元素由索引组织,可由索引快速访问元素,用户可以精确控制列表中每个元素的插入位置;

    • 元素允许重复。

  • List<E> 接口中常用方法:

    方法名说明
    void add(int index,E element)在此集合中的指定位置插入指定的元素
    E remove(int index)删除指定索引处的元素,返回被删除的元素
    E set(int index,E element)修改指定索引处的元素,返回被修改的元素
    E get(int index)返回指定索引处的元素
  • List<E> 接口实现类之 ArrayList<E>

    • 底层基于数组模型实现;

    • 常用方法:

      方法名说明
      public boolean add(E e)将指定元素追加到此集合的末尾,返回追加是否成功
      public void add(int index, E e)将指定元素插入到此集合中的指定索引位置
      public boolean remove(Object o)删除指定的元素,返回删除是否成功
      public E remove(int index)删除指定索引处的元素,返回被删除的元素
      public E set(int index,E element)修改指定索引处的元素,返回被修改的元素
      public E get(int index)返回指定索引处的元素
      public int size()返回集合中的元素的个数
  • List<E> 接口实现类之 LinkedList<E>

    • 底层基于链表模型实现;

    • 除了同样有 ArrayList<E> 那些方法外,还有如下几个与链表模型特点有关的方法:

      方法名说明
      public void addFirst(E e)在该列表开头插入指定的元素
      public void addLast(E e)将指定的元素追加到此列表的末尾
      public E getFirst()返回此列表中的第一个元素
      public E getLast()返回此列表中的最后一个元素
      public E removeFirst()从此列表中删除并返回第一个元素
      public E removeLast()从此列表中删除并返回最后一个元素
  • List<E> 集合的3种遍历方式:

    1. 使用Collection<E> 接口中规定的迭代器,即,用 iterator() 方法返回一个 Iterator<E> 对象,用它来遍历。

      用增强 for 循环,则和此本质一样。

    2. 使用 List<E> 接口自己规定的专用迭代器,即,用 listIterator() 方法返回一个 ListIterator<E> 对象,用它来遍历。

      其中,ListIterator<E> 除了 hasNext()next() 方法外,还有倒序迭代的 hasPrevious()previous() 方法,另外还有在遍历过程中添加和删除元素且不会抛出并发修改异常的方法,但用的都很少。

    3. 使用普通 for 循环配合 List 自己特有的 get()/set() 等方法,完成遍历。

      这种方法是最实用的,可以自己控制在遍历的过程中增删改元素都行。

Set<E>

  • Set<E> 集合特点:

    • 不允许重复元素。

    • 常用方法就是 Collection<E> 中规定的方法。

  • Set<E> 接口实现类之 HashSet<E>

    • 底层基于哈希表模型实现,无法保证迭代时取出顺序和存入时一致。

    • add() 方法保证元素唯一性的源码流程:

      有相同的
      返回true
      没有
      都不相同
      返回false
      调用对象的hashCode方法
      根据对象的hash值
      计算对象的存储位置
      该位置是否有元素存在
      遍历该位置的所有元素, 和新存入
      的元素比较hash值是否相同
      调用equals方法,
      比较对象内容是否相同
      说明元素重复, 不存储
      将元素存储到该位置

      由此可见,若需自己定义什么是重复什么不是重复,就自己重写元素继承自 ObjecthashCode()equals() 方法。

  • Set<E> 接口实现类之 LinkedHashSet<E>

    • 底层基于哈希表模型结合链表实现,能保证迭代时取出顺序和存入时一致。
    • 由链表保证元素有序,由哈希表保证元素唯一。
  • Set<E> 接口实现类之 TreeSet<E>

    • 它是能按一定规则排序存储的 Set<E> 集合。

    • 常用两种构造方法:

      • 无参构造方法:public TreeSet<E>()

        • 要求存入的元素的类型 E 必须是实现 Comparable<E> 接口的,此接口规定了 int compareTo() 方法,TreeSet<E> 集合会据此方法进行排序存储;(也被称为”自然排序“)

        • 每次 TreeSet<E> 集合执行 add(E e) 方法时:(大致推测)

          会用这个新 add 的元素 e 调用 compareTo() 方法,对已在集合中的元素,按从前到后的次序,逐次作为参数传入 compareTo() 方法,与新添加的元素 e 进行比较:

          • 若方法返回 0,则不添加;
          • 若方法返回正数,则把新 add 的元素 e 放在本次对比的老元素后面;
          • 若方法返回负数,则把新 add 的元素 e 放在本次对比的老元素前面;

          由此便可最终确定出本次新 add 的元素 e 在集合中的存储位置。

          习惯性的一种用法:在 compareTo() 方法用新 add 的元素的属性减去老元素的,这样最终的排序效果是升序排列。

      • 含参构造方法:public TreeSet<E>(Comparator comparator)

        • 这种方式使用时,不要求存入的元素的类型 E 实现 Comparable<E> 接口,而是将排序的依据作为一个比较器 Comparator<E> 对象,在 TreeSet<E> 集合构造之时传入保存,与此集合关联。
        • 传入比较器的方式就是传入比较器接口实现类对象(用匿名内部类),其比较 int compare(E e1, E e2) 方法,第一个参数会被传入新 add 的对象,第二个参数会被传入老对象,剩下的和前面的一种一样。

Map<K,V>

  • Map<K,V> 集合概述:

    • 它是双列集合的顶层接口,它表示一组对象对(键值对),JDK 提供了它的实现类,它的对象的创建要通过多态的方式;
    • 特点:键值对的键不允许重复,这里判别重复与否的依据和 Set<E> 集合那里一样。
    • 关系如下:
    实现
    «接口»
    Map<K,V>
    put(K key, V value)
    get(Object key)
    remove(Object key)
    clear()
    containsKey(Object key)
    containsValue(Object value)
    isEmpty()
    size()
    keySet()
    values()
    entrySet()
    «类»
    HashMap<K,V>
  • Map<K,V> 集合常用方法:

    方法名说明
    public V put(K key,V value)添加元素,若键不存在则添加,存在则覆盖已有的值
    public V get(Object key)根据键获取值,若不存在则返回 null
    public V remove(Object key)根据键删除键值对元素
    public void clear()移除所有的键值对元素
    public boolean containsKey(Object key)判断集合是否包含指定的键
    public boolean containsValue(Object value)判断集合是否包含指定的值
    public boolean isEmpty()判断集合是否为空
    public int size()集合的长度,也就是集合中键值对的个数
    public Set<K> keySet()获取所有键的集合
    public Collection<V> values()获取所有值的集合
    public Set<Map.Entry<K,V>> entrySet()获取所有键值对对象的集合(entry n.条目,记录)
  • Map<K,V> 实现类之一为 HashMap<K,V>

  • Map<K,V> 的遍历方式:

    • 方法1: 先调用 keySet() 方法,再遍历它返回的 Set<K> 对象,将每个元素传入 Mapget() 方法即可。
    • 方法2: 先调用 entrySet() 方法,再遍历它返回的 Set<Map.Entry<K,V>> 对象,对于每个元素调用 Map.EntrygetKey()getValue() 方法即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值