java基础--集合对象数据结构

Collection接口

Collection是最基本的集合接口,由Collection派生出List和Set接口,通过iterator迭代器遍历集合中的对象。

List接口

List是有序的集合,可以有相同的元素,实现List的接口有LinkedList,ArrayList,Vector。

LinkedList类可以被用作堆栈、队列或双向列表,LinkedList没有同步方法,可以包含null。如果多个线程同时访问一个List,则必须自己实现访问同步。解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(...));

ArrayList类实现了可变大小的数组,允许包含null,不同步。ArrayList实例的容量会随着不断增加元素而自动增加,可以调用ensureCapacity方法来增加容量。

Vector类是同步的,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因为必须捕获该异常。

Set接口

Set是不包含重复元素的集合对象,Set最多有一个null元素。无序的。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。

Map接口

Map中不能包含相同的key,每个key只能映射一个value。

HashTable类实现了接口Map,任何非空的对象都可以作为key或value。由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个相同的对象,即obj1.equals(obj2)==true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同。如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。所以hashCode()方法和equals方法必须同时重写。HashTable是同步的。

HashMap类是非同步的,并且key和value都允许为空。

总结

  如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。

  如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。

  要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。

  尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值