数据结构基础 ---- 数组的理解和实现(Java)
什么是数组
数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受n(n>= 1)个线性关系的约束,每个元素在n个线性关系中的序号i1, i2, ....., in称该元素的下标,可以通过下标访问该数据元素。数组可以看成是线性表的推广,其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型。(注:出自数据结构严蔚敏c语言版第二版第四章)
数组的存储方式
在一般情况下数组不做插入和删除操作,也就是说建立了数组,那么结构中的元素个数和元素之间的关系也就不再发生变动。所以采用顺序存储结构表示数组比较合适。当然,数组也可以采用链式结构来进行实现。
我们知道,从存储的角度来看,存储单元是一维的结构,而数组可能是多维的结构,那么用一组连续存储单元存放数组的数据元素也就有了次序约定问题。
int a[5];

当定义一个数组的时候a时,编译器根据指定的元素个数和元素类型来进行分配确定大小的存储空间。
对于二维数组,它在逻辑上是由行和列组成的。因此,我们可以将上面的二维数组 a 分为三层来理解。

但是这里有一个问题,那就是数组的存储空间在定义时已经确定,对于没有用到的存储空间,系统并不会收回,这就造成了空间浪费
动态数组
我们可以简单的手动实现一个动态数组,当数组中元素的数量是数组的容量时,使数组的容量扩容为之前的2倍。而当数组中元素个数是数组容量的四分之一时,让数组的容量缩容至二分之一。
代码实现:
package 数组和矩阵;
/**
* Java基于顺序表实现动态数组
* @author shanlei
*
* @param <E>
*/
public class DynamicArray<E> {
private E[] data; //存放元素
private int size; //数组中元素的个数
private static int startLength = 100; //数组默认的初始长度
public DynamicArray() {
this(startLength);
}
public DynamicArray(int length) {
this.startLength = length;
data = (E[]) new Object[startLength];
}
//判断数组是否为空
public boolean isEmpty() {
return size == 0 ? true : false;
}
//判断数组已满
public boolean isFull() {
return size == startLength ? true : false;
}
//获得数组中元素的个数
public int getSize() {
return size;
}
//向数组中添加元素
public void add(E e) {
if(size == data.length) {
changeSize(size * 2);
}
data[size] = e;
size++;
}
//设置指定位置元素的值
public E setElement(int index, E e) {
if(index < 0 || index > size - 1)
throw new IllegalArgumentException("set failed, index is illegal");
E old = data[index];
data[index] = e;
return old;
}
//获得指定位置的元素
public E getElement(int index) {
if(index < 0 || index > size - 1)
throw new IllegalArgumentException("set failed, index is illegal");
return data[index];
}
//查找元素在数组中的位置
public int find(E e) {
int i = 0;
while(i < size) {
if(e.equals(data[i])) return i;
else i++;
}
return -1;
}
//移除数组中指定的元素
public E remove(int index) {
if(index < 0 || index > size - 1)
throw new IllegalArgumentException("set failed, index is illegal");
E e = data[index];
for (int i = index; i < size - 1; i++) {
data[i] = data[i + 1];
}
size--;
if(size == data.length / 4 && data.length / 2 != 0) {
changeSize(data.length / 2);
}
return e;
}
//向数组指定位置中插入元素
public void insertElement(int index, E e) {
if(size == data.length) {
changeSize(size * 2);
}
size++;
for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
data[index] = e;
}
//移除数组中指定元素值的元素
public int removeElement(E e) {
int index = find(e);
if(index != -1) {
remove(index);
}
return index;
}
//扩容/增容方法
private void changeSize(int newSize) {
E[] newArr = (E[]) new Object[newSize];
for (int i = 0; i < size; i++) {
newArr[i] = data[i];
}
data = newArr;
newArr = null;
}
public static void main(String[] args) {
DynamicArray arr = new DynamicArray();
for (int i = 0; i < 7; i++) {
arr.add(i);
}
System.out.println("数组中元素个数为:" + arr.getSize());
arr.setElement(3, 55);
arr.setElement(4, 89);
System.out.println("第四个元素值为: " + arr.getElement(3));
System.out.println("数组中值为55的下标为:" + arr.find(55));
arr.remove(4);
System.out.println("数组中元素个数为:" + arr.getSize());
System.out.println("第五个元素值为: " + arr.getElement(4));
arr.insertElement(4, 46);
System.out.println("数组中元素个数为:" + arr.getSize());
System.out.println("第五个元素值为: " + arr.getElement(4));
arr.removeElement(46);
System.out.println("第五个元素值为: " + arr.getElement(4));
}
}
数据结构基础 ---- 数组的理解和实现(Java)的更多相关文章
- 算法与数据结构基础 - 数组(Array)
数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...
- day05<Java语言基础--数组>
Java语言基础(数组概述和定义格式说明) Java语言基础(数组的初始化动态初始化) Java语言基础(Java中的内存分配以及栈和堆的区别) Java语言基础(数组的内存图解1一个数组) Java ...
- Java基础——数组应用之StringBuilder类和StringBuffer类
接上文:Java基础——数组应用之字符串String类 一.StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和 ...
- Java基础——数组Array
一.数组基本概念 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组有三 ...
- <数据结构基础学习>(一)数组
一.数组基础 1.数组,即把数据码成一排存放. 数组优点:快速查询. 数组最好应用于“索引有语意”的情况,但并非所有有语意的索引都适用于数组,数组也可以处理“索引没有语意”的情况. 2.增.删.改.查 ...
- Java编程基础——数组和二维数组
Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...
- Java基础--数组(Arrays)
数组(Array),是多个相同类型数据按一定顺序排列 的集合,并使用一个名字命名,并通过编号的方式 对这些数据进行统一管理.本篇博客是对Java基础中的数组进行详细说明. 目录: 数组的概述 一维数组 ...
- 【搬砖】安卓入门(4)- Java开发编程基础--数组
05.01_Java语言基础(数组概述和定义格式说明)(了解) A:为什么要有数组(容器) 为了存储同种数据类型的多个值 B:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. ...
- JAVA基础——数组详解
学习JAVA中数组的使用 一.什么是数组? 问:编写代码保存 4 名学生的考试成绩. 答:简单啊,定义 4 个变量呗 问:那"计算全年级 400 名学生的考试成绩",肿么办 答: ...
随机推荐
- 二叉树垂直遍历 · Binary Tree Vertical Order Traversal
[抄题]: 给定二叉树,返回其节点值的垂直遍历顺序. (即逐列从上到下).如果两个节点在同一行和同一列中,则顺序应 从左到右. 给定一个二叉树 {3,9,20,#,#,15,7} 3 /\ / \ 9 ...
- c++静态变量与菲静态变量
刚开始用C++写程序,遇到了一个很奇怪的问题,就是在类定义的面定义了一个静态成员变量,但在使用时编译器报错称变量不是类的成员. 文件a.h内容: /**********************A.h* ...
- R学习笔记-安装R和RStudio,注意RStudio的版本需要与操作系统版本匹配
1.安装步骤:先安装R,再安装RStudio RStudio是R的集成开发工具,本身不带R环境. 2.从当前R的官网和RStudio下载的R和RStudio的版本分别为: A .For Windows ...
- NormalMap原理详细解析
NormalMap的实现标志着对渲染流水线的各个环节以及矩阵变化有了正确和深入的认识.这里记录一下学习过程,以及关于NormalMap的诸多细节. 刚开始想要实现NormalMap程序的时候,查阅的是 ...
- Java程序设计19——类的加载和反射-Part-A
1 本文概要 本章介绍Java类的加载.连接和初始化的深入知识,并重点介绍Java反射相关的内容.本章知识偏底层点,这些运行原理有助于我们更好的把我java程序的运行.而且Java类加载器除了根加载器 ...
- Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容
Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容 1.在应用中固定屏幕方向. 在AndroidManifest.xml的activity中加入: ...
- UITableView.separatorInset
[UITableView.separatorInset] separatorInset指定每行row之间的分隔线的长度,iOS7.0后提供,官方文档如下: 示例截图如下,分隔线没有紧贴着左右边界:
- Hadoop中Writable类之三
1.BytesWritable <1>定义 ByteWritable是对二进制数据组的封装.它的序列化格式为一个用于指定后面数据字节数的整数域(4个字节),后跟字节本身. 举个例子,假如有 ...
- WordPress 3.7.1-web截屏插件整合教程-Xproer.ScreenCapture
插件下载(PHP):wordpress 3.7.1, 说明:由于许多插件可能使用相同钩子,导致冲突,所以提供手支方式整合. 1.上传插件目录. 说明:WordPress 3.7.1 使用的是TinyM ...
- c++ vector反转reverse
template <class BidirectionalIterator> void reverse ( BidirectionalIterator first, Bidirection ...