java中的集合类_Collection_Map_List_Set

数组的长度是固定的,用来存放基本数据类型

集合的长度是可变的,用来存放对象的引用

本文内容包括:

接口:Collection、List、Set、SortedSet、Map、Map.Entry<K,V>、SortedMap

类:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap

迭代器及相关接口(Iterable、Iterator)、比较器及相关接口(comparable、comparator)

先看继承关系:

在这里插入图片描述
在这里插入图片描述

图片来源在《深入浅出java程序设计》 朱颢东 张志峰等编著

上两张图中,虚线框表示接口,实线框表示类,抽象类用斜体表示,虚线表示实现接口,实线表示继承关系。

上两张图中将继承实现表示的很详细,下面的图更简单明了一点。

在这里插入图片描述

图片来源《java从入门到精通》明日学院 编著

还有就是这

public interface Collection<E> extends Iterable<E>

Collection接口继承了Iterable接口

接口Collection是集合层次结构的顶层接口,定义了集合、链表等所有属于集合的类都应该具有的通用方法,如添加、删除、遍历等,这些方法和功能都需要在其实现类中加以实现。接口Set只是简单地继承了Collection接口,其中并没有声明任何新的成员方法。SortedSet接口继承了Set接口,并增加了一些与排序有关的成员方法。接口List在继承 Collection接口的基础上,还增加了几个与顺序有关的成员方法。抽象类AbstractCollection、AbstractList、AbstractSet和AbstractSequentialList分别实现了部分接口或抽象类中的成员方法,以减轻子类需要实现接口或抽象类中所有成员方法的负担。

再来看看个接口、类的方法(若接口中的方法已在其父接口中出现过,子接口就不重复列出了)

============================================================================================

迭代器相关内容

1.Iterable接口

    • Modifier and TypeMethod and Description
      default voidforEach(Consumer<? super T> action) 对 Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。
      Iteratoriterator() 返回类型为 T元素的迭代器。
      default Spliteratorspliterator() 在Iterable描述的元素上创建一个Iterable 。
  • 实现了iterable接口的类可以支持for each循环,foreach是基于Iterator实现的

  • 关于Iterable和Iterator可以去这看看 Java中的Iterable与Iterator详解

2.iterator接口

    • Modifier and TypeMethod and Description
      default voidforEachRemaining(Consumer<? super E> action) 对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。
      booleanhasNext() 如果迭代具有更多元素,则返回 true 。
      Enext() 返回迭代中的下一个元素。
      default voidremove() 从底层集合中删除此迭代器返回的最后一个元素(可选操作)。

下面使用了三种方法遍历集合(对Iterable和iterator的运用):

public class demo1 {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new A();
        A a3 = new A();
        List<A> l = new ArrayList<>();
        l.add(a1);
        l.add(a2);
        l.add(a3);

        // 1 foreach循环
        for (A a : l) {
            a.myPrint();
        }

        // 2  迭代器
        Iterator<A> it = l.iterator();   // 如果在这不加泛型<A>, 那么在使用it.next()前要强制类型转换一下,it.next()返回的默认为Object类型
        while(it.hasNext()){
            it.next().myPrint();
        }

        // 3 forEach()方法
        Consumer<A> action = new MyConsumer();
        l.forEach(action);

    }
}


class A {
    private int a;

    public void myPrint() {
        System.out.println("hello");
    }
}

class MyConsumer implements Consumer<A>{
    @Override
    public void accept(A a) {
        a.myPrint();
    }
}

============================================================================================

3.Collection接口

    • Modifier and TypeMethod and Description
      booleanadd(E e) 确保此集合包含指定的元素(可选操作)。
      booleanaddAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合(可选操作)。
      voidclear() 从此集合中删除所有元素(可选操作)。
      booleancontains(Object o) 如果此集合包含指定的元素,则返回 true 。
      booleancontainsAll(Collection<?> c) 如果此集合包含指定 集合中的所有元素,则返回true。
      booleanequals(Object o) 将指定的对象与此集合进行比较以获得相等性。
      inthashCode() 返回此集合的哈希码值。
      booleanisEmpty() 如果此集合不包含元素,则返回 true 。
      default StreamparallelStream() 返回可能并行的 Stream与此集合作为其来源。
      booleanremove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
      booleanremoveAll(Collection<?> c) 删除指定集合中包含的所有此集合的元素(可选操作)。
      default booleanremoveIf(Predicate<? super E> filter) 删除满足给定谓词的此集合的所有元素。
      booleanretainAll(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
      intsize() 返回此集合中的元素数。
      default Spliteratorspliterator() 创建一个Spliterator在这个集合中的元素。
      default Streamstream() 返回以此集合作为源的顺序 Stream 。
      Object[]toArray() 返回一个包含此集合中所有元素的数组。
      T[]toArray(T[] a) 返回包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。

4.List接口

  • 有序集合(也称为序列)。用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。索引从0开始

  • 允许重复的元素,允许元素e1和e2使得e1.equals(e2) ,并且如果它们允许空元素,它们通常允许多个空元素。

    • Modifier and TypeMethod and Description
      voidadd(int index, E element) 将指定的元素插入此列表中的指定位置(可选操作)。
      booleanaddAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到此列表中的指定位置(可选操作)。
      Eget(int index) 返回此列表中指定位置的元素。
      intindexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
      intlastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
      ListIteratorlistIterator() 返回列表中的列表迭代器(按适当的顺序)。
      ListIteratorlistIterator(int index) 从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。
      Eremove(int index) 删除该列表中指定位置的元素(可选操作)。
      default voidreplaceAll(UnaryOperator operator) 将该列表的每个元素替换为将该运算符应用于该元素的结果。
      Eset(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素。
      default voidsort(Comparator<? super E> c) 使用随附的 Comparator排序此列表。
      ListsubList(int fromIndex, int toIndex) 返回此列表中指定的 fromIndex (含)和 toIndex之间的部分。

5.ArrayList类

  • ArrayList类的优点是实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的索引位置插入对象或删除对象的速度较慢,因为ArrayList实质上是使用数组来保存集合中的元素的,在增加和删除指定位置的元素时,虚拟机会创建新的数组,效率低,所以在对元素做大量的增删操作时不适合使用ArrayList集合。

    • Constructor and Description
      ArrayList() 构造一个初始容量为10的空列表。
      ArrayList(Collection<? extends E> c) 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。
      ArrayList(int initialCapacity) 构造具有指定初始容量的空列表。
    • Modifier and TypeMethod and Description
      Objectclone() 返回此 ArrayList实例的浅拷贝。
      voidensureCapacity(int minCapacity) 如果需要,增加此 ArrayList实例的容量,以确保它可以至少保存最小容量参数指定的元素数。
      voidtrimToSize() 修改这个 ArrayList实例的容量是列表的当前大小。
  • 在大量插入元素前,可以使用ensureCapacity()方法主动增加ArrayList对象的容量,减少容量递增式再分配的数量,从而提高插入效率。

  • 删除元素时容量不会自动减小,可以使用trimToSize()方法。

6.LinkedList类

  • LinkedList类采用链表结构保存对象,这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入、删除对象时,使用LinkedList类实现的List集合的效率较高;但对于随机访问集合中的对象,使用LinkedList类实现List集合的效率较低。

  • LinkedList是个双向链表

    • Constructor and Description
      LinkedList() 构造一个空列表。
      LinkedList(Collection<? extends E> c) 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。

技巧:实例化List接口对象时,建议优先使用ArrayList,只有在插入和删除操作特别频繁时,才使用LinkedList。

7.Set接口

  • Set 就是数学领域的集合

  • 不包含重复元素的集合。 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2)

  • HashSet集合允许保存null,TreeSet集合不能保存null

  • Set接口只是简单的继承了Collection接口,没有声明新的成员方法。

8.HashSet类

  • 散列集。哈希表。散列表

  • 此类实现Set接口,由哈希表(实际为HashMap实例)支持。 对集合的迭代次序不作任何保证。 这个类允许null元素。

  • HashSet是Set 接口的一个实现类,它不允许有重复元素。HashSet主要依据哈希算法直接将元素指定到一个地址上。当向HashSet集合中添加一个元素时,会调用equals方法来判断该位置是否有重复元素。判断是通过比较它们的HashCode来进行比较的。HashSet集合的常用方法都是重写了Set接口中的方法。

  • 元素的排序很能和插入顺序不同

  • 有子类LinkedHashSet

    • Constructor and Description
      HashSet() 构造一个新的空集合; 背景HashMap实例具有默认初始容量(16)和负载因子(0.75)。
      HashSet(Collection<? extends E> c) 构造一个包含指定集合中的元素的新集合。
      HashSet(int initialCapacity) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。
      HashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子。

9.SortedSet接口

  • TreeSet树集实现了SortedSet接口,先看一下SortedSet接口

  • 提供排序操作,数据会根据元素值从小到大排列

  • 插入到排序集中的所有元素必须实现Comparable接口(或被指定的比较器接受)。 所有这些元素都必须是可相互比较 :e1.compareTo(e2)(或comparator.compare(e1, e2))

    • Modifier and TypeMethod and Description
      Comparator<? super E>comparator() 返回用于对该集合中的元素进行排序的比较器,或null
      Efirst() 返回此集合中当前的第一个(最低)元素。
      Elast() 返回此集合中当前的最后(最高)元素。
      SortedSetheadSet(E toElement) 返回该集合的部分的视图,其元素严格小于 toElement 。
      SortedSettailSet(E fromElement) 返回此组件的元素大于或等于 fromElement的部分的视图。
      SortedSetsubSet(E fromElement, E toElement) 返回该集合的部分的视图,其元素的范围为 fromElement (含),为 toElement ,独占。

============================================================================================

比较器相关内容

10.comparable接口

    • Modifier and TypeMethod and Description
      intcompareTo(T o) 将此对象与指定的对象进行比较以进行排序。

11.comparator接口

接口中两个的方法

    • Modifier and TypeMethod and Description
      intcompare(T o1, T o2) 比较其两个参数的顺序。
      booleanequals(Object obj) 指示某个其他对象是否等于此比较器。

equals方法:如果obj也是一个比较器,并且与此比较器有相同的排序,则返回true,否则返回false。

如果希望用树集或树图管理某类的对象,就要使该类实现Comparable接口或者重写一个比较器类实现Comparator接口并将比较器类的对象传给集合构造方法

  • 不能比较的对象加入TreeSet或TreeMap中会报错 cannot be cast to java.lang.Comparable

  • 两种解决方法(下面两个例子中的比较规则是,根据student的sno比较,具体方法是调用String类中的compareTo方法比较)

  • 在重写对象的比较方法的同时有必要重写equals方法,使两种方法逻辑同步

// 法一: 实现Comparable接口,重写compareTo方法
package pc;

import java.util.TreeSet;

public class Student implements Comparable<Student>{
    private String sno;
    private String name;

    public Student(String sno, String name) {
        this.sno = sno;
        this.name = name;
    }

    // 重写compareTo方法
    @Override
    public int compareTo(Student o) {
        return this.sno.compareTo(o.sno);
    }
    
    public static void main(String[] args) {
        Student s1 = new Student("201", "jack");
        Student s2 = new Student("202", "peter");

        TreeSet<Student> l = new TreeSet<>();
        l.add(s1);
        l.add(s2);
    }
}
// 法二: 重写比较类实现Comparator接口,并重写compare方法
package pc;

import java.util.Comparator;
import java.util.TreeSet;

public class Student2 {
    private String sno;
    private String name;

    public Student2(String sno, String name) {
        this.sno = sno;
        this.name = name;
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Student2 s1 = new Student2("201", "jack");
        Student2 s2 = new Student2("202", "peter");

        MyComparator myComparator = new MyComparator();
        TreeSet<Student2> l = new TreeSet<>(myComparator);
        l.add(s1);
        l.add(s2);
    }
}

// 重写比较类实现Comparator接口,并重写compare方法
class MyComparator implements Comparator<Student2>{

    @Override
    public int compare(Student2 o1, Student2 o2) {
        return o1.getSno().compareTo(o2.getSno());  
    }
}

============================================================================================

12.TreeSet类

  • TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以制定排序规则,让集合按照我们想要的方式进行排序。

  • 此集合不能保存null。

    • Constructor and Description
      TreeSet() 构造一个新的,空的树组,根据其元素的自然排序进行排序。
      TreeSet(Collection<? extends E> c) 构造一个包含指定集合中的元素的新树集,根据其元素的 自然排序进行排序
      TreeSet(Comparator<? super E> comparator) 构造一个新的,空的树集,根据指定的比较器进行排序。
      TreeSet(SortedSet s) 构造一个包含相同元素的新树,并使用与指定排序集相同的顺序。

13.Map接口

  • Map没有继承Collection接口,也没有继承Iterable接口

  • 存储元素是键值对, Interface Map<K,V> ,K可以比作数组的下标,V 比作值。

  • 不能存在重复的key

    • Modifier and TypeMethod and Description
      voidclear() 从该地图中删除所有的映射(可选操作)。
      default Vcompute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 尝试计算指定键的映射及其当前映射的值(如果没有当前映射, null )。
      default VcomputeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 如果指定的键尚未与值相关联(或映射到 null ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非 null 。
      default VcomputeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。
      booleancontainsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
      booleancontainsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true 。
      Set<Map.Entry<K,V>>entrySet() 返回此地图中包含的映射的Set视图。
      booleanequals(Object o) 将指定的对象与此映射进行比较以获得相等性。
      default voidforEach(BiConsumer<? super K,? super V> action) 对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。
      Vget(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。
      default VgetOrDefault(Object key, V defaultValue) 返回到指定键所映射的值,或 defaultValue如果此映射包含该键的映射。
      inthashCode() 返回此地图的哈希码值。
      booleanisEmpty() 如果此地图不包含键值映射,则返回 true 。
      SetkeySet() 返回此地图中包含的键的Set视图。
      default Vmerge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。
      Vput(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。
      voidputAll(Map<? extends K,? extends V> m) 将指定地图的所有映射复制到此映射(可选操作)。
      default VputIfAbsent(K key, V value) 如果指定的键尚未与某个值相关联(或映射到 null )将其与给定值相关联并返回 null ,否则返回当前值。
      Vremove(Object key) 如果存在(从可选的操作),从该地图中删除一个键的映射。
      default booleanremove(Object key, Object value) 仅当指定的密钥当前映射到指定的值时删除该条目。
      default Vreplace(K key, V value) 只有当目标映射到某个值时,才能替换指定键的条目。
      default booleanreplace(K key, V oldValue, V newValue) 仅当当前映射到指定的值时,才能替换指定键的条目。
      default voidreplaceAll(BiFunction<? super K,? super V,? extends V> function) 将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。
      intsize() 返回此地图中键值映射的数量。
      Collectionvalues() 返回此地图中包含的值的Collection视图。

14.Map.Entry<K,V>接口

  • Map.Entry<K,V>是entrySet()方法返回的类型

    • Modifier and TypeMethod and Description
      static <K extends Comparable<? super K>,V>Comparator<Map.Entry<K,V>>comparingByKey() 返回一个比较器,按键自然顺序比较Map.Entry 。
      static <K,V> Comparator<Map.Entry<K,V>>comparingByKey(Comparator<? super K> cmp) 返回一个比较器,比较Map.Entry按键使用给定的Comparator 。
      static <K,V extends Comparable<? super V>>Comparator<Map.Entry<K,V>>comparingByValue() 返回一个比较器,比较Map.Entry的自然顺序值。
      static <K,V> Comparator<Map.Entry<K,V>>comparingByValue(Comparator<? super V> cmp) 返回一个比较器 ,使用给定的Comparator比较Map.Entry的值。
      booleanequals(Object o) 将指定的对象与此条目进行比较以获得相等性。
      KgetKey() 返回与此条目相对应的键。
      VgetValue() 返回与此条目相对应的值。
      inthashCode() 返回此映射条目的哈希码值。
      VsetValue(V value) 用指定的值替换与该条目相对应的值(可选操作)。
  • //  对Map进行遍历
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    	System.out.println("Key = " + entry.getKey() + "  Value = " + entry.getValue());
    }
    

15.HashMap类

  • 散列图。实际上是一个数组和链表的组合体。

  • 允许存在空值和空键

  • 还有个子类LInkedHashMap

    • Constructor and Description
      HashMap() 构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。
      HashMap(int initialCapacity) 构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。
      HashMap(int initialCapacity, float loadFactor) 构造一个空的 HashMap具有指定的初始容量和负载因子。
      HashMap(Map<? extends K,? extends V> m) 构造一个新的 HashMap与指定的相同的映射 Map 。

16.SortedMap<K,V>接口

  • 和SortedSet类似

    • Modifier and TypeMethod and Description
      Comparator<? super K>comparator() 返回此map中的键的比较器,或null
      Set<Map.Entry<K,V>>entrySet() 返回此map中包含的映射的Set视图。
      KfirstKey() 返回此map中当前的第一个(最低)键。
      SortedMap<K,V>headMap(K toKey) 返回该map的部分密钥严格小于 toKey 。
      SetkeySet() 返回此map中包含的键的Set视图。
      KlastKey() 返回当前在此map中的最后(最高)键。
      SortedMap<K,V>subMap(K fromKey, K toKey) 返回此map部分的视图,其关键字范围为 fromKey (含),不 toKey toKey。
      SortedMap<K,V>tailMap(K fromKey) 返回此map部分的视图,其键大于或等于 fromKey 。
      Collectionvalues() 返回此map中包含的值的Collection视图。

17.TreeMap类

  • 实现了SortedMap接口,能够按照键的自然顺序进行排序,也可以自定义

  • 不允许有空键

  • 添加的TreeMap中的元素的key必须是可排序的

    • Constructor and Description
      TreeMap() 使用其键的自然排序构造一个新的空树状图。
      TreeMap(Comparator<? super K> comparator) 构造一个新的,空的树图,按照给定的比较器排序。
      TreeMap(Map<? extends K,? extends V> m) 构造一个新的树状图,其中包含与给定map相同的映射,根据其键的 自然顺序进行排序
      TreeMap(SortedMap<K,? extends V> m) 构造一个包含相同映射并使用与指定排序映射相同顺序的新树映射。

本文参考源码、jdk api文档、《深入浅出java程序设计》朱颢东 张志峰等编著、《java从入门到精通》明日学院 编著、《java程序设计与计算思维》 赵军 吴灿铭编著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

臭屁虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值