java常用的数据结构
一 集合框架主要就是Collection和Map:
1、Collection包含了List和Set两大分支。
(1)List是一个有序的集合,每一个元素都有它的索引。第一个元素的索引值是0。List的实现类有ArrayList,LinkedList, Vector, Stack。
(1)ArrayList
ArrayList是一个动态数组,它允许任何符合规则的元素插入包括null。每一个ArrayList都有一个size=10,在每次向容器中增加元素的同时都会进行容量检查,一旦发现容量不足,会自动扩充容量,新的大小是原有容量的1.5倍。
假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10 (如下图一);之后扩容会按照1.5倍增长。也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15(如下图二);当添加第16个数据时,继续扩容变为15 * 1.5 =22个
ArrayList擅长于随机访问。同时ArrayList是非同步的。
(2)LinkedList
ArrayList是一个动态数组,而LinkedList是一个双向链表。所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。
LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。
与ArrayList一样,LinkedList也是非同步的。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: List list = Collections.synchronizedList(new LinkedList(...));
如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表数据结构了。
(3)Vector
与ArrayList相似,Vector也是动态数组,但是Vector是同步的,所以说Vector是线程安全的动态数组,由于线程的同步肯定要影响性能,所以说ArrayList的性能比Vector好。
Vector扩容的时候会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间,开发的时候如果是对性能,内存空间要求高那就用arrayList,如果是对安全要求高就用Vector
(4)Stack
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
(2)Set是一个不允许有重复元素的集合。Set的实现类有HastSet和TreeSet。
* HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;
* LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;
* TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。
2、Map是一个映射接口,即key-value键值对。Map中的每一个元素包含“一个key”和“key对应的value”。key不能相同,value可以相同
HashTable与HashMap
相同点:
(1)都实现了Map<K,V>, Cloneable, Serializable 接口。
(2)都是存储"键值对(key-value)"的散列表,而且都是采用拉链法实现的。
不同点:
(1)同步性:HashTable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 。
(2)对null值的处理:HashMap的key、value都可为null,HashTable的key、value都不可为null 。
(3)基类不同:HashMap继承于AbstractMap,而Hashtable继承于Dictionary。
(4)支持的遍历种类不同:HashMap只支持Iterator(迭代器)遍历。而Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历。