`
MoonMonster
  • 浏览: 36707 次
  • 性别: 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学习笔记,数组初步

    数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。 3. 数组常见操作 数组创建后,我们经常需要对数组做两种最常见的操作:遍历、拷贝。 * 遍历指的就是“通过循环遍历数组的所有元素”。 * 拷贝...

    handwriting(JAVA).zip_handwriting_java 开发手写_java手写输入_手写_手写输入

    在Java编程语言中,手写输入和原笔迹再现是一项技术,它允许用户通过触摸屏或数字笔在屏幕上书写文字,然后系统会将其转换为可编辑的文本或保持原笔迹的形式显示。这个"handwriting(JAVA).zip"压缩包文件提供了一种...

    java手写识别源代码.doc

    Java 手写识别源代码详解 本文档是一个 Java 手写识别源代码的实现,主要使用 Java 语言编写,利用 Java 的图形用户界面(GUI)组件实现手写识别功能。下面是对该源代码的详细解释: 类和接口 在该源代码中,我们...

    手写Java HaspMap

    **HashMap详解与手写实现** HashMap是Java编程中常用的数据结构之一,它是基于哈希表实现的,提供了高效的键值对存储和查找功能。在面试中,深入理解HashMap的内部工作原理是衡量开发者基础扎实与否的重要标准。...

    手写签名图片,可保存为图片或到数据库

    3. **实时预览**:在用户签名过程中,可以通过连续调用pictureBox1的Paint事件,在pictureBox1上实时显示绘制的线条,形成签名的动态效果。 4. **保存为图片**:完成签名后,可以使用GDI+的位图(Bitmap)类将...

    JAVA 基础知识总结(手写)

    `ArrayList`是以数组实现的列表,适合于随机访问;`LinkedList`是链表实现,对于插入和删除操作更高效;`HashSet`不允许重复元素,没有顺序;`TreeSet`是有序的集合,基于红黑树实现;`HashMap`是键值对的存储,非...

    java手写识别源代码[借鉴].pdf

    《Java手写识别源代码详解》 在计算机视觉和人工智能领域,手写识别是一项重要的技术,它能够将手写的字符转换为可编辑的文本。Java作为一种广泛应用的编程语言,也提供了实现这一功能的可能性。这份“java手写识别...

    基于Java实现手写汉字识别系统,不使用机器学习的方法,而是使用0-1矩阵的文件来保存手写体的字形.zip

    《基于Java实现的手写汉字识别系统》 在人工智能领域,机器学习是研究计算机如何自动学习经验,提升性能的重要分支。然而,本项目不依赖于传统的机器学习方法,而是利用0-1矩阵来处理和识别手写汉字。这是一种创新...

    手写精简版List和ArrayList,适合新手入门学习jdk源码demo

    `ArrayList`是`List`接口的一个具体实现,它底层基于动态数组(Resizable-array)来存储元素。这使得`ArrayList`在访问元素时具有较高的效率,因为数组的索引访问时间复杂度为O(1)。然而,插入和删除元素时,如果...

    快速排序算法的java实现

    在这个Java代码中,`quickSort()`方法是主排序函数,它接受数组和两个索引作为参数,表示要排序的子数组范围。`partition()`方法用于执行分区操作,找到基准元素的正确位置,并返回该位置。`swap()`方法则用于交换...

    java实现的感知机手写数字识别

    本项目是使用Java实现的感知机,用于手写数字识别,这在图像处理和模式识别领域有着广泛应用,如OCR(光学字符识别)系统。 首先,我们要理解感知机的工作原理。感知机模型基于线性可分的概念,它通过找到一个超...

    北大青鸟S1java内部测试试卷(试题)

    - **二元搜索**:在选择题第5题中,我们了解到 `java.util.Arrays` 类提供了 `binarySearch` 方法用于对已排序的数组进行二元搜索。这是一种高效的查找算法,时间复杂度为O(log n)。 ### 5. 方法参数 - **方法参数...

    46-Java知识点 手写ArrayList1

    Java 知识点 手写 ArrayList Java 中最常用的类是 ArrayList,它的实现原理和方法非常重要。在面试中,经常要求手写一个 ArrayList,以考察应聘者对 ArrayList 的熟悉程度。本文将详细介绍如何手写一个 ArrayList,...

    Java手写简易版HashMap的使用(存储+查找)

    Java手写简易版HashMap的使用(存储+查找) Java手写简易版HashMap是Java中的一种常用的数据结构,它提供了高效的存储和查找键值对的功能。下面我们将详细介绍Java手写简易版HashMap的使用,包括存储和查找键值对的...

    java编程式启动ant

    如果需要在Java代码中向Ant传递命令行参数,可以修改`command`数组,例如设置属性值: ```java String[] command = {"-DmyProperty=value", "-f", "path/to/build.xml", "compile"}; ``` 在Ant构建文件中,可以...

    Java_Modbus的操作(实例)

    在CRC16类中,可以看到一个静态数组`auchCRCHi`,这是预先计算好的CRC查找表,用于高效地计算CRC校验码。 在CRC16校验过程中,通常包括以下步骤: - 将数据字节与初始CRC值(通常为全1)进行异或。 - 对每个字节...

    Java实验手册

    数组是Java编程中的基本数据结构,用于存储同类型的多个数据。这个实验旨在让学习者掌握数组的创建、初始化、访问以及操作数组元素的方法。 1. **实验内容**:创建不同类型的数组,如整型数组、字符型数组等,学习...

    剑指offer编程题66道题目描述及java代码实现汇总

    这里的"剑指offer编程题66道题目描述及java代码实现汇总"是一个集合,包含了书中66个编程挑战的详细描述以及对应的Java代码实现。以下是对这些编程题目的部分解析和相关知识点的详细阐述: 1. **数组中出现次数超过...

    Java实现自己的Json解析器

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

Global site tag (gtag.js) - Google Analytics