Java数据结构

数据结构(Data_Structure)是计算机存储、组织数据的方式.,是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
在Java的语言体系中按逻辑结构可以分为两大类:线性数据结构和非线性数据结构。

线性数据结构

线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构,是一个有序数据元素的集合。常见的有:一维数组,线性表,栈,队列,双队列,串.

一维数组

概念:当数组中每个元素都只带有一个下标时,称这样的数组为一维数组。
定义方式:类型标识符 数组名[常量表达式],如int a[10];

线性表

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

栈Stack

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
它最大的特点是"先进后出",跟队列相反.java.util.Stack。就实现了这用逻辑。而Java的Jvm里面也用的到了此种数据结构,就是线程栈,来保证当前线程的执行顺序。

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列在Java语言环境中是使用频率相当高的数据结构,所有其实现的类也很多来满足不同场景。如线程池,mq(Message Queue,消息队列),连接池等。

串:也称字符串,是由N个字符组成的优先序列。在Java里面就是指String,而String里面是由chat[]来进行储存。

非线性数据结构

非线性结构中各个数据元素不再保持在一个线性序列中,数据元素之间是一对多,或者是多对一的关系.常见的有:多维数组,集合,树,图,散列表(hash).

多维数组

每个元素下标值不止一个的数组;常见的有二维数组(又称之为矩阵),其中函数和列数相同的叫方阵对称矩阵a[i][j]=a[j][i];对角矩阵:n阶方阵主对角线外都是零元素.
定义:int [i][j];i行j列的整型数组.Java里面很少提供这样的工具类,而java里面tree和图底层的native方法用了多维数组来储存。

集合

由一个或多个确定的元素所构成的整体叫做集合。在Java里面可以去广义的去理解为实现了Collection接口的类都叫集合。其中,Map没有继承Collection接口,与Collection是并列关系,继承Map的类也是集合类.Collection有两个重要的子接口List和Set.

树形结构,是一种特殊的链形数据结构。最少有一个根节点组成,可以有多个子节点。树,显然是由递归算法组成。

特点:最顶层的即有且只有一个节点并且没有父节点的点是根节点;除了根节点,其它节点最少有一个直接父节点;每个节点可以有任意多个直接子节点.

分类: 自由树/普通树:对子节点没有任何约束。

二叉树:每个节点最多含有两个子节点的树称为二叉树。

一般二叉树:每个子节点的父亲节点不一定有两个子节点的二叉树成为一般二叉树。

java中数据结构重要吗 java数据结构是什么_java


完全二叉树:从左到右没有空节点的二叉树被称为完全二叉树;

java中数据结构重要吗 java数据结构是什么_java_02


满二叉树:所有的节点都是二叉的二叉树成为满二叉树。

java中数据结构重要吗 java数据结构是什么_线性表_03


二叉搜索树/BST:又称二叉排序树、二叉查找树。是有序的。要点:右子树节点的值都大于左节点和根节点的值。

二叉平衡树:二叉搜索树,是有序的排序树,但左右两边包括子节点不一定平衡,而二叉平衡树是排序树的一种,并且加点条件,就是任意一个节点的两个叉的深度差不多(比如差值的绝对值小于某个常数,或者一个不能比另一个深出去一倍之类的)。

为了实现,二叉平衡树又延伸出来了一些算法,业界常见的有AVL、和红黑算法,所以又有以下两种树:

AVL树:最早的平衡二叉树之一。应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树。

红黑树:通过制定了一些红黑标记和左右旋转规则来保证二叉树平衡。性质:①每个结点要么是红的,要么是黑的。②根结点是黑的。③每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。④如果一个结点是红的,那么它的俩个儿子都是黑的。⑤对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点

java中数据结构重要吗 java数据结构是什么_线性表_04


B-tree:又称B树、B-树。又叫平衡(balance)多路查找树。树中每个结点最多含有m个孩子(m>=2)。它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。

B+tree:又称B+。是B-树的变体,也是一种多路搜索树。

笔试题:前(根)序遍历(根左右),中(根)序遍历(左根右),后(根)序遍历(左右根),如以下所示

java中数据结构重要吗 java数据结构是什么_java_05


前序遍历:1,2,4,6,7,3,5

中序遍历:4,6,7,2,1,5,3

后序遍历:7,6,4,2,5,3,1

一般考逆推笔试题,知前中,求后或知中后,求前

树的总结:树在Java里面应用的也比较多。非排序树,主要用来做数据储存和展示。而排序树,主要用来做算法和运算,HashMap里面的TreeNode就用到了红黑树算法。而B+树在数据库的索引原理里面有典型的应用。

HASH(散列函数)

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

hashcode(哈希码)

哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。最大的特性是不同的对象,不同的值有可能计算出来的hashCode可能是一样的。

Hash表

Java中数据存储方式最底层的两种结构,一种是数组,另一种就是链表。而Hash表就是综合了这两种数据结构。如:HashTable,HashMap。这个时候就得提一下HashMap的原理了,默认16个数组储存,通过Hash值取模放到不同的桶里面去。(注意:JDK1.8此处算法又做了改进,数组里面的值会演变成树形结构。).哈希表具有较快(常量级)的查询速度,及相对较快的增删速度,所以很适合在海量数据的环境中使用。一般实现哈希表的方法采用“拉链法”,我们可以理解为“链表的数组”。

java中数据结构重要吗 java数据结构是什么_java_06


我们查看一下HashMap的原理,其实发现Hash很好的解决了单体应用情况下的数据查找和插入的速度问题。但是毕竟单体应用的储存空间是有限的,所有在分布式环境下,应运而生了一致性Hash算法。