package com.ct.array;
/**
* @author MoonMonster
* @version 创建时间:2015年10月21日 下午10:15:05
*/
public class Array {
//数组中元素个数
private int count = 0;
//初始容量大小
private int capcity = 16;
//增量,每次增加的比例
private double increment = 1.2;
//初始化数组
private Object[] src = new Object[capcity];
public Array() {
}
//自定义原始数组大小
public Array(int capcity) {
this.capcity = capcity;
}
// 增加
public void add(Object obj) {
//判断是否越界,如是,则扩充数组
if (count >= src.length) {
src = extend();
}
//将新增加的数据放在count处
src[count] = obj;
count++;
}
// 对数组的扩充
private Object[] extend() {
//扩充后的数组容量是旧的数组的increment倍
Object[] dest = new Object[(int) (src.length * increment)];
for (int i = 0; i < src.length; i++) {
dest[i] = src[i];
}
//返回扩充后的数组
return dest;
}
// 输出
public void print() {
for (int i = 0; i < count; i++) {
System.out.print(src[i] + " ");
}
System.out.println();
}
// 获得数组大小
public int size() {
return count;
}
// 插入
public void insert(int index, Object obj) {
if(count + 1 >= src.length){
src = extend();
}
//从最后一个元素开始,把前一个元素放到后一个位置来
for(int i=count; i>index; i--){
src[i] = src[i-1];
}
//将要插入的元素放在index处
src[index] = obj;
//在插入一个元素后,长度+1
count ++;
}
//替换index处的数据
public void replace(int index, Object obj){
src[index] = obj;
}
//删除index处的数据元素
public void delete(int index){
for(int i=index; i<src.length-1; i++){
src[i] = src[i+1];
}
count --;
}
//返回index处的数据
public Object get(int index){
return src[index];
}
}
测试类
package com.ct.array;
/**
* @author MoonMonster
* @version 创建时间:2015年10月21日 下午10:20:50
*/
public class Demo {
public static void main(String[] args) {
Array arr = new Array();
long t1 = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
arr.add(new Integer(i));
}
long t2 = System.currentTimeMillis();
System.out.println("耗时: " + (t2 - t1));
arr.insert(2, new Integer(123));
//删除
arr.delete(0);
//输出
arr.print();
//数组长度
System.out.println("数组的长度为: "+arr.size());
}
}
1. a.在定义增量时,不要定义成一个固定的值,每次扩充一定比例。
b.比例不是越大越好,也要考虑到内存问题,所以取个合适的值就行。
c.本来要测试取什么增量值最好,但每次测的结果误差太大,又不知道如何改,便放弃 了。
2. 在Array类中的src数组,可以定义成Object类型,那么便可使用全类型的数据,而不是某个固定下来的了。
3. 在删除和增加等方法中,不要使用临时数组来保存数据,那样会耗时耗内存。
4. 尽量不要在方法中出现重复的代码,例如add()和insert()方法中,都需要用到extend()方法中的代码,便可以提取出来封装为方法,易于修改和阅读。
5.先暂时写这几个方法,其他的例如查找是否存在某个数据或者某个数据有多少个,日后再说。
分享到:
相关推荐
纯手写 java 数组模拟链表约瑟夫环问题 有很大更改空间 仅供参考
Java实现自己的Json解析器——Json字符串解析原理 根据提取到的字符,转入不同的解析方法中, 例如字符是t,说明值可能是true,只需检查后面三个字符,如果是r、u、e,则可以直接返回true。 字符是f,说明值可能是...
java图书管理系统,不含数据库,自己数组手写,,,适合学生借鉴,,,有点乱,不过可以看,
介绍一下putVal()的5个参数:hash,hash值,就是通过这个值确定键值对放在数组哪个位置,公式是(数组长度-1)&hash。onlyIfAbsent,
* 在之前自定义的动态数组基础上完成队列,动态数组中要添加删除方法 * * @author 大刘 */ public class Queue { private ArraysList arraysList; /** * 入队方法 * @param e 入队元素 */ public void ...
一个基本的Java深度学习网络,用于攻击手写数字的MNIST数据集,但可以轻松自定义用于其他目的。 实现净形状配置,二次熵和交叉熵成本函数,神经元中的S形函数,一些基本的自适应学习率函数,迷你批处理选项...使用可...
数组是最基本的数据结构,通过创建动态数组我们可以不再考虑必须为数组赋值得问题我们可以按自己的需求动态获取空间。 在此基础上我们可以实现队列和栈的应用` 将这个类用泛型标记表示可以创建任意类型集合 public ...
java lru leetcode Do not go gentle into that good night 说明 牛客、leetcode 等OJ的代码仓库。tools文件夹下是一些脚本工具。 个人网站 + 博客: 题目清单 1.牛客网(剑指Offer、笔试题) 解决问题 提交时间 状态 ...
环境:Windows XP S3、...另外,本人使用QT的g++编译器编译通过了,因为是使用记事本手写的,所以完全是Java的书写风格^_^ 把它搞成VC++的工程是为了大家方便学习。。。 学习对象:希望编写效率高于Java应用的程序员。
构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用indexOf查找新数组中是否有该元素 3.若没有,则存到结果数组中 代码如下: Array.prototype.unique1 = function(){ var res = []; for(var i = 0...
例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和...
java源码剖析Amy Dixon ...在两个类各自的驱动程序中,使用currentTimeMillis()内置Java类生成随机数以测试两个结构的动态增长/收缩速度,以比较添加和删除方法运行时之前和之后的纳秒。 在MacOSX x86
一个简单的迷宫,用了窗口,画法,以及二维数组来充当地图,控制小点前后左右,由本人手写,可以手动更改代码以实现地图设计,当然你还可以多做几个地图,设计关卡啥的,那我就不弄了,文件超小,下一下,不要你太多...
数组和链表的存储方式有什么区别? 集合有哪些? ArrayList和LinkedList的区别? ArrayList的扩容机制? HashMap的原理?扩容机制? 解决Hash冲突的方法?除了开放寻址法和链表法还有吗? 散列函数有哪些?有什么优...
通过上面的程序代码,开发工具调用changes的addPropertyChangeListener方法把其他JavaBean注册入outString属性的监听者的队列1中,队列1是一个Vector数组,可存储任何Java对象。开发工具也可使用changes的...
java 版本,自己写的,个别题目和书中介绍的思路有出入,但是绝大多数是一致的。因为从头到尾都是自己手写的,难免出错,欢迎帮忙纠错。 转载算法实现请注明出处。 第二章 面试需要的基础知识 编程语言 数据结构 ...
1、用了Java两种方式,都挺好的,ArrayDeque的性能比LinkedList要强很多(都可以做队列),所以我就都写了一下,传入根结点即可(没有用数组存二叉树) /** * 层序遍历,使用了ArrayDeque,一个循环数组,性能很好...
java8 集合源码分析 pangdan 算法和数据结构 数组、链表、二叉树、队列、栈的各种操作(性能,场景) 二分查找和各种变种的二分查找 各类排序算法以及复杂度分析(快排、归并、堆) 各类算法题(手写) 理解并可以...
JavaSE1 ------ :基础的Java语法,包括类,对象,接口,流程控制,变量,数组,字符串等。 JavaSE2 ------ :进阶的Java语法,包括异常,流,集合,泛型,多线程,JDBC,网络编程等。 JavaSE3 ------ :后续理解...
Java Python blog 1 两数之和 √ --- √ × × 2 两数相加 √ --- √ × × 3 无重复字符的最长子串 √ --- √ × × 7 整数反转 √ --- √ × × 9 回文数 √ --- √ × × 13 罗马数字转整数 √ --- √ × × 20 ...