文章标题 Java 数组和集合

来源:互联网 发布:canvas数据插件 编辑:程序博客网 时间:2024/06/03 22:25

如果要比较Java的数组和集合类,我觉的可以从两方面来说:性能和数据类型
一、数组
1.Java数组是一个简单的先行序列的长度是固定的,并且同一数组中只能放同一种类型的数据。这种结构就使得数组的访问速度是非常快的。
2.我们在创建一个数组后,自动进行了初始化,初始化值为0(数值类型)、null(字符类型)、false(布尔类型)。
二、集合
1.早期的集合类型
在早期Java提供了四种集合类:Vector(适量)、BitSet(位集)、Stack(堆栈)以及Hashtable(散列表)。但是这些集合都有一个问题,就是我们保存进去的数据,会丢失数据类型的。最后为了解决这个问题,集合中实际容纳的数据类型为Object。
2.新集合
新的集合库分为成了两个明确的概念,集合(Collection)和映射(Map):
(1)集合(collection)
collection的两个子接口List和Set。List集合是区分顺序的,但是允许有重复的元素;Set集合是不区分顺序的,但是也不允许有重复的元素出现。
总的来说,Java API中所有的集合类,都是实现了Collection 接口。它的类继承结构如下:

接下来我们来说一下List和Set的衍生类。
(2)List常用的衍生类
1)Vector:Vector是基于Array实现的,也就是在封装了Array的基础上提供了一些Array不具备的功能给开发者使用,所以它的性能也是不可能超越Array的。但是Vector的优点就是:Vector是线程安全的,这个也是Vector跟ArrayList最大的区别。
在这里,我解释一下同步和非同步的区别:比如,由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,由于Vector是线程同步的,当一个Iterator被创建并正在使用中,另一个线程改变了当前Vector的状态(比如删除或者添加了某些元素),这是调用Iterator的方法将会报异常,并且必须要捕捉该异常。
2)ArrayList:跟Vector一样也是基于Array的,不同的是ArrayList不是线程同步的,所以在性能上是优于Vector的,但是如果运行到多线程环境中,则需要开发者自己去管理线程同步问题了。
3)LinkedList:跟前两种List不同的是,LinkedList不是以Array为基础的,所以它的性能并不受Array限制。LinkedList是链表结构的:它的每一个节点都包含两方面的内容:1,节点本身的数据(data);2,下一个节点的信息(nextNode)。所以对LinkedList做添加、删除的时候就不用像前两种List一样,必须进行大量的数据移动。只要更改nestNode相关信息就可以了。这就是LinkedList的优势。
4)Stack :Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
5)总结:1.所有的List都可以有重复的元素;
2.所有的List都允许有null元素;
3.基于Array的Vector和ArrayList适合查询操作,而LinkedList适合做添加、删除操作。
(3)Set常用的衍生类
1)HashSet:hashSet的存储方式是把HashMap的Key值作为Set的对应存储项,看看HashSet的add(Object obj)方法就知道了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
这也是为什么在Set中不能像在List中一样有重复项的根本原因,就像HashMap的Key不能有重复值一样。
2)LinkedHashSet:HashSet的子类,一个链表。
3)TreeSet:SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的,它是通过TreeMap(SortedMap)来实现的。并且从一个TreeSet对象获得的第一个迭代器将按升序提供对象。
4)总结:1.Set实现的基础是HashMap;
2.Set中的元素是不能重复的,如果用add来添加已经存在的对象,则会覆盖前面对的对象;
3.Set中是允许有一个NULL值的。
4.List和Set虽然实现自同一个Collection接口,但是它们的实现方式却大不一样。List大都是基于Array 实现的,而Set大都是基于HashMap实现的,这就决定了它们两个本质上的区别。
(4)映射(Map)
1)HashTable:继承Map接口,实现一个Key-Value映射的哈希表。Key不能为空。通过初始容量(initial capacity)和加载因子(load factor)两个参数来调整性能,通常缺省的加载因子=0.75时,能较好的实现时间和空间的均衡。由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode()和equals()。HashTable的所有方法都是线程同步的。
2)HashMap:继承Map接口,实现一个Key-Value映射的哈希表。Key可以为null。跟hashTable很类似,但是HashMap是非同步的。
3)WeakHashMap:是一种改进的HashMap,它对Key实行“弱引用”,如果一个key不再被外部引用,那么该key可以被GC回收。
4)TreeMap:继承Map接口,对象是按照升序排列的。
(5)常见的对比
1)Voctor和ArrayList的对比
2)ArrayList和LinkedList的对比
3)HashMap和HashTable的对比:参考http://blog.csdn.net/fujiakai/article/details/51585767
附加:所有集合都在va.util包里
参考文章:http://www.cnblogs.com/xiaohai2003ly/p/7207036.html,
http://blog.csdn.net/lyc89757/article/details/6930938

原创粉丝点击