# 概念

在编程的过程中,我们遇到需要保存的对象,我们可以使用数组进行存储,但是因为数组在初始化的时候指定了数组长度,所以这个数组长度是固定的,当我们需要保存的对象个数不确定或者大于数组的长度时,这时候数组就显得不是很方便了,而且数组无法保存具有映射关系的数据。

为了保存不确定的数据对象,以及保存具有映射关系的数据,Java 提供了集合类

集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类

集合类和数组不一样

数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),

集合里 ** 只能保存对象 **(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)


# 分类

在 Java 中集合类分为 Collection 和 Map,他们都是 Java 集合的根接口。

Collection接口基本结构

Map接口基本情况
接口/类说明
名 称用 途
Iterator 接口集合的输出接口,
主要用于遍历输出(即迭代访问)Collection 集合中的元素
Iterator 对象被称之为迭代器。
迭代器接口是集合接口的父接口,实现类实现 Collection 时就必须实现 Iterator 接口。
Collection 接口是 List、Set 和 Queue 的父接口,是存放一组单值的最大接口。
一般很少直接使用此接口直接操作。
Queue 接口Queue 是 Java 提供的队列实现。
Dueue 接口是 Queue 的一个子接口,为双向队列。
List 接口最常用的接口。
有序集合,允许有相同的元素。
使用 List 能够精确地控制每个元素插入的位置,用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,与数组类似。
Set 接口不能包含重复的元素。
Map 接口接口中的每个元素都是一对,以 key:value 的形式保存。

日常使用的较多的类有:HashSet、TreeSet、ArrayList、ArrayDueue、LinkedList 和 HashMap、TreeMap

  • HashSet: 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,为优化查询速度而设计。
  • TreeSet:是一个有序的 Set,这样就能从 Set 里面提取一个有序序列。
  • ArrayList:能进行快速的随机访问,效率高而且实现了可变大小的数组。
  • ArrayDueue:按 “先进先出” 的方式操作集合元素。
  • LinkedList:可以把它当成 Stack(栈)或者 Queue(队列)来使用,优化了顺序访问,随机访问较慢。
  • HsahMap:按哈希算法来存取键对象
  • TreeMap:可以对键对象进行排序
Collection

Collection 接口定义了一些通用的方法

方法名称说明
boolean add(E e)向集合中添加一个元素,如果集合对象被添加操作改变了,则返回 true。
E 是元素的数据类型
boolean addAll(Collection c)向集合中添加集合 c 中的所有元素,如果集合对象被添加操作改变了,则返回 true。
void clear()清除集合中的所有元素,将集合长度变为 0。
boolean contains(Object o)判断集合中是否存在指定元素
boolean containsAll(Collection c)判断集合中是否包含集合 c 中的所有元素
boolean isEmpty()判断集合是否为空
Iteratoriterator()返回一个 Iterator 对象,用于遍历集合中的元素
boolean remove(Object o)从集合中删除一个指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true。
boolean removeAll(Collection c)从集合中删除所有在集合 c 中出现的元素(相当于把调用该方法的集合减去集合 c)。如果该操作改变了调用该方法的集合,则该方法返回 true。
boolean retainAll(Collection c)从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合 c 的交集),如果该操作改变了调用该方法的集合,则该方法返回 true。
int size()返回集合中元素的个数
Object[] toArray()把集合转换为一个数组,所有的集合元素变成对应的数组元素。
来自JavaAPI
List

List 实现了 Collection 接口

常用的有:ArrayList 和 LinkedList

Arraylist

方法名称说明
E get(int index)获取此集合中指定索引位置的元素
E 为集合中元素的数据类型
int index(Object o)返回此集合中第一次出现指定元素的索引
如果此集合不包含该元 素,则返回 -1
int lastIndexOf(Object o)返回此集合中最后一次出现指定元素的索引
如果此集合不包含该 元素,则返回 -1
E set(int index, Eelement)将此集合中指定索引位置的元素修改为 element 参数指定的对象。
此方法返回此集合中指定索引位置的原元素
ListsubList(int fromlndex, int tolndex)返回一个新的集合,新集合中包含 fromlndex 和 tolndex 索引之间 的所有元素。
包含 fromlndex 处的元素,不包含 tolndex 索引处的 元素

LinkedList

方法名称说明
void addFirst(E e)将指定元素添加到此集合的开头
void addLast(E e)将指定元素添加到此集合的末尾
E getFirst()返回此集合的第一个元素
E getLast()返回此集合的最后一个元素
E removeFirst()删除此集合中的第一个元素
E removeLast()删除此集合中的最后一个元素

ArrayList 与 LinkedList 都是 List 接口的实现类,因此都实现了 List 的所有未实现的方法,只是实现的方式有所不同。

ArrayList 是基于动态数组的实现,访问元素速度优于 LinkedList。

LinkedList 是基于链表结构的实现,占用的内存空间比较大,但在批量插入或删除数据时优于 ArrayList。

根据需求来选则

Set

常用的实现类:HashSet 类和 TreeSet 类

HashSet 是按照 Hash 算法来存储集合中的元素(实际上是一个 HashMap 集合),所以查询和存放速度快,不允许有重复元素的集合。保证元素唯一性的方式依赖于:hashCode () 于 equals () 方法。

保证 HashSet 集合元素的唯一,其实就是根据对象 hashCode 和 equals 方法来决定的。如果往集合中存放自定义对象,为了保证唯一性,就必须重写 hashCode 和 equals 方法建立属于当前对象的比较方法。

// 重写 hashCode 方法
    public int hashCode()
    {
        return name.hashCode() + age;
    }
    // 重写 equals 方法
    public boolean equals(Object obj)
    {
        if(this == obj)
            return true;
        if(obj == null)
            return false;
        if(obj instanceof Person)
        {
            Person P = (Person)obj;
            return name.equals(obj.name) && age == P.age;
        }
        return false;
    }

HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 必须在多线程访问时显式同步对 HashSet 的并发访问。

TreeSet 类同时实现了 Set 接口和 SortedSet 接口。SortedSet 接口是 Set 接口的子接口,可以实现对集合进行自然排序。

TreeSet 只能对实现了 Comparable 接口的类对象进行排序。

Map

Map 是采用键值对来存储的

  • 每个元素成对存在,由键和值两部分组成,通过键可以找到对应的值
  • 键(key 值)不可重复,值(value)可以重复,一个 value 值可以和很多 key 值形成对应关系,每个建最多只能映射到一个值
  • 两个 Map 接口的重要实现类:HashMap 类、LinkedHashMap 类

Map 常用方法:

  • get(Object key):获取指定键 (key) 所对应的值 (value)

  • put(K key,V value):将指定的键与值对应起来,并添加到集合中

    若指定的键 (key) 在集合中没有,则没有这个键对应的值,返回 null,并把指定的键值添加到集合中

    若指定的键 (key) 在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值

  • remove(Object key):根据指定的键 (key) 删除元素,返回被删除元素的值 (value)