数组和集合小总结

来源:互联网 发布:剑雨江湖仙器进阶数据 编辑:程序博客网 时间:2024/05/16 19:43

数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型), 效率高,但容量固定且无法动态改变。

JAVA集合可以存储和操作数目不固定的一组数据。所有的JAVA集合都位于 java.util包中。 JAVA集合只能存放引用类型的数据,不能存放基本数据类型。而几乎所有的集合都是基于数组来实现的.  因为集合是对数组做的封装,所以,数组永远比任何一个集合要快, 但任何一个集合,比数组提供的功能要多 :

一:数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。  

二:一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。  

三:数组是一种可读/可写数据结构,没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方法,以只读方式来使用集合。该方法将返回一个集合的只读版本。

四:array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量


链表与数组从逻辑结构来看
1.数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。
2.链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素
从内存存储来看
1.(静态)数组从栈中分配空间,对于程序员方便快速,但是自由度小
2.链表从堆中分配空间,自由度大但是申请管理比较麻烦
从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反,如果需要经常插入和删除元素就需要用链表数据结构了。


Set是最简单的一种集合。存放的是对象的引用,集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了三个实现类:

HashSet:为快速查找设计的Set,存入HashSet的对象必须定义hashCode()。 HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 

TreeSet :保存次序的Set, 底层为树结构,TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。 

LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。


List的特征是其元素以线性方式存储,集合中可以存放重复对象。 

List:次序是List最重要的特点:它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推 荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元 素。 

ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历 ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。 

LinkedList :对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。


Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接kou,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。 

LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。 

TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。 

WeakHashMap:弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。 

IdentifyHashMap: : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。


在集合框架中,有些类是线程安全的,这些都是JDK1.1中的出现的。在JDK1.2之后,就出现许许多多非线程安全的类。

下面是这些线程安全的同步的类:

Vector:就比ArrayList多了个同步化机制(线程安全)。

Statck:堆栈类,先进后出。

Hashtable:比HashMap多了个线程安全。HashMap=>不同步、空键值、效率高、map接口;Hashtable=>同步、非空键值、效率略低、Dictionary抽象类。

Enumeration:枚举,相当于迭代器。

除了这些之外,其他的都是非线程安全的类和接口。

线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低。对于非线程安全的类和接口,在多线程中需要程序员自己处理线程安全问题。

0 0
原创粉丝点击