【数据结构】之顺序表(Java语言描述)

  之前总结过使用C语言描述的顺序表数据结构。在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见【我的这篇文章】。

  在Java语言的JDK中,为我们提供了专门的顺序表的数据结构API—— ArrayList 。

  Java中的ArrayList的基本存储思路和C语言中的思路相似,即将所有元素存储在一个数组中,当数组中的元素个数达到某种标准时,就要扩容。由于顺序表中的其他操作在Java和C中的实现方式大同小异,因此,本文不再详细介绍这些操作,而是着重介绍Java中的顺序表扩容思想。

  Java中的扩容方式和C语言中的扩容方式有所不同,原因是C语言可以直接操作内存,而Java语言不能直接操作内存。

  C语言中的扩容操作是通过 realloc() 方法来实现的,realloc()方法的执行思路是:先计算得到扩容之后用户想要的容量,然后在内存中判断该数组当前已经占有的空间及其后与之相邻的空闲内存空间之和是否满足用户想要的扩容结果,如果满足,则在原来内存的基础上直接扩容,否则,才考虑重新选择一片连续的内存空间,重新创建数组,并将原数组中的所有数据都移植到新数组中去。通过上面的介绍可以看出,C语言中对于数组扩容的操作,并不是每一次都会重新分配内存空间。

  Java语言不像C语言,它不可以控制内存,因此,在Java语言中,要想对一个数组进行扩容操作,就必须要重新创建一个新的数组,并将原数组中的内容移植到新数组中。可见,单纯在数组扩容这一点上,Java的性能会略低于C语言。

  Java中ArrayList的扩容流程具体如下:

(1)判断是否需要扩充长度;
(2)如果需要扩充长度,则根据新的长度,判断新长度是否大于旧长度的1.5倍(即扩容是否超过一半);
(3)如果扩容超过一半,则直接扩充到新长度;否则扩充原来长度的一半;
(4)新建一个数组,长度定义为新长度;
(5)将旧数组中的数据都移动到新数组中,完成数组的扩容。
时间: 2024-08-24 17:52:44

【数据结构】之顺序表(Java语言描述)的相关文章

Java语言描述顺序表类,顺序表类的基本操作实现

数据结构(Java版)ch2 线性表的顺序存储(顺序表) 线性表的抽象数据Java接口描述如下: package ch2; /** * 线性表的抽象数据接口,用Java语言描述线性表的这些功能! * @author 房廷飞 * */ public interface IList { public void clear(); //将线型表置成空表 public boolean isEmpty(); //判断是不是空表 public int length(); //返回线性表的长度 public O

数据结构与问题求解-Java语言描述(第三版)

数据结构对程序的重要性不言而喻,用java语言来实现常见的一些数据结构,以及在相应数据结构上的操作对学习java的同学来说是必须掌握的. 本系列博文参考<数据结构与问题求解-Java语言描述(第三版)>来实现 在自己学习的过程中,更希望有机会与大家交流. PS :本人是菜鸟,只是用博客的方式激励自己.请轻喷.Fighting!

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Alpha-Beta剪枝

2014.07.08 22:43 简介: “搜索”与“剪枝”几乎是如影随形的.此处的“搜索”指的是带有回溯算法的深度优先搜索. 在之前的“Minimax策略”中我们给出了一个三连棋的程序,运行后你就知道计算一步棋要花多少时间. 为了计算最优的一步棋,我们可能需要递归9万多次.如果毫无疑问这种阶乘式的穷举过程必须通过剪枝来加速. 本篇介绍一种用于Minimax策略的剪枝思路——α-β剪枝. 剪枝的英语是pruning,所以不要想当然说成trimming. 图示: 在上一篇讲解Minimax策略的博

数据结构。顺序表

#include <stdio.h>#include <stdlib.h> #define LIST_INIT_SIZE 100#define LIST_INCREMENT 10typedef struct Point   //element type{    int x;    int y;}Point;typedef Point ElemType;typedef struct          //list type{    ElemType *elem;     //data

《数据结构与算法分析:C语言描述》复习——第六章“排序”——冒泡排序

2014.06.17 01:04 简介: 冒泡排序是O(n^2)级别的交换排序算法,原理简单,属于必知必会的基础算法之一. 思路: 排序要进行N轮,每一轮从尾部逐个向前扫描,遇到逆序对就进行交换.确保每一轮把最小的元素交换到前面去.这个过程好比水中的气泡向上飘,所以叫冒泡排序.代码非常简单,所以语言描述反而显得麻烦了. 实现: 1 // My implementation for bubble sort. 2 #include <iostream> 3 #include <vector&

Windows 已在 数据结构_顺序表.exe 中触发一个断点——new和delete注意事项

实现数据结构的顺序表的类时,输入,改,删,查都可以,但是最后析构函数时持续出错 错误提示"Windows 已在 数据结构_顺序表.exe 中触发一个断点" int *elem=new int(LIST_INIT_SIZE); if(!elem)cout<<"overflow"<<endl; if(leng>LIST_INIT_SIZE) cout<<"error"; else {    length=le

《数据结构与算法分析:C语言描述》复习——第八章“并查集”——并查集

2014.06.18 14:16 简介: “并查集”,英文名为“union-find set”,从名字就能看出来它支持合并与查找功能.另外还有一个名字叫“disjoint set”,中文名叫不相交集合.可能我们倾向于用最短的名字,所以就出现了“并查集”翻译为“disjoint set”的情况.并查集是一种树形结构,但与之前讲的树不同的是,这里的树节点只记录父节点,因此是一对一的,就可以用数组来表示并查集. 图示: 并查集可以认为是一个“森林”,也就是多棵树: 既然是并查集,先看看合并3和5之后结

《数据结构与算法分析:C语言描述》复习——第九章“图论”——无权值的最短路径问题

2014.07.04 18:24 简介: 给定一个有向图,你可以认为每条边长度都是1(所以叫无权值).下面的算法可以求出从特定的起点到终点的最短路径长度. 描述: 从起点出发,根据当前顶点出发的边进行广度优先搜索,直至找到终点即可.如果搜索结束了仍然没有找到终点,那么起点无法到达终点. 实现: 1 // A simple illustration for unweighted shortest path. Graph represented by adjacency matrix. 2 #inc

《数据结构与算法分析:C语言描述》复习——第五章“堆”——二叉堆

2014.06.15 22:14 简介: 堆是一种非常实用的数据结构,其中以二叉堆最为常用.二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序.我们关心的通常只有堆顶的元素,而整个堆则被封装起来,保存在一个数组中. 图示: 下图是一个最大堆: 实现: 优先队列是STL中最常用的工具之一,许多算法的优化都要利用堆,使用的工具就是优先队列.STL中的优先队列通过仿函数来定义比较算法,此处我偷懒用了“<”运算符.关于使用仿函数的好处,我之后如果有时间深入学习S