[java]集合

来源:互联网 发布:京东java笔试题 编辑:程序博客网 时间:2024/06/05 07:03

为什么我们需要集合?

在编程时, 常常需要集中存放多个数据,可以使用数组来保存多个对象,但数组长度不可变化,一旦在初始化时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,或是具有映射关系的数据,数组就无能为力了,为了保存数量不确定的数据,以及具有映射关系的数,Java提供了集合类。所有的集合类都位于java.util包下,Java5还在java.util.concurrent包下提供了一些多线程支持的集合类。

集合的介绍

集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口包含了一些子接口或者实现类。

组成

1) Collection
一组”对立”的元素,通常这些元素都服从某种规则
  1.1) List必须保持元素特定的顺序
  1.2) Set不能有重复元素
  1.3) Queue保持一个队列(先进先出)的顺序
2) Map
一组成对的”键值对”对象

Collection

Collection的父接口是Iterable,实现这个接口的对象允许使用foreach进行遍历,也就是说,所有的Collection集合对象都具有“foreach可遍历性”.
Collection
Collection是根接口,不可被实例化。
1. Set

Set集合类似于一个罐子,”丢进”Set集合里的多个对象之间没有明显的顺序。Set继承自Collection接口,不能包含有重复元素(记住,这是整个Set类层次的共有属性)。
Set判断两个对象相同不是使用”==”运算符,而是根据equals方法。也就是说,我们在加入一个新元素的时候,如果这个新元素对象和Set中已有对象进行注意equals比较都返回false, 则Set就会接受这个新元素对象,否则拒绝。因为Set的这个制约,在使用Set集合的时候,应该注意两点:
1) 为Set集合里的元素的实现类实现一个有效的equals(Object)方法
2) 对Set的构造函数,传入的Collection参数不能包含重复的元素

  1. HashSet

    1. HashSet是Set接口的典型实现,HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能
    2. HashSet是无序的,根据HashCode值决定存储位置。也不是同步的,集合元素可以是null。
    3. LinkedHashSet是Hash Set的子类
      1. 根据HashCode值决定存储位置,但同时使用链表维护元素的插入顺序。
      2. LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时(遍历)将有很好的性能(链表很适合进行遍历)
    4. TreeSet
      1. TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态
    5. EnumSet
      1. EnumSet是一个专门为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。EnumSet的集合元素也是有序的,它们以枚举值在Enum类内的定义顺序来决定集合元素的顺序
  2. List

    1. List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引
    2. ArrayList
      1. ArrayList是基于数组实现的List类,它封装了一个动态的增长的、允许再分配的Object[]数组。
      2. 线程不安全
    3. Vector
      1. Vector和ArrayList在用法上几乎完全相同,但由于Vector是一个古老的集合,所以Vector提供了一些方法名很长的方法,但随着JDK1.2以后,java提供了系统的集合框架,就将Vector改为实现List接口,统一归入集合框架体系中
      2. 线程安全,所以比ArrayList性能要低
    4. LinkedList
      1. 实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素。同时它还实现Deque接口,即能将LinkedList当作双端队列使用。自然也可以被当作”栈来使用”。
  3. Queue
    1. 模拟队列,先进先出
    2. Deque
      1. Deque接口代表一个”双端队列”,双端队列可以同时从两端来添加、删除元素,因此Deque的实现类既可以当成队列使用、也可以当成栈使用
      2. ArrayDeque
        1. 是一个基于数组的双端队列,和ArrayList类似,它们的底层都采用一个动态的、可重分配的Object[]数组来存储集合元素,当集合元素超出该数组的容量时,系统会在底层重新分配一个Object[]数组来存储集合元素
        2. LinkedList

总结

下篇我们再介绍Map的集合,先来总结一下collection接口下的各种集合
有序:LinkedHashSet(插入顺序),TreeSet,EnumSet(枚举值),List下的都有序,Queue(先进先出)