zoukankan      html  css  js  c++  java
  • java容器类

    java容器类

    1.概述

    Java容器类的JDK提供的保存对象的类。其隐藏了具体的实现(数组、链表),包含常用的数据结构:集合、队列、栈、映射

    Java容器主要包括3部分:Collection集合(List、Set)、Map映射工具类(Iterator迭代器、Enumeration枚举类、Arrays、Collections)

    2.框架

    说明:左图为简化图,右图为完整图(未包括Queue的实现)

                                           

    主要有两个不同概念:

    1).Collection接口,一个独立元素的序列,它包含一些基本的操作和属性。分为List、Set。

    List是一个依照插入顺序的集合,每个元素都有它的索引(第一个元素索引值为0)。List实现类主要有:ArrayList、LinkedList、Stack、Vector。
    Set是一个不能有重复元素的集合(部分实现类可以有一个null对象)。Set实现类主要有:HashSet、TreeSet、LinkedHashSet。其中HashSet底层依赖于HashMap实现的,TreeSet底层依赖于SortedMap实现的。

    2). Map映射接口,即key-vallue键值对。

    Map是一个key-value键值对映射接口。其中key不能有重复元素(部分实现类可以有一个null对象)。Map实现类主要有:HashMap、TreeMap、LinkHashMap、HashTable等。

    3).Iterator接口,即迭代器。是遍历集合的工具。

    4).Arrays与Collections是操作数组、集合的工具类。其有许多已经实现的方法来更好的操作数组、集合。

    3.详解

    Collection接口


    1).定义
    public interface Collection<E> extends Iterable<E>

    2).Collection的部分常用API

    boolean add(E e) 向集合添加对象,若其发送改变则返回true。
    boolean addAll(Collection<? extends E> c)
    void clear()
    boolean contains(Object o)  通过equals()方法判断该集合是否有该元素,若有返回true。
    Iterator<E> iterator() 返回Iterator。
    boolean remove(Object o) 移除集合中与该对象相等(o.equals(e))的第一个对象,若集合发送改变,返回true。
    boolean isEmpty()
    int size() 返回该集合包含元素的数量。
    <T> T toArray(T[] a) 返回包含此集合中所有元素的数组,数组元素必须是T类型或者T类型的父类。
    

    List接口


    1).定义
    public interface List<E> extends Collection<E>
    List可以将元素维护在特定的序列中,没有元素都要索引,并且允许有重复元素。

    2)List的常用API

    boolean add(E e) 向集合添加对象,若其发送改变则返回true。
    boolean addAll(Collection<? extends E> c)
    void clear()
    boolean contains(Object o) 通过equals()方法判断该集合是否有该元素,若有返回true。
    Iterator<E> iterator() 返回Iterator。
    boolean remove(Object o) 移除集合中与该对象相等(o.equals(e))的第一个对象,若集合发送改变,返回true。
    boolean isEmpty()
    int size() 返回该集合包含元素的数量。
    <T> T toArray(T[] a) 返回包含此集合中所有元素的数组,数组元素必须是T类型或者T类型的父类。
    // 相比Collection新增的API
    E get(int index) 返回List中该索引的元素。
    int indexOf(Object o) 返回该元素在List的索引,通过equals()方法比较,若在返回其索引,不在返回-1。
    ListIterator listIterator() 返回listIterator。
    E remove(int index)  移除List指定索引的元素,返回该元素。
    E set(int index,E element) 替换List指定索引的元素,返回该元素。
    

    3)实现List接口的类

    ArrayList(线程不同步)
    public class ArrayList<E> extends AbstractList implements List<E>, RandomAcess, Cloneable, Serializable
    ArrayList是用数组实现的一种线性表,在随机访问方面优秀,是我们最常用的集合。

    LinkedList(线程不同步)
    pulbic class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serialzable
    LinkedList是用双向链表实现的,插入、删除方面优秀。

    Vector(线程安全)
    public class Vector<E> extends AbstractList<E> implements List<E>, RandomAcess, Cloneable, Serializable
    和ArrayList基本是一样的,但Vector是线程安全。

    Stack(线程安全)
    public class Stack<E> extends Vector<E>
    基于Vector实现的栈(后进先出)。

    其中ArrayList、LinkedList可以通过Collections.synchronizedList()方法转换成线程安全。
    例如:List arrayList = Collections.synchronizedList(new ArrayList())

    Set接口


    1).定义
    public interface Set<E> extends Collection<E>
    Set是一个继承于Collection的接口,Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义,一些Set允许有一个null对象。

    2).Set的API与Collection完全一样。

    3).实现Set接口的类

    HashSet(线程不同步)
    public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable
    HashSet堪称查询速度最快的集合,因为其内部依赖于HashMap。集合元素不能重复,可以有一个null对象。它内部元素的顺序是由哈希码来决定的,所以它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。
    注:其存放元素时通过equals()hashCode()方法比较是否重复,所以我们需要重写该对象的equals()hashCode()方法。

    TreeSet(线程不同步)
    pulbic class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializeble
    TreeSet内部依赖于TreeMap,内部是红黑树实现的,总是生成有序的Set。集合元素不能重复,不可以有null对象。TreeSet是有序的,所以存放的对象必须实现Comparable<E>接口,或者构造方法传入比较器(实现Comparator<E>接口的类)。
    注:其存放元素时通过compareTo()方法或者compare()方法进行比较是否重复以及大小。

    LinkHashSet(线程不同步)
    public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, Serializable
    LinkHashSet内部依赖于LinkedHashMap,保证元素的插入顺序。集合元素不能重复,可以有一个null对象。
    注:其存放元素通过equals()hashCode()方法比较是否重复,所以我们需要重写该对象的equalshashCode()方法。

    Map接口


    1).定义
    public interface Map<K,V>
    Map是key-value键值对,提供了key到value的映射。Map中key不能有相同元素,value可以有相同元素。部分Map实现类中key可以有一个null对象。
    2).Map的常用API

    boolean	containsKey(Object key)  返回该Map是否有该key。
    boolean containsValue(Object value)  返回该Map是否有该Value。
    Set<Map.Entry<K,V>> entrySet()  返回该Map包含的所有映射关系Map.Entry<K,V>的Set集合。
    V get(Object key)  返回该Map中key映射的value对象,如果Map中没有该key对象返回null。
    Set<K> keySet()  返回该Map中的所有key的Set集合。
    V put(K key,V value)  把key-value映射放入Map中,如果Map中有该key则返回原来key对应的value,否则返回null。
    V remove(K key)  如果Map中有该key返回原来key对应的value,否则返回null。
    int size()  返回Map中key-value映射的数量
    

    3).实现Map接口的相关类
    HashMap(线程不同步)
    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
    HashMap内部以哈希、数组、链表实现。它是为快速查询而设计的,无序。其key不能重复但可以有一个null对象。
    注:其key不能有相同元素是通过equals()hashCode()方法进行比较的,所以我们需要重写key对象的equals()hashCode()方法。
    HashTable(线程同步)
    public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
    HashTable继承Dicionary类,实现了Map接口。HashTable性能不及HashMap,但其是线程安全的。该类用的较少。其key与value都不能为null对象。
    TreeMap
    public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
    TreeMap内部红黑树实现的有序散列表。其key不能重复而且不能有null对象。TreeMap是有序的,所以存放的对象必须实现Comparable<E>接口,或者构造方法传入比较器(实现Comparator<E>接口的类)。
    注:其存放元素时通过compareTo()方法或者compare()方法进行比较是否重复以及大小。
    LinkedHashMap
    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
    LinkedHashMap继承自HashMap并且实现了Map接口。其key不能重复但可以有一个null对象。它能够保证元素的插入顺序。
    注:其key不能有相同元素是通过equals()hashCode()方法进行比较的,所以我们需要重写key对象的equals()hashCode()方法。
    WeakHashMap
    没有用过,不太清楚。

    Iterator接口


    1).定义
    public interface Iterator<E>
    Iterator是集合的迭代器接口。集合可以通过Iterator进行遍历
    注:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
    2).Iterator的常用API

    abstract boolean hasNext()
    abstract E next()
    abstract void remove()
    

    6.references

    http://alexyyek.github.io/2015/04/06/Collection/
    http://blog.csdn.net/tsyj810883979/article/details/6897043

  • 相关阅读:
    反流技术之IE插件技术研究第一部分
    c# post和接收的实现
    C# post提交表单的例程
    用C#搭建IE BHO勾子, 取表单密码
    复杂的 DataBinding 接受 IList 或 IListSource 作为数据源" 错误原来是自己的笔误
    C#判断ContextMenuStrip右键菜单的来源(从哪个控件弹出来的)
    练习5.1
    示例:实用函数(Utilities)
    闭包
    一个错误
  • 原文地址:https://www.cnblogs.com/maying3010/p/6475449.html
Copyright © 2011-2022 走看看