一. 数组
相同类型元素的集合;在内存上给出了连续的空间。
相比较链表而言,优缺点:
优点:
1)查询速度快,因为数组是一块连续且大小固定的内存空间,查询某个元素只需要在某一块特定内存上查找;而链表是非连续的内存空间,通过指针关联前后顺序,链表查询元素的速度比较慢
缺点:
1)大小固定,不方便动态添加数据(动态添加或删除数据会影响大部分数组元素,效率较链表低);(链表可以动态添加,删除数据,效率高是因为链表中的数据通过指针前后关联,添加或删除某个元素只影响到相关联的前后两个元素)
java中的数组是定长的,无法动态增加长度。如果要扩充数组,只能通过重新定义数组,把旧数组内容拷贝到新数组中。
二. 栈
又名堆栈,它是一种运算受限的线性表;只能在表的一段进行插入和删除操作,这一端被称为栈顶;
栈是一种先进后出的数据结构。
三. 队列
队列和栈类似是一种线性表,区别是它允许在表的前端进行插入,在表的末端进行删除,是一种先进后出的线性表。
四. 链表
链表是一种物理存储单元上非顺序,非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列节点组成,链表中的每一个元素称为节点,节点可以在运行时动态生成,每个节点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域;与线性表操作相比,较为复杂。
优缺点:
优点:
向链表中添加或者删除元素的速度相对比较快,原因是链表是通过指针来进行操作,添加或者删除元素只会影响相关的前一个和或一个元素,而不会影响其他元素;而如果向数组中添加或者删除元素,会影响到整个数组中的大部分元素,例如要删除一个有10个元素的数组中的第三个元素,那么就要把数组中第4到第10个元素都左移一位。
缺点:
查询速度比较慢,由于链表是通过指针关联前后数据元素,查询某个元素的不如数组从某个连续内存上查询快。
------------------------------------------------------------------------------------------------------------------------------------------------------------
ArrayList和 LinkedList
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
总结:ArrayList内部是使用可増长数组实现的,所以是用get和set方法是花费固定时间的,但是如果插入元素和删除元素,除非插入和删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。
LinkedList是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近。但是插入和删除元素花费常数时间。
五. 树
实际应用中较少接触,概念为:
有且仅有一个特定的称为根(Root)的结点;当n>1时,其余结点可以划分为m(m>0)个互不相交的有限集T1、T2 、…、Tm,每个集Ti(1≤i≤m)均为树,且称为树T的子树(SubTree)。
六. 散列表
HashTable (哈希表)是Map接口下的一个实现类, 是一种特殊的线性表存储结构;以键值对的方式存储数据,其中键不能重复,值可以重复。
HashTable和 HashMap的主要区别是
1)HashTable是线程安全的 ,而HashMap是线程不安全的
2)HashMap允许空键值,HashTable不允许
七. 堆:
java中的堆是程序员用new能得到的计算机内存的可用部分。而数据结构的堆是一种特殊的二叉树(堆是一种树,相比较数组,堆的插入速度快,但是删除速度慢)。
数据结构中的堆是具有如下特点的二叉树:
1.它是完全二叉树,也就是说除了树的最后一层节点不需要是满的,其他的每一层从左到右都必须是满的。
2. 它常常用数组实现。
3. 堆中每一个节点都满足堆的条件,也就是说每一个关键字的值都大于或等于这个节点的子节点的关键字值。
八. 数组,list,set的互相转换:
1. 数组转换list
String array={"aaa","aaa","bbb"};
List list = Arrays.asList(array)
转换后list包含3个元素
2. list转set
接上例子:
HashSet hashset=new HashSet(list);
转换后,原来list中重复的元素会被去掉, hashset中只包含2个元素