类集框架

 

一、集合接口

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:映射,相当于小型数据库,键相当于数据库的主键(只有一个),值相当于整条数据,方便我们根据键访问

十一、各实现类使用

未完待续

 

 

 

 

转载于:https://my.oschina.net/kun123/blog/731645

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值