Java 集合类

一、Java集合类继承层次

Collection

|----List

|     |----LinkedList

|     |----ArrayList

|     |----Vector

|           |----Stack

|----Set


Map

|----HashTable

|----HashMap

|----WeakHashMap


二、Collection接口

    Collection接口是最基本的集合类接口。一个Collection表示一组Objects,即Collection的元素Elements。

    实现Collection接口的类必须提供两个标准的构造函数。一个是无参构造函数,另一个即时所谓的复制构造函数。

    Java SDK提供的派生自Collection接口的是两个子接口:List和Set。


三、List接口

    List接口是有序的Collection。该接口能精确控制每个元素的插入位置。用户可以使用索引(类似于下表)来访问List中的元素,类似于数组。

    实现List接口的类有LinkedList、ArrayList、Vector、Stack


四、LinkedList类

    LinkedList类实现了List接口,允许插入null元素。

    LInkedList是非同步的(unsynchronized),如果多个线程访问同一个LinkedList,则需要自己做线程同步。一种解决办法是在创建List时构造一个同步的List:

    List list = Collections.synchronizedList(new LinkedList(...));


五、ArrayList类

    ArrayList实现了可变大小的数组,允许所有的元素(包括null)。

    与LinkedList一样,ArrayList也是非同步的

 

六、Vector类

    Vector类与ArrayList类相似,但是,Vector是同步的。由Vector创建的iterator在使用时,如果另一个线程改变了Vector的状态,比如进行了插入、删除操作,这时调用iterator的方法将会时将会抛ConcurrentModificationException异常,程序中要捕获该异常。


七、Stack类

    Stack类继承自Vector,实现了一个后进先出的堆栈。


八、Set接口

    Set接口是一种不包含重复元素的Collection接口。

    Set最多有一个null元素。


九、Map接口

    Map接口没有继承自Collection接口。Map提供key到value的映射,功能类似于C++的STL中的关联容器Map。

    Map提供3中集合的视图。Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。


十、HashTable类

    HashTable类实现了Map接口,实现了一个key-value映射的哈希表。任何非空的对象都可以作为key或value。

    由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现

hashCode和equals方法。hashCode和equals方法继承自根类Object,如果用自定义的类当作key的话,要相当小

心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两

个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致

操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。

    如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免

这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。

  Hashtable是同步的。



十一、HashMap类

    HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和nullkey。,但是将

HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因

此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。


十二、WeakHashMap类
  WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

十三、相互之间的区别

1、Vector与ArrayList之间。

1)Vector是线程同步的,而ArrayList则不是。如果不使用多线程,则使用ArrayList效率较高

2)自增长时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%。如果在集合中使用数据量比较大的数据,用vector有一定的优势。

3)Vector与ArrayList底层采用数组的形式来实现。随机查找速度快,插入删除的速度慢。查找数据的算法复杂度都是0(1)。插入或删除元素的算法复杂度为0(n)。


2、ArrayList与LinkedList时间。

1)ArrayList底层采用数组的形式实现,LinkedList底层采用双向链表的形式实现。因此LinkedList对随机插入或删除速度快,而随机访问的速度相对较慢。


3、HashTable与HashMap之间

1)HashTable是同步的,HashMap是非同步的。

2)HashMap允许以null作为其键或值,而HashTable则不允许。


十四、总结
1)如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
2)如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
3)要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
4)尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。

5)注意:虽然集合号称存储的是 Java 对象,但实际上并不是真正将 Java 对象放入 Set 集合中,只是在 Set 集合中保留这些对象的引用而言。也就是说:Java 集合实际上是多个引用变量所组成的集合,这些引用变量指向实际的Java 对象(类似于C/C++中只存储指针,而不是存储指针指向的对象)。Java数组也是同样的道理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值