前言
- 在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们实现已经明确知道我们将要保存的对象的数量。
- 一旦在数组初始化时指定了数组长度,这个数组长度就是不可变的,如果我们需要保存一个可以动态增长的数据,在编译时无法确定具体的数量,java的集合类就是一个很好的设计方案。
- 集合类概述:面对对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供类集合类。
数组和集合类都是容器,不同之处:
(1)数组虽然也可以存储对象,但长度是固定的;集合的长度是可变的。 (2)数组中可以存储基本数据类型,集合只能存储对象。
- 集合类特点:集合只用于存储对象,集合长度可变,集合可以存储不同类型的对象。
- 集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。
- 所有的集合类都位于java.util包下。
- 细数java集合,其中比较常见的就是List、Set、Map、和Queue,在这四者中,除了Map,其他三个接口都继承于Collection。
Collection
- Collection接口概述:Collection层次结构中的根接口。
- Collection表示一组对象,这些对象也称为collection的元素。
- 一些collection允许有重复的元素,而另一些不允许;一些collection是有序的,而另一些则是无序的。
成员方法:
(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接口
- 概述:有序的collection,也称为序列。
- List接口在java集合类中充当的是一个元素有序、元素可重复的集合角色。
- 继承于Collection集合,所以拥有Collection集合的所有方法。
- List集合也拥有属于自己的方法:用来实现根据元素索引来操作集合元素的作用。
- 此接口的用户可以对列表中的每个元素的插入位置进行精确的控制。
- 用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
成员方法:
(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接口的实用类
ArrayList:
(1)基于数组实现的List类,封装了一个动态的、允许再分配的Object[]数组 (2)ArrayList用initialCapacity参数来设置该数组的长度,当长度超过预设值后,ArrayList会动态增加。 (3)ArrayList类是线程不安全的,如果要保证该集合的同步性,必须在程序中手动保存。 (4)底层数据结构是数组,查询快,增删慢 (5)线程不安全,效率高 (6)增删慢也是在数据量较大的情况下,在数据量较小的情况下,ArrayList()不一定比LinkedList()方法慢。 (7)另外,ArrayList在末尾插入和删除数据的话,速度反而比LinkedList要快。
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()
Vector:
(1)底层数据结构是数组,查询快,增删慢 (2)Vector与Array List十分的相像,都是基于数组实现的List类,也是封装了一个动态分配的Object[]数组,也可以使用initialCapacity参数来设置数组的长度。 (3)Vector是线程安全的,因此性能差
Stack:
(1)Stack是继承Vector的子类,它主要是用来模拟栈,因此也具备了peek()、pop()、push()等主要用于栈操作的方法。 (2)Stack也是线程安全的,因此性能差
使用List集合的建议:
(1)遍历集合元素。ArrayList和Vector使用get()方法来获取遍历元素,LinkedList应该采用迭代器来遍历集合元素。 (2)插入和删除。当这类操作较多的时候,优先考虑使用LinkedList。 (3)多线程。当需要使用到多线程的ArrayList时,可以使用Collections将该集合类包装成线程安全的集合。
Collection之Set接口
- 一个不包含重复元素的collection。
- Set接口是一个无序的、不可重复的集合。
- Set集合中加入数据元素时,Set集合通常不用记住元素的添加顺序。
- 当两个相同元素加入到一个Set集合中,则添加操作失败。
常见的继承Set接口的实用类
HashSet:
(1)按照hash算法来存储集合中的元素,因此具有良好的存取和查找功能。 (2)无序的,非线程同步的,集合元素可以是null (3)HashSet集合存储过程: 【1】当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该值决定该对象在HashSet中的存储位置。 【2】如果有两个元素通过equals()方法返回true,但他们的hashCode()方法返回值不相等,HashSet也会将其存储在不同的位置。 【3】也就是说:HashSet的添加元素判断标准是:两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
LinkedHashSet:
(1)元素有序并且唯一。 (2)由链表保证元素有序。 (3)由哈希表保证元素唯一。 (4)LinkedHashSet是继承HashSet的子类。
TreeSet:
(1)使用元素的自然顺序对元素进行排序。 (2)或者根据创建set时提供的Comparator进行排序。 (3)TreeSet是SortedSet接口的实现类,所以TreeSet可以确保集合元素处于排序状态。 (4)TreeSet使用红黑树来维护集合元素的次序。如果实现comparator()方法,可以实现定制排序。如果采用自然排序,则返回null。
EnumSet:
(1)专为枚举类设计的集合类 (2)所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet显式或隐式的指定。 (3)EnumSet在内部以位向量的形式存储,十分紧凑高效,因此EnumSet对象占用内存小,并且运行效率高 (4)该集合元素中不允许加入null元素。
Map接口
- 该接口无法继承Collection接口,主要原因还是因为Map是用来存储具有映射关系的数据。
- Map中保存着两组值。一组值用来保存Map中的Key,另外一组用来保存Map里的value。
- 值得注意的是,Map中的Key不能重复,判断标准是同一个Map对象的任何两个Key通过equals方法比较总是返回false
成员方法:
(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()
Map接口和Collection接口的不同:
(1)Map是双列的,Collection是单列的 (2)Map的健是唯一的,Collection的子体系Set是唯一的 (3)Map集合的数据结构值针对健有效,跟值无关 (4)Collection集合的数据结构是针对元素有效的
常见的继承Map接口的实用类
HashMap:
(1)线程不安全,并且HashMap中可以使用null作为key或者value (2)key是哈希表结构,可以保证健的唯一性
LinkedHashMap:
(1)LinkedHashMap使用一个双向链表来维护key-value对的次序 (2)LinkedHashMap是一个有序的Map集合,顺序与key-value对的插入顺序保持一致 (3)具有可预知的迭代顺序
TreeMap:
(1)TreeMap是一个红黑树的结构,每个key-value作为红黑树的一个节点 (2)TreeMap也会对key进行排序,也分为自然排序和定制排序两种 (3)健的红黑树结构,可以保重健的排序和唯一性
Iterator
- Iterator概述:对collection进行迭代的迭代器,依赖于集合而存在
- 凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合。
成员方法:
(1)boolean hasNext() (2)E next() (3)remove()