java collection

来源:互联网 发布:c语言必读书籍 编辑:程序博客网 时间:2024/06/05 00:07


注:
    Java集合框架的设计是使用接口,抽象类和具体类的一个很好的例子,用接口定义框架。

    用抽象类提供这个接口的部分实现。



Java集合框架支持以下两种类型的容器:
    
    一种是为了存储一个元素集合,简称为集合(Collection)。

    一种是为了存储键/值对,称为图(map)。

Java集合框架支持三种主要类型的集合:规则集(Set),线性表(List),队列(Queue).

    Set的实例用于存储一组不重复的元素;

    List的实例用于存储一个由元素构成的有序集合;

    Queue的实例用于存储先进先出方式处理的对象。

<---Collection接口和AbstractCollection类--->

    Collection接口是处理对象集合的根接口。

    AbstractCollection类是提供Collection接口部分实现的便利类,除了size和iterator方法。

<Set>----规则集

    HashSet(散列集)
        底层用HashMap来实现,用HashMap来保存元素。
        HashSet对象要保证其唯一性,需重写equals()和hashCode()方法。
        不保证元素顺序。

    LinkedHashSet(链式散列集)
        输入输出顺序保持一致。
        不是线程安全的。
        
    TreeSet(树形集)
        内部为一个红黑树。

<List>----线性表

    ArrayList(数组线性表)
        是一个实现List接口的大小可变的“数组”,容量只能自动变大,不会自动变小。
        用trimToSize()将数组容量减小到线性表的大小。
        操作不是线程安全的。
        
    LinkedList(链表类)
        是实现List接口的一个“链表”,这个类除了实现List接口的方法外,还提供从线性表两端提取,
        插入和删除元素的方法。

    Vector(向量类)
        继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。
        通过数组保存数据。当Vector容量不足以容纳全部元素时,Vector的容量会增加。
        遍历方式:迭代器,随机访问,for循环,Enumeration遍历.
        操作是线程安全的。
    
    Stack(栈类)
        继承Vector类。
        Stack 类表示后进先出(LIFO)的对象堆栈。

    Queue(队列类)
        队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列
        (或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)
        的方式对元素进行排序。无论使用哪种排序方式,队列的头 都是调用 remove() 或 poll() 所移除的
        元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。


<Map>----图

    依照键值存储元素的容器。
    不能有重复键值,每个键值对应一个值。(key->Value)
    一个键值和它的对应值构成一个条目。

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    >>>>转化成Set<?>

    Map不能使用迭代,若非要用迭代进行输出,则必须用entrySet将其转化为Set,然后通过Set接口的Iterator
    进行访问迭代输出。
    (Set<Map.Entry<?,?>> s = map.entrySet();)

    >>>>转化成List<?>
    
    List keyList = new ArrayList(map.keySet());
    
    List valueList = new Arraylist(map.valueSet());

    List entryList = new ArrayList(map.entrySet());

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    初始化一个static常量Map
    
    public class Test1{
    private static final Map map;
    static{
    Map m = new HashMap();
    m.put(1,"one");
    m.put(2,"two");
    map = Collection.unmodifiableMap(m);
    }
    }

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    使用自定义类作为Key时,需要实现Comparable接口。(equals和hasCode方法)

    图的类型有三种:HashMap(散列图),LinkedHashMap(链式散列图),TreeMap(树形图)

    Map接口提供了查询,更新和获取集合的值和集合的键值的方法。

    更新方法:clear,put,putAll,remove.

    查询方法:containKey,containsValue,isEmpty,size.

    获取集合值:ketSet()获得一个包含图中键值的规则集,values()获得一个包含图中值的集合,
            entrySet()返回一个实现Map.Entry<K,V>接口的对象集合。Entry是Map接口的一个内部接口。


    HashMap(散列图)
        是AbstractMap的子类。
        定位一个值,插入一个映射以及删除一个映射而言,此类高效。(无序存放,key不允许重复,新)
        非线程安全。

    LinkedHashMap(链式散列图)
        用来扩展HashMap,支持图中的条目排序。

    TreeMap(树形图)
        遍历排好顺序的键值时很高效。
        可用Comparator或Comparable来排序。
        实现了SortMap接口。属于排序子类。
        (按照key排序,Key不允许重复)

    HashTable(哈希表)
        (无序存放,旧,Key不允许重复)
        线程安全。

    WeakHashMap(弱引用Map集合)
        (使用gc回收集合中某些不再使用的内容)
        之前都是强引用类,即里面的内容不管是否使用都在集合中保留。
        弱引用,希望集合自动清理暂时不用的数据。

    IdentifyHashMap
        (key可以重复的Map集合)

<Enumeration和Iterator>

    Iterator
        迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了
        解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
        java中的iterator只能单向移动。(next())

        为List设计的listiterator可以双向移动。

    Enumeration
        是最早的迭代输出接口,最早使用Vector时,就是用Enumeration进行输出的。
        与iterator类似,只是iterator中存在删除数据的方法,而Enumeration不存在。
        
<对象的引用>

java把对象的引用分为四个级别:
        强引用,软引用,弱引用,虚引用

在java.lang.ref包中。

强引用:
    当内存不足时,JVM宁可出现OutOfMemoryError错误而停止程序,也不会回收此对象。

    例如:HashMap mapRef = new HashMap();
    
软引用:
    当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存。

    就是不是那种用强制的方式要求对象存在于内存的引用。
    可以借助垃圾回收器来判断某个对象的可达性,并帮你回收弱引用所引用的对象。
    例如: StringBuffer sbuff = new StringBuffer("What is a WeakReference?");
           WeakReference<StringBuffer> wref = new WeakReference<StringBuffer>(sbuff);
           sbuff = null;

弱引用:
    无论内存是否紧张,被垃圾回收器发现立即回收。

虚引用:
    和没有引用一样。

详细引用解释可参考:http://www.cnblogs.com/ericchen/archive/2011/05/27/2059060.html


以上只是为了更好的理解java框架结构,大脑有个清晰的思路,具体用时还得查文档。



1 0