一个简单的动态数组实现

基于数组实现 添加10w的容量 在删除 所有 容量 平均是 0.4秒 这个效率是可观的 下面来一起看看代码package com.array;

import java.util.List;

import java.util.Random;

/**

*

* @author XiaoTian

* @date 2018-08-08

*/

//基于动态数组的实现 E 是泛型

//借用了一下 Java中的ArrayList的代码

//研究源码也是一种乐趣

//还能让我们技术有所提高

public class ArrayList implements java.io.Serializable{

/**

* 初始容量

*/

private static final int DEFAULT_CAPACITY = 10;

/**

* 用于空实例的共享空数组实例。

*/

transient Object[] EMPTY_ELEMENTDATA = {};

/**

* 数组缓冲区,其中存储ArrayList的元素。

* ArrayList的容量是这个数组缓冲区的长度。

*/

transient Object[] elementData;

/**

* 用于默认大小的空实例的共享空数组实例。

*/

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

/**

* 大小

*/

private int size;

/**

* 默认为空

*/

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

/**

* 自定义空间大小

* @param initialCapacity

*/

public ArrayList(int initialCapacity) {

if (initialCapacity > 0) {

this.elementData = new Object[initialCapacity];

} else if (initialCapacity == 0) {

this.elementData = EMPTY_ELEMENTDATA;

} else {

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

}

}

public int size() {

return size;

}

/**

* 添加一个元素 元素位置是最后

* @param e

*/

public void add(E e) {

ExtendElement(size + 1);

this.elementData[size++] = e;

}

/**

* 在头部添加元素

* @param e

*/

public void addHead(E e) {

this.elementData[0] = e;

}

/**

* 扩展元素

*/

private void ExtendElement(int size) {

//容量

if(this.elementData.length == 0) {

elementData = new Object[DEFAULT_CAPACITY];

}else if(this.elementData.length < size) {

EMPTY_ELEMENTDATA = elementData;

//获取当前容量

int oldCapacity = elementData.length;

//扩展容量 i + i >> 1 就是 i的1.5倍

int newCapacity = oldCapacity + (oldCapacity >> 1);

elementData = new Object[newCapacity];

//1.源数组 2.源数组要复制的起始位置 3.目的数组 4.目的数组放置的起始位置 5.复制的长度

/**

* 调用 System的静态方法 arraycopy() 进行数组拷贝

* 标识为native意味JDK的本地库

* 如果频繁扩容会降低ArrayList的使用性能

* 赋值过程

*/

System.arraycopy(EMPTY_ELEMENTDATA,0,elementData,0,size-1);

}

}

/**

* 删除一个元素

*/

public E remove(int index) {

rangeCheck(index);

E oldValue = elementData(index);

int numMoved = size - index - 1;

if (numMoved > 0)

//index + 1 是当前 index 下一个 之 赋给 index 就全部替换了

System.arraycopy(elementData, index+1, elementData, index,

numMoved);

elementData[--size] = null; // 清楚地让GC完成它的工作

//判断容量是否是当前的1/4 是就 缩容 不要浪费不必要的内存空间

ShrinkageCapacity();

return oldValue;

}

/**

* 删除最后一个

* @return

*/

public E removeLast() {

return remove(this.size - 1);

}

/**

* 判断是否大于size

* @param index

*/

private void rangeCheck(int index) {

if (index >= size)

throw new IndexOutOfBoundsException(outOfBoundsMsg(index));

}

//输出 Index 和 Size

private String outOfBoundsMsg(int index) {

return "Index: "+index+", Size: "+size;

}

/**

* 获取元素

* @param index

* @return

*/

public E get(int index) {

rangeCheck(index);

return elementData(index);

}

/**

* 查询当前元素的值

* @param index

* @return

*/

@SuppressWarnings("unchecked")

E elementData(int index) {

//获取索引位置的元素

return (E) elementData[index];

}

/**

* 缩容

* @param args

*/

public void ShrinkageCapacity() {

if(size == elementData.length / 4 && elementData.length / 2 != 0) {

EMPTY_ELEMENTDATA = elementData;

//缩二分之一

int oldCapacity = elementData.length / 2;

elementData = new Object[oldCapacity];

System.arraycopy(EMPTY_ELEMENTDATA,0,elementData,0,size-1);

}

}

//测试

public static void main(String[] args) {

long then = System.currentTimeMillis();

ArrayList arrayList = new ArrayList<>();

Random random = new Random();

for (int i = 0; i < 100000; i++) {

arrayList.add(random.nextInt());

}

for (int i = 0; i < 99999; i++) {

arrayList.remove(0);

}

long now = System.currentTimeMillis();

System.out.println("Elapsed time:" + (now - then)+" 毫秒");

}

}

这是运行上面代码的时间 每个人的机器不一样运行的效果也不一样 仅供参考

相关推荐:

简单的动态网站java,Java实践:一个简单的动态数组实现相关推荐

  1. java简单编译器源代码_25行代码实现一个简单的编译器

    起因 <25行JavaScript语句实现一个简单的编译器>实现的是一个简单到不能再简单的玩具的玩具,他的魔法是函数式编程简化了js代码.java 8提供了函数式编程的支持,昨晚脑子抽风突 ...

  2. JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...

    用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...

  3. JAVA编写的一个简单的Socket实现的HTTP响应服务器

    JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了. package test.io;import java.net.*; import java.io ...

  4. 用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  5. java设计游戏_用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  6. java Swing 做一个简单的输入文本框

    java Swing做一个简单的文本输入框, 新建一个SwingDemo类: // //java swing做一个简单的文本框 //Created by lee_1310 on 2019.03.29 ...

  7. java动作游戏教程_用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  8. 用Java语言定义一个整数定义的数组,求奇数个数和偶数个数。

    ##[Java] 定义一个整数定义的数组,求奇数个数和偶数个数. /*作者:龙蝶 *日期:2020年4月4日 */public clsss Array{public static void main( ...

  9. java仿真软件_一个简单的Java仿真程序

    这是一个简单的仿真程序: 在这个仿真程序中,花园委员会都希望了解每天通过大门进入公园的总人数.每个大门都有一个十字 转门或某种其他形式的计数器,并且任何一个十字转门的计数器递增时,就表示公园中的总人数 ...

  10. java 框架 例子_如何设计Java框架? –一个简单的例子

    通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习. 你可能对框架如何工作感到好奇? 这里将通过一个简单的框架示例来说明框架的思想. 框架目标 首先,为什么我 ...

最新文章

  1. 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
  2. mac 下用 brew 安装mongodb
  3. 计算机二级考试答题无法启动ppt,计算机二级考试中操作题常见问题之[演示文稿]...
  4. Poisson方程五点差分格式例题及解答
  5. html界面选择按钮没法取消,如何使用JavaScript取消选择按钮
  6. 如何从一行输入的字符串中基于空格切割出单词
  7. 原型模式 java 深浅_java学习笔记之原型模式及深浅拷贝
  8. 物流行业企业报表开发指南
  9. Codeforces Round #226 (Div. 2)
  10. layui表格边框_layui怎么固定表格的表头
  11. IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比
  12. excel vba系统下载_作品分享:《Excel VBA实用程序集(第2版)》下载
  13. 通信原理基础概念概述
  14. 《设计心理学》读书摘要
  15. PMO如何选拔和培养项目经理?
  16. 计时器操作--打点计时器
  17. 关联规则-策略挖掘中必不可少的算法
  18. stm8s003中串口中断问题
  19. 做机器人开发,你一定绕不开的模块!
  20. Cerebral Cortex:初为人父者竟然出现纵向灰质皮层体积减少?两个国际样本提供了这样的证据...

热门文章

  1. java 数组大数乘法_java – 在数组中查找3个数字的最大乘积
  2. JMS学习(java)
  3. java接口回调学习
  4. windows卸载qt_如何在Qt中显示一个窗口并在关闭后立即将其删除?
  5. linux乱码的文件怎么删除,如何删除Linux的乱码文件
  6. aix oracle 10.2.0.1 升级 10.2.0.4,install oracle 10r2 for aix
  7. android消息队列模型,Android 消息队列机制
  8. python 编程提高效率_15 个提高效率的 Python 编程技巧
  9. c语言学习-编程实现以下功能,读入两个数(d1,d2)和一个运算符(o),计算d1 o d2的值
  10. pythons实现信号分帧