`
MoonMonster
  • 浏览: 35812 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java手写动态数组

    博客分类:
  • Java
阅读更多

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.先暂时写这几个方法,其他的例如查找是否存在某个数据或者某个数据有多少个,日后再说。
1
1
分享到:
评论
3 楼 MoonMonster 2015-10-24  
sanshizhang 写道
extend方法可以优化!

是使用系统的System.arraycopy()方法吗?还是有其他的?想不到了。
2 楼 sanshizhang 2015-10-23  
extend方法可以优化!
1 楼 Yanghisun 2015-10-22  
支持泛型是必须的

相关推荐

    约瑟夫环java纯数组模拟链表写法

    纯手写 java 数组模拟链表约瑟夫环问题 有很大更改空间 仅供参考

    Java实现自己的Json解析器

    Java实现自己的Json解析器——Json字符串解析原理 根据提取到的字符,转入不同的解析方法中, 例如字符是t,说明值可能是true,只需检查后面三个字符,如果是r、u、e,则可以直接返回true。 字符是f,说明值可能是...

    java图书管理系统

    java图书管理系统,不含数据库,自己数组手写,,,适合学生借鉴,,,有点乱,不过可以看,

    48-Java知识点 手写HashMap1

    介绍一下putVal()的5个参数:hash,hash值,就是通过这个值确定键值对放在数组哪个位置,公式是(数组长度-1)&hash。onlyIfAbsent,

    用自定的ArrayList实现队列

    * 在之前自定义的动态数组基础上完成队列,动态数组中要添加删除方法 * * @author 大刘 */ public class Queue { private ArraysList arraysList; /** * 入队方法 * @param e 入队元素 */ public void ...

    DLNetworkJ:一个基本的Java深度学习网络,用于攻击手写数字的MNIST数据集。 实现净形状配置,二次熵和交叉熵成本函数,神经元中的S型函数,迷你批处理选项,简单的自适应学习率。

    一个基本的Java深度学习网络,用于攻击手写数字的MNIST数据集,但可以轻松自定义用于其他目的。 实现净形状配置,二次熵和交叉熵成本函数,神经元中的S形函数,一些基本的自适应学习率函数,迷你批处理选项...使用可...

    手写实现简易ArrayList

    数组是最基本的数据结构,通过创建动态数组我们可以不再考虑必须为数组赋值得问题我们可以按自己的需求动态获取空间。 在此基础上我们可以实现队列和栈的应用` 将这个类用泛型标记表示可以创建任意类型集合 public ...

    javalruleetcode-onlinejudge-solutions:LeetCode、剑指Offer

    java lru leetcode Do not go gentle into that good night 说明 牛客、leetcode 等OJ的代码仓库。tools文件夹下是一些脚本工具。 个人网站 + 博客: 题目清单 1.牛客网(剑指Offer、笔试题) 解决问题 提交时间 状态 ...

    关于C++中栈指针和堆指针的使用说明

    环境:Windows XP S3、...另外,本人使用QT的g++编译器编译通过了,因为是使用记事本手写的,所以完全是Java的书写风格^_^ 把它搞成VC++的工程是为了大家方便学习。。。 学习对象:希望编写效率高于Java应用的程序员。

    两种常用的javascript数组去重方法思路及代码

    构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用indexOf查找新数组中是否有该元素 3.若没有,则存到结果数组中 代码如下: Array.prototype.unique1 = function(){ var res = []; for(var i = 0...

    手写数据结构算法.zip

    例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和...

    java源码剖析-PAIInternshipLLvsAL:包含问题,假设,来源和运行时分析结果的README.md描述的手写ArrayList

    java源码剖析Amy Dixon ...在两个类各自的驱动程序中,使用currentTimeMillis()内置Java类生成随机数以测试两个结构的动态增长/收缩速度,以比较添加和删除方法运行时之前和之后的纳秒。 在MacOSX x86

    java迷宫awt

    一个简单的迷宫,用了窗口,画法,以及二维数组来充当地图,控制小点前后左右,由本人手写,可以手动更改代码以实现地图设计,当然你还可以多做几个地图,设计关卡啥的,那我就不弄了,文件超小,下一下,不要你太多...

    新东方一面(2020春招—Java后端)

    数组和链表的存储方式有什么区别? 集合有哪些? ArrayList和LinkedList的区别? ArrayList的扩容机制? HashMap的原理?扩容机制? 解决Hash冲突的方法?除了开放寻址法和链表法还有吗? 散列函数有哪些?有什么优...

    第5章 JSP与JavaBean

    通过上面的程序代码,开发工具调用changes的addPropertyChangeListener方法把其他JavaBean注册入outString属性的监听者的队列1中,队列1是一个Vector数组,可存储任何Java对象。开发工具也可使用changes的...

    leetcode下载-CodingInterviews:《剑指offer》面试题java版,leetcode题目分享

    java 版本,自己写的,个别题目和书中介绍的思路有出入,但是绝大多数是一致的。因为从头到尾都是自己手写的,难免出错,欢迎帮忙纠错。 转载算法实现请注明出处。 第二章 面试需要的基础知识 编程语言 数据结构 ...

    算法之二叉树的层序遍历(利用队列实现,需熟练手写)

    1、用了Java两种方式,都挺好的,ArrayDeque的性能比LinkedList要强很多(都可以做队列),所以我就都写了一下,传入根结点即可(没有用数组存二叉树) /** * 层序遍历,使用了ArrayDeque,一个循环数组,性能很好...

    java8集合源码分析-pangdan:面试相关技能

    java8 集合源码分析 pangdan 算法和数据结构 数组、链表、二叉树、队列、栈的各种操作(性能,场景) 二分查找和各种变种的二分查找 各类排序算法以及复杂度分析(快排、归并、堆) 各类算法题(手写) 理解并可以...

    LearnHow2J:练习How2J的代码

    JavaSE1 ------ :基础的Java语法,包括类,对象,接口,流程控制,变量,数组,字符串等。 JavaSE2 ------ :进阶的Java语法,包括异常,流,集合,泛型,多线程,JDBC,网络编程等。 JavaSE3 ------ :后续理解...

    leetcode卡-data-structure:数据结构学习-手写各种数据结构从这里开始

    Java Python blog 1 两数之和 √ --- √ × × 2 两数相加 √ --- √ × × 3 无重复字符的最长子串 √ --- √ × × 7 整数反转 √ --- √ × × 9 回文数 √ --- √ × × 13 罗马数字转整数 √ --- √ × × 20 ...

Global site tag (gtag.js) - Google Analytics