简单的动态网站java,Java实践:一个简单的动态数组实现
一个简单的动态数组实现
基于数组实现 添加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实践:一个简单的动态数组实现相关推荐
- java简单编译器源代码_25行代码实现一个简单的编译器
起因 <25行JavaScript语句实现一个简单的编译器>实现的是一个简单到不能再简单的玩具的玩具,他的魔法是函数式编程简化了js代码.java 8提供了函数式编程的支持,昨晚脑子抽风突 ...
- JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...
用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...
- JAVA编写的一个简单的Socket实现的HTTP响应服务器
JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了. package test.io;import java.net.*; import java.io ...
- 用java设计实现一个简单的动作冒险类游戏
用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...
- java设计游戏_用java设计实现一个简单的动作冒险类游戏
用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...
- java Swing 做一个简单的输入文本框
java Swing做一个简单的文本输入框, 新建一个SwingDemo类: // //java swing做一个简单的文本框 //Created by lee_1310 on 2019.03.29 ...
- java动作游戏教程_用java设计实现一个简单的动作冒险类游戏
用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...
- 用Java语言定义一个整数定义的数组,求奇数个数和偶数个数。
##[Java] 定义一个整数定义的数组,求奇数个数和偶数个数. /*作者:龙蝶 *日期:2020年4月4日 */public clsss Array{public static void main( ...
- java仿真软件_一个简单的Java仿真程序
这是一个简单的仿真程序: 在这个仿真程序中,花园委员会都希望了解每天通过大门进入公园的总人数.每个大门都有一个十字 转门或某种其他形式的计数器,并且任何一个十字转门的计数器递增时,就表示公园中的总人数 ...
- java 框架 例子_如何设计Java框架? –一个简单的例子
通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习. 你可能对框架如何工作感到好奇? 这里将通过一个简单的框架示例来说明框架的思想. 框架目标 首先,为什么我 ...
最新文章
- 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
- mac 下用 brew 安装mongodb
- 计算机二级考试答题无法启动ppt,计算机二级考试中操作题常见问题之[演示文稿]...
- Poisson方程五点差分格式例题及解答
- html界面选择按钮没法取消,如何使用JavaScript取消选择按钮
- 如何从一行输入的字符串中基于空格切割出单词
- 原型模式 java 深浅_java学习笔记之原型模式及深浅拷贝
- 物流行业企业报表开发指南
- Codeforces Round #226 (Div. 2)
- layui表格边框_layui怎么固定表格的表头
- IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比
- excel vba系统下载_作品分享:《Excel VBA实用程序集(第2版)》下载
- 通信原理基础概念概述
- 《设计心理学》读书摘要
- PMO如何选拔和培养项目经理?
- 计时器操作--打点计时器
- 关联规则-策略挖掘中必不可少的算法
- stm8s003中串口中断问题
- 做机器人开发,你一定绕不开的模块!
- Cerebral Cortex:初为人父者竟然出现纵向灰质皮层体积减少?两个国际样本提供了这样的证据...
热门文章
- java 数组大数乘法_java – 在数组中查找3个数字的最大乘积
- JMS学习(java)
- java接口回调学习
- windows卸载qt_如何在Qt中显示一个窗口并在关闭后立即将其删除?
- linux乱码的文件怎么删除,如何删除Linux的乱码文件
- aix oracle 10.2.0.1 升级 10.2.0.4,install oracle 10r2 for aix
- android消息队列模型,Android 消息队列机制
- python 编程提高效率_15 个提高效率的 Python 编程技巧
- c语言学习-编程实现以下功能,读入两个数(d1,d2)和一个运算符(o),计算d1 o d2的值
- pythons实现信号分帧