部分转载,参考自:

1. 理清概念

我们需要理解的概念有以下几个:

  • Array
  • Collection
  • List
  • Set
  • Map

首先来个表格,了解基本的区别:

  有序否 允许元素重复否
Collection
List
Set AbstractSet
HashSet
TreeSet 是(用二叉树排序)
Map AbstractMap 使用key-value来映射和存储数据,Key必须惟一,value可以重复
HashMap
TreeMap 是(用二叉树排序)

 

2. Array

简单来说就和名字一样,它就是数组。它有很多固有的特点:

  • 优点:效率高
  • 缺点:长度固定,无法改变
  • 缺点:只能获取数组的长度,无法判断其中实际有多少元素
  • 特点:其中可以放对象(如String),也可以放实际值(如int),前者放进数组的是引用,后者放入的是实际值
  • 特点:Java提供了Arrays静态对象来进行Array的操作
    • equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
    • fill():将值填入array中。
    • sort():用来对array进行排序。
    • binarySearch():在排好序的array中寻找元素。
    • System.arraycopy():array的复制。

3. Collection

Collection是“容器”,是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

因为Collection是一个抽象的接口,由很多子类进行实现,所以这里不多谈它的优缺点。

Collection也有和Array相似的一个辅助类:Collections。

4. List

List接口对Collection进行了简单的扩充,它的具体实现类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。List是有序的,且可以放入重复的对象。Iterator只能对容器进行向前遍历,而ListIterator则继承了Iterator的思想,并提供了对List进行双向遍历的方法。

4.1 ArrayList

从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快。数组扩容是对ArrayList效率影响比较大的一个因素。每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

4.2 LinkedList

LinkedList的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择。

4.3 Vector

基本上和ArrayList相同,但是其操作都是同步的。Vector很少被用到,参考:stackoverflow >> Why is Java Vector class considered obsolete or deprecated?

5. Set

Set接口也是Collection的一种扩展,而与List不同的时,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。它的常用具体实现有HashSet和TreeSet类。List基本上都是以Array为基础。Set是在HashMap的基础上来实现的,这个就是Set和List的根本区别。

5.1 HashSet

HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法。

5.2 TreeSet

TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口。有时多个类具有相同的排序算法,那就不需要在每分别重复定义相同的排序算法,只要实现Comparator接口即可。

6. Map

Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性。Map有两种比较常用的实现:HashMap和TreeMap。键和值的关联很简单,用pub(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。

6.1 HashMap

HashMap也用到了哈希算法,以便快速查找一个键。

6.2 TreeMap

TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。