简介

Java Collection Framework是类似C++的STL一样的工具,十分好用。涉及的包是java.util

JCF的集合对象主要分为:

  • List
  • Set
  • Map

java.util下JCF的UML图

1. Collenction

常用操作

  • 添加元素:add/addAll
  • 清空集合:clear
  • 删除元素:remove/removeAll
  • 判断集合中是否包含某元素:contains/containsAll
  • 判断集合是否为空:isEmpty
  • 计算集合中元素的个数:size
  • 将集合转换为数组:toArray
  • 获取迭代器:iterator

返回一个集合,集合中的元素是随机生成的整数

  private static Collection initCollection()
  {
      Collection<Integer> collection = new ArrayList<Integer>();
      Random r = new Random();
      for (int i = 0 ; i < 5; i++)
      {
          collection.add(new Integer(r.nextInt(100)));
      }

     return collection;
 }

在对集合进行操作的过程中,遍历是一个经常使用的操作,我们可以使用两种方式对集合进行遍历:

  1. 使用迭代器对集合进行遍历。

正如上面描述Collection接口时所说,所有集合都会有一个迭代器,我们可以用它来遍历集合

 private static void accessCollectionByIterator(Collection<Integer> collection)
 {
     Iterator<Integer> iterator = collection.iterator();
     System.out.println("The value in the list:");
     while(iterator.hasNext())
     {
         System.out.println(iterator.next());
     }
 }
  1. 使用foreach遍历集合。
 private static void accessCollectionByFor(Collection<Integer> collection)
 {
     System.out.println("The value in the list:");
     for(Integer value : collection)
     {
         System.out.println(value);
     }
 }

2. List

  • 容纳各种类型(不使用泛型的话)
  • 可以重复
  • 可以索引
  • 可以为空

List的子类主要是ArrayList,Vector和LinkedList,其中前2者基于数组,后者基于链表。其中Vector是线程安全的,其他则不是。

2.1 Vector

  private static void vectorTest1()
  {
      List<Integer> list = new Vector<Integer>();
      for (int i = 0 ; i < 5; i++)
      {
          list.add(new Integer(100));
      }
      list.add(null);
      System.out.println("size of vector is " + list.size());
      System.out.println(list);
 }

它的元素中,既包括了重复元素,也包括了null,输出结果如下:

size of vector is 6
[100, 100, 100, 100, 100, null]

2.2 LinkedList

使用链表,常用方法如下:

  private static void linkedListTest1()
  {
      LinkedList<Integer> list = new LinkedList<Integer>();
      Random r = new Random();
      for (int i = 0 ; i < 10; i++)
      {
          list.add(new Integer(r.nextInt(100)));
      }
      list.add(null);
     System.out.println("size of linked list is " + list.size());
     System.out.println(list);
     System.out.println(list.element());
     System.out.println(list.getFirst());
     System.out.println(list.getLast());
     System.out.println(list.peek());
     System.out.println(list.peekFirst());
     System.out.println(list.peekLast());
     System.out.println(list.poll());
     System.out.println(list.pollFirst());
     System.out.println(list.pollLast());
     System.out.println(list.pop());
     list.push(new Integer(100));
     System.out.println("size of linked list is " + list.size());
     System.out.println(list);
 }

3. Set

  • 不包含重复元素

    3.1 HashSet

  • 线程不安全

  • 可以有null

  • 根据equals方法来判断是否相等(可以自己修改)

  • 采用hash的方法

3.2 TreeSet

  • 父接口是SortedSet
  • 支持排序
  • 默认升序
  • 元素都实现了Comparable接口

4. Map

不排序的Map

4.1 HashMap

  • 可以为null
  • 线程不安全

4.2 Hashtable(升级版的HashMap)

  • 不可以为null
  • 线程安全的

initialCapacity和loadFactor,默认情况下,initialCapacity等于16,loadFactor等于0.75。这和Hash表中可以存放的元素数目有关系,当元素数目超过initialCapacity*loadFactor时,会触发rehash方法,对hash表进行扩容。如果我们需要向其中插入过多元素,需要适当调整这两个参数。

排序Map

4.3 Treemap

  • 线程不安全
  • 元素增、删、查操作时的时间复杂度都是O(log(n))

参考博客:http://wing011203.cnblogs.com/