java数据结构有哪几种,java数据结构有哪些?
如何解决写爬虫IP受阻的问题?立即使用。
本教程运行环境:windows7系统,java8版本8,DELL G3电脑。
Java常见数据结构
这八种数据结构有什么区别?
、数组
优势:
根据索引查询元素非常快;
通过索引遍历数组也很方便。
缺点:
数组的大小在创建后确定,不能扩展;
数组只能存储一种类型的数据;
添加和删除元素需要很长时间,因为必须移动其他元素。
、链表
书中755-79000这样定义了链表:
Java LinkedList类可以用代码的形式形象地表示链表的结构:
公共类链接列表{
瞬态节点优先;
瞬态NodeE last
私有静态类节点{
e项;
NodeE next
NodeE prev
节点(上一个节点,元素,下一个节点){
this.item=element
this.next=next
this.prev=prev
}
}
}这是一个双向链表。当前元素项既有prev又有next,但第一个的prev为空,最后一个的next为空。如果是单向链表,只有next,没有prev。
因为链表不必按顺序存储,所以在插入和删除时可以达到O(1)的时间复杂度(只需要再次指向引用,不需要像数组一样移动其他元素)。此外,链表还克服了数组必须事先知道数据大小的缺点,实现了灵活的动态内存管理。
优势:
不需要初始化容量;
您可以添加任何元素;
您只需要在插入和删除时更新引用。
缺点:
包含大量引用,占用内存空间大;
查找元素需要遍历整个链表,需要时间。
、栈
堆栈就像一个水桶,底部是密封的,顶部是敞开的,水可以进出。用过水桶的朋友应该明白这个道理:先进去的水在桶底,后进去的水在桶顶;进去的水先倒出来,先进去的水后倒出来。
同样,堆栈按照“后进先出”和“先入后出”的原则存储数据。第一个插入的数据被推到堆栈的底部,后面插入的数据在堆栈的顶部。读取数据时,从栈顶依次读取。
、队列
队列就像一段水管,两头都是敞开的。水从一端进入,然后从另一端出来。先进的水先出来,进去的水后出来。
和水管不同,队列定义了两端,一端叫队列头,另一端叫队列尾。只有删除操作(出列)允许在队列的头部,插入操作(入队)允许在队列的尾部。
、树
树是一种典型的非线性结构,是由n(n0)个有限节点组成的层次集合。
之所以称之为“树”,是因为这种数据结构看起来像一棵倒置的树,只不过根在上面,叶子在下面。树形数据结构具有以下特征:
每个节点只有有限的子节点或没有子节点;
没有父节点的节点称为根节点;
每个非根节点只有一个父节点;
除了根节点之外,每个子节点都可以分成多个不相交的子树。
下图显示了树的一些术语:
基于二叉查找树的特点,与其他数据结构相比,其优势在于查找和插入的时间复杂度较低,为O(logn)。如果要从上图中找到五行,就要从根节点7开始,5一定在7的左边,找到4,那么5一定在4的右边,找到6,那么5一定在6的左边,找到了。
理想情况下,通过BST搜索节点,需要检查的节点数量可以减半。
平衡二叉树:当且仅当任一节点的两个子树之间的高度差不大于1时,才是二叉树。前苏联数学家Adelse-Velskil和Landis在1962年提出的高度平衡二叉树,根据科学家的英文名字也叫AVL树。
平衡二叉树本质上是一个二叉查找树。但是,为了限制左右子树的高度差,避免倾斜的树趋向于线性结构演化的情况,二叉查找树中每个节点的左右子树都受到限制。左右子树的高度差称为平衡因子,树中每个节点的平衡因子的绝对值不大于1。
二叉树平衡的难点在于删除或添加节点时如何保持左右平衡。
Java中最常见的平衡二叉树是具有红色或黑色节点的红黑树,二叉树的平衡由颜色约束来维持:
1)每个节点只能是红色或黑色。
2)根节点是黑色的
3)每个叶节点(NIL节点,空节点)是黑色的。
4)如果一个节点是红色的,它的两个子节点都是黑色的。也就是说,两个相邻的红色节点不能出现在一条路径上。
5)从任何节点到它的每个叶子的所有路径包含相同数量的黑色节点。
、堆
堆可以看作一棵树的数组对象,它具有以下特征:
堆中节点的值总是不大于或不小于其父节点的值;
总是堆砌一个完整的二叉树。
根节点最大的堆称为最大堆或大根堆,根节点最小的堆称为最小堆或小根堆。
在线性结构中,数据元素满足唯一的线性关系,每个数据元素(除了第一个和最后一个)都有唯一的“前任”和“继任者”;
在树形结构中,数据元素之间有明显的层次关系,每个数据元素只与上层的一个元素(父节点)和下层的几个元素(子节点)相关。
在图结构中,节点之间的关系是任意的,并且图中的任意两个数据元素可能是相关的。
、哈希表
哈希表,也称为哈希表,是一种可以通过键值直接访问的数据结构。它最大的特点是可以快速查找、插入和删除。
array最大的特点就是容易找到,但是很难插入和删除。相反,链表很难找到,但很容易插入和删除。哈希表完美的结合了两者的优点,Java的HashMap也加入了tree的优点。
哈希函数在哈希表中起着重要的作用。它可以将任何长度的输入转换为固定长度的输出,即哈希值。哈希函数使数据序列的访问过程更快、更有效。通过哈希函数,可以快速定位数据元素。
如果关键字是k,它的值存储在hash(k)的存储位置。所以不需要遍历就可以直接得到k对应的值。
任何两个不同的数据块都极不可能有相同的hash值,也就是说,对于一个给定的数据块,要找到具有相同hash值的数据块是极其困难的。再者,对于一个数据块来说,即使只改变了其中的一位,其hash值的变化也会非常大——,这就是Hash的值!
虽然可能性极小,但还是会发生。如果哈希冲突,Java的HashMap会在数组的相同位置添加一个链表。如果链表的长度大于8,就会转换成红黑树进行处理。3354这就是所谓的拉链方法(数组链表)。
有关编程的更多信息,请访问:编程视频!以上是java常用数据结构的详细介绍。更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。