java学习(七) —— API集合类

前言

  1. 在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们实现已经明确知道我们将要保存的对象的数量。
  2. 一旦在数组初始化时指定了数组长度,这个数组长度就是不可变的,如果我们需要保存一个可以动态增长的数据,在编译时无法确定具体的数量,java的集合类就是一个很好的设计方案。
  3. 集合类概述:面对对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供类集合类。
  4. 数组和集合类都是容器,不同之处:

    (1)数组虽然也可以存储对象,但长度是固定的;集合的长度是可变的。
    (2)数组中可以存储基本数据类型,集合只能存储对象。
  5. 集合类特点:集合只用于存储对象,集合长度可变,集合可以存储不同类型的对象。
  6. 集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。
  7. 所有的集合类都位于java.util包下。
  8. 细数java集合,其中比较常见的就是List、Set、Map、和Queue,在这四者中,除了Map,其他三个接口都继承于Collection。

Collection

  1. Collection接口概述:Collection层次结构中的根接口。
  2. Collection表示一组对象,这些对象也称为collection的元素。
  3. 一些collection允许有重复的元素,而另一些不允许;一些collection是有序的,而另一些则是无序的。
  4. 成员方法:

    (1)boolean add(E e)
    (2)boolean remove(Object o)
    (3)void clear()
    (4)boolean contains(Object o)
    (5)boolean isEmpty()
    (6)int size()
    (7)boolean addAll(Collection c)
    (8)boolean removeAll(Collection c)
    (9)boolean containsAll(Collection c)
    (10)boolean retainAll(Collection c)
    (11)把集合转成数组:Object[] toArray()
    (12)迭代器,集合的专用遍历方式:Iterator iterator()

Collection之List接口

  1. 概述:有序的collection,也称为序列。
  2. List接口在java集合类中充当的是一个元素有序、元素可重复的集合角色。
  3. 继承于Collection集合,所以拥有Collection集合的所有方法。
  4. List集合也拥有属于自己的方法:用来实现根据元素索引来操作集合元素的作用。
  5. 此接口的用户可以对列表中的每个元素的插入位置进行精确的控制。
  6. 用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
  7. 成员方法:

    (1)void add(int index,E element)
    (2)E remove(int index)
    (3)E get(int index)
    (4)E set(int index,E element)
    (5)ListIterator listIterator()

常见的继承List接口的实用类

  1. ArrayList:

    (1)基于数组实现的List类,封装了一个动态的、允许再分配的Object[]数组
    (2)ArrayList用initialCapacity参数来设置该数组的长度,当长度超过预设值后,ArrayList会动态增加。
    (3)ArrayList类是线程不安全的,如果要保证该集合的同步性,必须在程序中手动保存。
    (4)底层数据结构是数组,查询快,增删慢
    (5)线程不安全,效率高
    (6)增删慢也是在数据量较大的情况下,在数据量较小的情况下,ArrayList()不一定比LinkedList()方法慢。
    (7)另外,ArrayList在末尾插入和删除数据的话,速度反而比LinkedList要快。
  2. LinkedList:

    (1)底层数据结构是链表,查询慢,增删快。
    (2)除了继承List接口外,LinkedList接口也继承了Deque接口,所以也可以当作栈和队列(双向)来使用。
    (3)成员方法:
        【1】public void addFirst(E e)及addLast(E e)
        【2】public E getFirst()及getLast()
        【3】public E removeFirst()及public E removeLast()
  3. Vector:

    (1)底层数据结构是数组,查询快,增删慢
    (2)Vector与Array List十分的相像,都是基于数组实现的List类,也是封装了一个动态分配的Object[]数组,也可以使用initialCapacity参数来设置数组的长度。
    (3)Vector是线程安全的,因此性能差
  4. Stack:

    (1)Stack是继承Vector的子类,它主要是用来模拟栈,因此也具备了peek()、pop()、push()等主要用于栈操作的方法。
    (2)Stack也是线程安全的,因此性能差
  5. 使用List集合的建议:

    (1)遍历集合元素。ArrayList和Vector使用get()方法来获取遍历元素,LinkedList应该采用迭代器来遍历集合元素。
    (2)插入和删除。当这类操作较多的时候,优先考虑使用LinkedList。
    (3)多线程。当需要使用到多线程的ArrayList时,可以使用Collections将该集合类包装成线程安全的集合。

Collection之Set接口

  1. 一个不包含重复元素的collection。
  2. Set接口是一个无序的、不可重复的集合。
  3. Set集合中加入数据元素时,Set集合通常不用记住元素的添加顺序。
  4. 当两个相同元素加入到一个Set集合中,则添加操作失败。

常见的继承Set接口的实用类

  1. HashSet:

    (1)按照hash算法来存储集合中的元素,因此具有良好的存取和查找功能。
    (2)无序的,非线程同步的,集合元素可以是null
    (3)HashSet集合存储过程:
        【1】当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该值决定该对象在HashSet中的存储位置。
        【2】如果有两个元素通过equals()方法返回true,但他们的hashCode()方法返回值不相等,HashSet也会将其存储在不同的位置。
        【3】也就是说:HashSet的添加元素判断标准是:两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
  2. LinkedHashSet:

    (1)元素有序并且唯一。
    (2)由链表保证元素有序。
    (3)由哈希表保证元素唯一。
    (4)LinkedHashSet是继承HashSet的子类。
  3. TreeSet:

    (1)使用元素的自然顺序对元素进行排序。
    (2)或者根据创建set时提供的Comparator进行排序。
    (3)TreeSet是SortedSet接口的实现类,所以TreeSet可以确保集合元素处于排序状态。
    (4)TreeSet使用红黑树来维护集合元素的次序。如果实现comparator()方法,可以实现定制排序。如果采用自然排序,则返回null。 
  4. EnumSet:

    (1)专为枚举类设计的集合类
    (2)所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet显式或隐式的指定。
    (3)EnumSet在内部以位向量的形式存储,十分紧凑高效,因此EnumSet对象占用内存小,并且运行效率高
    (4)该集合元素中不允许加入null元素。

Map接口

  1. 该接口无法继承Collection接口,主要原因还是因为Map是用来存储具有映射关系的数据。
  2. Map中保存着两组值。一组值用来保存Map中的Key,另外一组用来保存Map里的value。
  3. 值得注意的是,Map中的Key不能重复,判断标准是同一个Map对象的任何两个Key通过equals方法比较总是返回false
  4. 成员方法:

    (1)V put(K key,V value)
    (2)V remove(Object key)
    (3)void clear()
    (4)boolean containsKey(Object key)
    (5)boolean containsValue(Object value)
    (6)boolean isEmpty()
    (7)int size()
  5. Map接口和Collection接口的不同:

    (1)Map是双列的,Collection是单列的
    (2)Map的健是唯一的,Collection的子体系Set是唯一的
    (3)Map集合的数据结构值针对健有效,跟值无关
    (4)Collection集合的数据结构是针对元素有效的

常见的继承Map接口的实用类

  1. HashMap:

    (1)线程不安全,并且HashMap中可以使用null作为key或者value
    (2)key是哈希表结构,可以保证健的唯一性
  2. LinkedHashMap:

    (1)LinkedHashMap使用一个双向链表来维护key-value对的次序
    (2)LinkedHashMap是一个有序的Map集合,顺序与key-value对的插入顺序保持一致
    (3)具有可预知的迭代顺序
  3. TreeMap:

    (1)TreeMap是一个红黑树的结构,每个key-value作为红黑树的一个节点
    (2)TreeMap也会对key进行排序,也分为自然排序和定制排序两种
    (3)健的红黑树结构,可以保重健的排序和唯一性

Iterator

  1. Iterator概述:对collection进行迭代的迭代器,依赖于集合而存在
  2. 凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合。
  3. 成员方法:

    (1)boolean hasNext()
    (2)E next()
    (3)remove()

参考链接

https://www.cnblogs.com/zhouy…

    原文作者:算法小白
    原文地址: https://segmentfault.com/a/1190000016356896
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞