一、集合接口
Collection:public interface Collection<E> extends Iterable<E> ;
List:public interface List<E> extends Collection<E>;
Set:public interface Set<E> extends Collection<E>;
接口 | 描述 |
Collection | 操作对象组,位于类集层次结构顶层 |
List | 扩展Collection处理序列 |
Set | 扩展Collection处理集合,集合必须包含唯一元素 |
二、Collection接口
它是构造类集框架的基础,所有的类集都要实现该接口,它声明所有类集都将拥有的核心方法。
方法 | 描述 |
boolean add(Object obj) | 将obj加入到调用类集中。如果obj被加入到类集中了,则返回true;如果obj已经是类集中的一个成员或类集不能被复制时,则返回false |
boolean addAll(Collection c) | 将c中的所有元素都加入到调用类集中,如果操作成功,返回true,否则为false |
void clear() | 删除类集中的所有元素 |
boolean contains(Object obj) | 如果obj是调用类集的一个元素,返回true,否则返回false |
boolean containsAll(Collection c) | 如果类集中包含c中所有元素,返回true;否则返回false |
boolean equals(Object obj) | 如果类集与obj相等,返回true |
int hashCode() | 返回类集的哈希值 |
boolean isEmpty() | 类集为空,返回true |
Iterator iterator() | 返回类集的迭代程序 |
Boolean remove(Object obj) | 从类集中删除obj实例,如果删除成功,返回true |
Boolean removeAll(Collection c) | 从类集中删除c的所有元素 |
Boolean retianAll(Collection c) | 删除类集中除了包含在c中的元素之外的全部元素 |
int size() | 返回类集中元素的个数 |
Object[] toArray() | 返回类集中所有元素组成的数组 |
Object[] toArray(Object array[]) | 返回一个数组,该数组仅仅包含了那些类型与数组元素类型匹配的类集元素 |
三、List(列表)接口
List中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,如通过list.get(i)方式来获得List集合中的元素。
四、Set(集合)接口
Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对象按特定方式排序,例如TreeSet类,它可以按照默认排序,也可以通过实现java.util.Comparator<Type>接口来自定义排序方式。
五、List接口实现子类
1.AbstractList
实现List接口的抽象类,定义了一些子类公用的方法实现
2.Vector
AbstractList的子类,数组队列,线程安全,数组增长(1倍大小),访问效率高,但插入和删除(非末尾元素)效率低(因为插入和删除都要移动操作位置后面的元素)。
3.ArrayList
AbstractList的 子类,数组队列,线程不安全,数组增长(50%大小),访问、插入、删除效率同vector。
4.AbstractSequentialList
AbstractList的抽象子类,此实现不支持添加。子类必须实现抽象方法listiterator()。
5.Stack
Vector的子类,基于数组实现后进先出(LIFO)的对象堆栈,线程安全,提供了pop和push操作。
6.LinkedList
AbstractSequentialList的子类,双向链,线程不安全,访问效率低,插入和删除效率高(只需要记录前一个元素和后一个元素,无需移动元素),可以被当作堆栈、队列或双端队列进行操作。
六、Set接口实现子类
1.SortedSet
是个接口,它里面的(只有TreeSet这一个实现可用)中的元素一定是有序的,可以按照元素的自然顺序(参见 Comparable)进行排序, 或者按照创建有序集合时提供的 Comparator进行排序,要采用此排序,要满足以下条件,插入有序集合的所有元素都必须实现 Comparable 接口(或者被指定的 Comparator 所接受),另外,所有这些元素都必须是可相互比较的:e1.compareTo(e2)(或 comparator.compare(e1, e2))对于有序集合中的任意元素 e1 和 e2 都不能出 ClassCastException,试图违反这些限制将导致违反规则的方法或者构造方法调用抛出 ClassCastException。
2.HashSet
哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放
3.TreeSet
是SortedSet的子类,提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。
七、Map(映射)接口
是一种把键和值对象进行关联的容器,类比Collection,可以这样说:Collection对象中某个值的ID是它在容器中的索引值,而在Map中,某个值的ID是它对应的键。这样我们使用Map时就不用局限于int型的索引值,可以用任何类型的对象作索引。正是由于Key的索引特性,Map中不允许有同值的Key存在。Map在处理相同的Key时,将新值存入,旧值被替换并返回。
八、Map接口实现子类
1.HashMap
将键的哈希值作为内存索引依据,内部实现是一个适当长度的链式数组,由Key的Hash值对应数组下标,再间接对应内存,是一种比较高效的存取方式。Key的hashCode()相同的情况下,放在同一个单项链表结构中。
2.HashTable
HashTable和HashMap采用相同的存储机制,二者的实现基本一致
3.TreeMap
采用树型储存结构按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。内部实现是一颗二叉排序树,其中序遍历结果为递增序列。所以要求他的Key必须是Comparable或者创建TreeMap的时候指定Comparator。当Key实现Comparable<E>接口时,必须实现comparaTo(E e)方法,当使用外部比较器(Comparator<T>)时,需实现Comparator<T>的compare(T t1, T t2)方法。
4.HashTable和HashMap区别
- Hashtable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样
- Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以)
- 因为线程安全的问题,HashMap效率比HashTable的要高
- Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式
- 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值
- Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数
九、Set和Map的联系
HashSet和TreeSet,其内部实现是一个Map,它的元素就相当于Map中的Key,而Value是一个Object常量(详见HashSet和TreeSet的源码)
十、list、set、map的比较
list:有序,可重复,善于随机访问、删除和插入。
set:无序,不能重复,善于比较和查询对象。(这里的无序是指当读取时不是按插入的顺序,但是它是按某种顺序来排序的,所以运行几次出来的顺序都是一样的)
map:映射,相当于小型数据库,键相当于数据库的主键(只有一个),值相当于整条数据,方便我们根据键访问
十一、各实现类使用
未完待续