java中的集合体系

来源:互联网 发布:托马斯·哈里斯 知乎 编辑:程序博客网 时间:2024/05/19 17:56

集合体系

1、Collection

Collection<T>    |--List<T>(Iterator、ListIterator、get)允许元素重复,因为有角标索引        |--ArrayList<T>        底层是数组,查询较快,增删较慢。        |--LinkedList<T>        底层是链表,查询较慢,增删较快。        |--Vector<T>        和ArrayList没有特别大的区别        1)Vector是1.0出现,ArrayList是1.2出现。        2)Vector支持线程同步,效率低,ArrayList不支持同步,效率高        3)Vector提供了枚举的获取元素的方式。        Vector<T> v = new Vector();        v.add(...);        for(Enumeration<T> e = v.elements(); e.hasMoreElement(); )        {            T t = e.nextElement();        }    |--Set<T>(Itertaor)不允许元素重复,没有角标索引        |--HashSet<T>        底层是hash表,保证元素唯一性的原理是hashCode()和equals()方法        |--TreeSet<T>        底层是二叉树结构,可以对元素进行排序,保证元素唯一性的原理是元素自身的比较方式或者自定义比较器。

2、Map

Map<K,V>    |--TreeMap<K,V>    底层二叉树,不支持线程同步,效率高    通过键自身的比较方法或者比较器来保证键的唯一性,并且会对键进行排序    允许null作为键和值    |--HashTable<K,V>    底层是hash表,支持线程同步,效率低,1.0出现    不允许null的键和值        |--Properties    |--HashMap<K,V>    底层是hash表,不支持线程同步,效率高,1.2出现    允许null作为键和值    和HashSet相同,通过hashCode和equals方法保证键的唯一性

集合体系方法

1、Collection<E>体系方法

            1)共性方法

boolean add(E e)//成功添加就返回trueboolean addAll(Collection<? extends E> c)void clear()//清除集合中的所有元素boolean contains(Object obj)boolean containsAll(Collection<?> c)boolean equals(Object obj)boolean isEmpty()Iterator<E> iterator()//返回迭代器boolean remove(Object o)//true表示有o元素并删除,false表示没有boolean removeAll(Collection<?> c)//移除当前集合中的在也在c中的元素,如果该集合发生了改变就返回true,没有就返回falseboolean retainAll(Collection<?> c)//只保留两个集合中的共有元素,如果该集合发生了改变就返回true,如果没有就返回falseint size()//返回元素个数Object[] toArray()

            2)List<E>特有方法,涉及到角标

boolean add(int index, E e)//在index角标出添加元素eboolean addAll(int index, Collection<? extends E> c)//将集合c添加到index处E get(int index)//获取index处的元素void set(int index, E e)int indexOf(Object obj)//返回obj所在的角标,不包括返回-1int lastIndexOf(Object obj)//倒序索引,返回obj第一次出现的角标,不包括返回-1E remove(int index)//返回index位置的元素,如果没有就返回nullList<E> subList(int fromIndex, int toIndex)//返回子集合[fromIndex, toIndex-1]ListIterator<E> listIterator()//返回ListIterator迭代器

            3)LinkedList<E>特有方法

void addFirst(E e)//将e插入此列表的开头void addLast(E e)//将e插入此列表的结尾1.6开始后,变成了offerFirst(E e)和offerLast(E e),返回值是booleanE getFirst()//从列表开头获取元素而不删除E getLast()//从列表结尾获取元素而不删除1.6开始后,变成了peekFirst()和peekLast()E removeFirst()//从列表开头获取元素并删除E removeLast()//从列表结尾获取元素并删除1.6开始后,变成了pollFirst()和pollLast()对于栈,使用addFirst和removeFirst配合或者使用addLast和removeLast配合对于堆,使用addFirst和removeLast配合或者使用addLast和removeFirst配合

            3)Set<E>的方法和Collection<E>相同

2、Map<K,V>体系方法

            1)添加

boolean put(K key, V value)//添加<key, value>映射关系,如果集合中没有该键就返回null,如果有就返回该键对应的旧值。保证键唯一性的方法和具体的Map集合有关:比如对于HashMap集合,判断键是否相同是根据hashCode和equals方法对于TreeMap集合,判断键是否相同是根据键自身的比较性或者自定义比较器的比较方法进行

            2)删除

void clear()//清除Map集合V remove(Object key)//清除键key对应的键值对,并且返回值,如果没有该键,返回null

            3)判断

boolean isEmpty()boolean containsKey(Object obj)//判断是否包含键为obj的键值对boolean containsValue(Object obj)//判断是否包含值为obj的键值对boolean equals(Object obj)//判断集合和obj是否相同

            4)获取大小、值

int size()//获取大小Collection<V> values()//获取所有的值V get(Object key)//获取key对应的value值,如果没有就返回null

            5)获取元素

//Set<K> keySet()//将Map集合的键存到Set集合中for(Iterator<K> it = map.keySet().iterator(); it.hasNext();){K key = it.next();V value = map.get(key);sop(key+"---"+value);}//Set<Map.Entry<K,V>> entrySet()//将映射关系存到Set集合中for(Iterator<Map.Entry<K,V>> it = map.entrySet().iterator(); it.hasNext();){Map.Entry<K,V> me = it.next();K key = me.getKey();V value = me.getValue();sop(key+"---"+value);}

3、迭代器Iterator及其子接口ListIterator方法

            1)Iterator<E>

void remove()//将集合从元素中删除boolean hasNext()//判断是否还有元素E next()//获取元素

            2) ListIterator<E>

boolean hasNext()boolean hasPrevious()//判断前面是否有元素E next()E previous()//获取前一个的元素void add(E e)//将元素e插入列表void remove()void set(E e)//将元素替换next或者previous返回是最后一个元素

4、Map.Entry<K,V>

            Map.Entry<K,V>接口是Map接口中的内部静态接口。表示映射关系。

K getKey()//获取映射关系的键V getValue()//获取映射关系的值V setValue(V value)//使用value替换此项对应的值

5、Enumeration<E>枚举

            和迭代器相同

boolean hasMoreElements()E nextElement()

6、Properties

           1)是HashTable的子类,获取元素有三种方式,keySet()和entrySet()以及Set<String> stringPropertyNames()

    //1)keySet()    for(Object key: prop.keySet())    {            sop(key+"---"+prop.get(key));    }    //2)entrySet()    for(Map.Entry<Object, Object> me: prop.entrySet())    {        sop(me.getKey()+"---"+me.getValue());    }    //3)stringPropertyNames()    for(String key: prop.stringPropertyNames())    {        sop(key+"---"+prop.get(key));    }
            2)系统类System的静态方法:public static Properties getProperties()
如果直接输出获取的系统属性,格式较复杂,不利于获取具体元素。因此可以使用Properties的方法list,将属性列表输出到输出字符流或者输出字节流。void list(PrintStream out)void list(PrintWriter out)

7、HashSet<E>和HashMap<K,V>保证元素唯一的原理:hashCode和equals

hs.add(E e);hs.contains(Object e);hs.remove(Object e)首先调用e.hashCode(),看hs集合中是否有相同的hash值:如果没有直接添加,add返回true,remove和contains返回false;如果有就调用e.equals(obj),obj是和e的hash值相同的元素,如果没有相同的,同上;如果有相同的,就不添加,add返回false,contains和remove方法返回true,remove方法会将该元素删除。HashMap<K,V>使用相同的方法是对键进行唯一性判定。

8、TreeSet<E>和TreeMap<K,V>保证元素唯一性并进行排序的原理:Comparable<T>或者Comparator<T>

1)如果集合元素自身具备比较性,并且没有比较器传入,按照元素比较方式进行排序2)如果集合元素自身不具备比较性,或者集合的构造函数有比较器传入,按照比较器的比较方式进行排序。

9、比较器Comparator<T>以及比较方法接口Comparable<T>

            1)Comparator<T>  java.util包  传入集合构造函数

int compare(T o1, T o2)//需要复写boolean equals(Object obj)//不需要复写
            2)Comparable<T>  java.lang包  集合元素需要实现此接口
int compareTo(T o)//将当前元素和o比较一般在创建类的时候,为了可以将其对象存到集合中,需要复写hashCode、equals、toString方法,并且需要实现Comparable<T>接口,复写compareTo方法。如果集合中泛型是T对象,那么集合只能存T对象。但是比较器,如果泛型是T对象,那么可以比较T或者其子类。



原创粉丝点击