Java 集合类(容器)

Java集合框架详解
本文深入解析了Java集合框架,包括Collection、List、Set、Map等核心接口及其实现类的特点和应用场景,对比了不同集合类的性能差异。

介绍

Java各种集合类平时用得最多,用活用对需要对各种集合有较深入了解。对于java.util包中一系列重要集合,首先理清相互之间关系(继承),掌握内部结构(看适当源码),各集合类特点适用环境,遍历集合的迭代模式.…….

集合框架主要由接口、抽象类、和实现类构成。区分各种实现类的标准主要是:元素是否可重复是否有序

总览

下图摘自:
http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526822.html

引用块内容
这里写图片描述
实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等

综述:

  1. Collection:集合层次中的根接口之一(Map),JDK没有提供该接口的实现类
  2. Set:接口,继承自Collection。不能包含重复元素,子接口SortedSet是一个按照升序排列的元素Set
  3. List:接口,继承自Collection。可包含重复元素,有序集合,提供按索引访问的方式,有次序。
  4. Iterator:接口,所有集合类都实现了Iterator接口,用于遍历集合中元素的接口。
public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}

详解

所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
如:ArrayList

/**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
    this(10);
    }

    /**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

Collection中每个元素的遍历:使用iterator()方法,该方法返回一个跌代子,用它可以依次访问Collection中的每一个元素。

Iterator iterator=collection.iterator();
while(iterator.hasNext()){
    Object obj=iterator.next();
}

List接口

有序Collection;允许有重复元素;通过索引快速访问元素

  1. LinkedList类:允许null元素,在LinkedList的首部和尾部提供额外的get,remove,insert方法。可用作stack,queue;没有同步方法。多线程访问一个List,需自己实现访问同步。
  2. ArrayList类:可变大小数组。允许null。没有同步方法。访问元素运行时间为常数{size(),isEmpty(),get(),set()}。添加n个元素需要O(n)时间。(参见:java源码分析之ArrayListjava源码分析之ArrayList
  3. Vector类:类似ArrayList,区别是Vector方法时同步的,开销大。
  4. Stack类继承自Vector类,实现了一个后进先出的栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用:push和pop方法,peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

ArrayList和LinkedList的区别http://blog.youkuaiyun.com/qianzhiyong111/article/details/6678035

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于双向链表的数据结构。

2.继承机制:ArrayList继承于AbstractList,LinkedList继承于AbstractSequentialList,而AbstractSequentialList又继承于AbstractList。AbstractSequentialList 实现了“链表中根据index索引值操作链表的全部函数”。

3.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

4.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

Set接口

无序集合, 不允许有重复元素;任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。

  1. HashSet类:而且采用散列的存储方法,没有顺序(元素插入的顺序与输出的顺序不一致)。基于 HashMap 实现,本质和HashMap相同。HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
  2. TreeSet类:基于TreeMap实现。TreeSet中的元素将按照升序排列,缺省是按照自然排序进行排列。底层基于红黑树实现(自平衡的排序二叉树)。

Map接口

Map没有继承Collection接口,Map提供key到value的映射。Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

  1. Hashtable类:同步的(线程安全)。Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。不能有null的key和value
  2. Hashmap类:HashMap是Hashtable的轻量级实现。线程不安全。允许有null的键和值,但是key值只能有一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。(Java集合—HashMap源码剖析
  3. TreeMap类:对key排好序的Map; key 就是TreeSet, value对应每个key; key要实现Comparable接口或TreeMap有自己的构造器;
  4. Properties类::key和value都是String类型,用来读配置文件;
  5. IdentityHashMap类:利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。用于拓扑保留对象图形转换,如序列化或深层复制。
  6. WeakHashMap类:种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

Hashmap和Hashtable的区别http://blog.youkuaiyun.com/qianzhiyong111/article/details/6677885

HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样;HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许key值只能有一个null值

HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样;

HashTable使用Enumeration,HashMap使用Iterator。

HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

哈希值的使用不同,HashTable直接使用对象的hashCode

Hash类实现方法中,作为key的对象要正确复写equals和hashCode方法。HashMap中的hasCode()方法继承自Object类:public native int hashCode(),具细节参见:http://www.cnblogs.com/dolphin0520/p/3681042.html

工具类

  1. Arrays:包含用来操作数组(比如排序和搜索)的各种方法。
  2. Collections:包装类(工具类/帮助类),不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。主要提供了在 collection 上进行操作的静态方法(同步集合类方法) 。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestCollections {

    public static void main(String args[]) {
        //注意List是实现Collection接口的
        List list = new ArrayList();
        double array[] = { 112, 111, 23, 456, 231 };
        for (int i = 0; i < array.length; i++) {
            list.add(new Double(array[i]));
        }
        Collections.sort(list);
        for (int i = 0; i < array.length; i++) {
            System.out.println(list.get(i));
        }
        // 结果:23.0 111.0 112.0 231.0 456.0
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值