标签:
---恢复内容开始---
集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有的不允许.
Java集合提供了一套设计良好的支持对一组对象进行操作的接口和类.Java集合类里面最基本的接口有:
I> Collection:代表一组对象,每一个对象都是它的子元素
II> Set:不包含重复元素的Cllection
III> List:有顺序的Collection,并且可以包含重复元素
IV> Map:可以把键(key)映射到值(value)的对象,键不能重复
集合类没有实现cloneable和serializable接口:
克隆(cloning)或者是序列化(serialization)的语义和含义是根据具体的实现相关的.因此,应该由集合类的具体实现来决定如何被克隆或者序列化.
iterator接口提供了很多岁集合元素进行迭代方法.每一个集合类都包含了可以返回迭代器实例的迭代方法.迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除.
Iterator和ListIterator的区比别:
I> Iterator可用来遍历Set和List集合,但是LisrIterator只能用来遍历List.
II> Iterator对集合只能是前向遍历,ListIterator既可以向前也可以向后.
III> ListIterator实现了Iterator接口,并包含了其他的功能,比如:增加元素,替换元素,获取前一个元素和后一个元素的索引,等等.
Iterator的安全失败是基于底层集合的拷贝,因此,它不受源集合上修改的影响.java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的.快速失败的迭代器会抛出ConcurrentModdificationException异常,而安全失败的迭代器永远不会抛出这样的异常.
HashMap和HashTable都实现了Map接口,因此很多特性非常相似,但是也有不同点:
I> HashMap允许键和值是null,而HashTable不允许键或值是null.
II> HashTable是同步的,而HashMap不是.因此,HashMap更适合与单线程环境,而HashTable适合与多线程环境.
IV> HashMap提供的可供应用迭代的键的集合,因此,HashMap是快速失败的.另一方面,HashTable提供了对键的枚举(Enumeration)
I> Array可以包含基本数据类型和对象类型,ArrayList只能包含对象类型.
II> Array大小是固定的,ArrayList的大小是动态变化的.
III> ArraryList提供了更多的方法和特性.比如:AddAll(),removeAll(),iterator()等.对于基本数据类型,集合使用自动装箱来减少编码的工作量.但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢.
ArrayList和LinkList都实现了List接口,它们有一下不同点:
I> ArrayList是基于索引的数据接口,它的底层是数组.它可以一O(1)的时间复杂度对元素进行随机访问.与此对应,LinkList是一元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素连接在一起,这种情况下,查找某个元素的时间复杂度是O(n).
II> 相对于ArrayList.LinkList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算或者更新索引.
III> LinkList比ArrayList更占内存,因为LinkList为每一个节点存储了两个引用,一个指向前一个元素,一个指向后一个元素.
Java提供了只包含一个compareTo()方法的Comparable 接口.这个方法可以给两个对象排序.具体说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象.
java提供了包含compare()和equals()两个方法的Comparetor接口.compare()方法用来给两个输入参数排序,返回负数,0,正数来表明第一个参数是小于,等于,大于第二个参数.equals()方法需要一个对象作为参数,它用来决定输入参数是否和Comparator相等.只有当输入参数也是一个Comparator并且输入参数和当前Comparator的排序结果是相同的时候,这个方法才返回true.
Priorty Queue是一个基于优先级堆的无界队列,它的元素是按照自然顺序排序的.在创建的时候,我们可以给他提供一个负责给元素排序的比较器.PriortyQueue不允许null值.因为它们没有自然顺序,或则说它们没有任何的相关联的比较器.最后,PriortyQueue不是线程安全的,入队和出队的书剑复杂度是O(log(n)).
有序数组最大的好处在于查找的时间复杂度是O(log(n)),而无序数组是O(n).有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾出位置,相反,无序数组的插入时间复杂度是常量O(1).
Enumeration速度是Iterator的2倍,同时占用更少的内存.但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被Iterator遍历的集合里面的对象.同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的.
HashSet是由一个hash表来实现的,因此,它的元素是无序的.add(),remove(),contains()方法的时间复杂度是O(1).
TreeSet是由一个树形的结构来实现的,它里面的元素是有序的.因此,add(),remove(),contains()方法的时间复杂度是O(log(n)).
标签:
原文地址:http://www.cnblogs.com/lrh-xl/p/5326782.html