Java数据结构的知识体系

Java数据结构的知识体系主要包括线性表,树,图,数组,集合,矩阵,排序,查询,哈希表,并将java的设计思想,方法及一些常用的算法,设计模式贯穿其中。
其中线性表,链表和哈希表示最为常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类,来实现基本的数据结构。这些类均在Java.util
包中。
Collection:
(1)List:
1.linkedList
2.ArrayList
3.Vector
 3.1 Stack
(2)Set
Map:
1.Hashtable
2.HashMap
3.WeakHashMap


1.Collection接口
接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些COllection允许有相同的元素,而另一些则不行。
一些能排序而另一些不行,Java SDK 不提供直接继承自COllection的类,JavaSDK提供的类都是继承自COllection的“子接口"如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的
Collection与传入的Collection有相同的元素。后一个构造函数运行用户复制一个Collection。
如何遍历Collection中的每一个元素?不论Collection的时间类型如何,它都支持一个iterator()的方法,该方法返回一个迭代器,使用该迭代器即可逐一访问Collection中的每一个元素。
2.List接口
接口List是有序的Collection,使用此接口能够精确地控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似与Java的数组。
与下面要提到的Set不同,List允许有相同的元素。出来具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口。与标准的Iterator接口相比,
ListIterator多了一些Add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
3.ArrayList类(非同步的)
arrayList类实现了可变大小的数组。它允许所有元素,包括null.
ArrayList没有同步,Size,isEmpty,get,set方法的运行时间为常数。但是add方法的开销为分摊的常数,添加n个元素需要O(n)的时间。其他方法的运行时间为线性。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。
这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义,当需要插入大量元素时,在插入请可以调用ensureCapacity方法来增加ArrayList的容量可以提高插入效率。
4.Vector类
Vector类非常类似于ArrayList类,但Vector是同步的,有Vector创建的Iterator,虽然与Arraylist创建的Iterator是同一接口,但是,因为
Vector是同步的,当一个Iterator被创建而且正在被使用时,另一个先从改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法将抛出ConcurrentModificationException异常,因此必须捕获异常。
5.Stack类
Stack类继承自Vector,实现了一个后进先出的堆栈。Stack类提供5个额外的方法,使得Vector得以被当作堆栈使用。有哦基本的Push和pop方法,还有peek方法得到栈顶的元素,
empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。


6.Set接口
Set接口是一种不包含重复元素呢的Collection,也就是说,人任意的两个元素e1和e2都有e1.equals(e2)=false关系,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能保护重复的元素。
在此需要注意,必须小心的操作可变对象(Mutable Object).如果一个Set中的可变元素改变了自身状态导致(Object.equals(Object)=true,将导致一些问题。
7.Map接口
Map接口没有继承与接口Collection,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。
Map接口提供3中集合的视图,Map的内容可被当作一组key集合,一组value集合,或者一组key-value映射。
8.hashtable类
Hashtable类继承与Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。添加数据使用put(key,value),取出数据使用get(key),
这两个基本操作的时间开学为常数。
Hashtable通过initial capacity和load factor两个参数来调整性能。通常默认的load factor 0.75较好的实现了时间和空间的均衡。
增大load factor可以节省空间,但相应的,查找时间将增大,这会影响get和Put这样的操作。
9.HashMap类
HashMap类与Hashtable类相似,不同之处在于HashMap是非同步的,并且允许null,即Null value和null key.但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销与
HashMap的容量成比例。因此如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设的过高,或者load factor设的过低。
10.WearkHashMap类
WearkHashMap是一种改进的HashMap,它对key实行"弱引用",如果一个key不再被外部所引用,那么该key可以被GC(垃圾回收器)回收。

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

你可能感兴趣的:(算法)