`
百合不是茶
  • 浏览: 355999 次
社区版块
存档分类
最新评论

动态数组的存储速度比较 集合框架

 
阅读更多

集合框架:

自定义数据结构(增删改查等)

package 数组;

/**
 * 创建动态数组
 * @author 百合
 *
 */

public class ArrayDemo{
	
	//定义一个数组来存放数据
	
	String[] src = new String[0];
	
	/**
	 * 增加元素加入容器 
	 * @param s要加入容器的个数
	 */
	public void add(String s){
		//创建一个新的数组,长度为src+1;
		String[] dest = new String[src.length+1];
		//将新加入的数组放在数组的最后一位
		dest[dest.length-1] = s;
		//将src数组的值copy到dest数组里面
		for(int i = 0;i<src.length;i++){
			dest[i] = src[i];
		}
		//将src指向新数组
		src = dest;
	}
		
	
	/**
	 * 获取元素的地址
	 * @param index
	 * @return
	 */
	public String get(int index){
		
		return src[index];
	}
	
	/**
	 * 修改指定位置的元素
	 * @param index修改的元素位置
	 * @param s修改后的新元素
	 */
	public void update(int index,String s){
		if(index >=0 && index<size()){
			src[index]= s;
		}else{
			System.out.println("指定的下标超出范围");
		}
			
	} 
	
	
	/**
	 * 将指定的元素插入到指定的位置
	 */
	public void insert(int index,String s){
				
		if(index>=0 && index <size()){
			String[] dest = new String[src.length+1];
			//将插入的数组放到指定的位置
			dest[index] = s;
			for(int  i  = 0;i < index;i++){
				dest[i] = src[i];
			}
			
			for(int i = index;i<src.length;i++){
				dest[i+1] = src[i];
			}
			
			//将src指新数组
			src = dest;
			
		}else{
			System.out.println("指定的下标超出范围");
		}
	}
	
	/**
	 * 删除指定位置的元素
	 * @param inde下标的元素
	 */
	public void dalete(int index){
		String[] dest = new String[src.length-1];
			
		for(int i = 0;i<index;i++){
			dest[i] = src[i];	
		}
		
		for(int i = index +1;i<src.length;i++ ){
			dest[i-1] = src[i];
		}
		src = dest;
		
	}
	
	/**
	 * 
	 * @return 返回得到容器的元素的个数
	 *
	 */
	public int size(){
		
		return src.length;
	}
}

 

//测试ArrayDemo数组

//泛型的类类型,可以调用方法

package 数组;

public class ArrayTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//获得系统时间
		long t1 = System.currentTimeMillis();
		System.out.println(t1);
		ArrayDemo am = new ArrayDemo();
		am.add("元素1");
		am.add("元素2");
		am.add("元素3");
		am.add("元素4");
		am.add("元素5");
		//am.dalete(4);
		am.insert(0,"元素六");
		
		long t2 = System.currentTimeMillis();
		System.out.println(t2);

	//遍历
		for(int i = 0;i<am.size();i++){
			String num = am.get(i);
			System.out.println(num);
			System.out.println(Math.abs(t2-t1));
		}
		System.out.println(Math.abs(t2-t1));
	}

}

 

 

 

//修改后的数组,使用泛型可以存储任意的类型

 

/**
 * 动态数组,用来装任意类型的动态数组
 * 
 * @author 百合
 * 
 */
public class ArrayQueue<E> {

	private int len = 0;// 长度
	private int initContiner;// 初始容量
	private int rate;// 增长比率
	// 定义一个用来存放数据的数组
	// 初始长度为0,表示没有装任何数据
	Object[] src;

	public ArrayQueue() {
		this.initContiner = 10;
		this.rate = 10;
		src = new Object[initContiner];
	}

	// 创建容器对象的时候指定容量和增长比率
	public ArrayQueue(int initContiner, int rate) {
		this.initContiner = initContiner;
		this.rate = rate;
		src = new Object[initContiner];
	}

	/**
	 * 将指定的元素加入容器
	 * 
	 * @param s
	 *            要加入到容器中的元素
	 */
	public void add(E s) {
		// 如果长度小于容量,就将元素放到数组第一个为null的位置
		if (len >= src.length) {
			// 创建新数组
			// 定义一个新数组,用来装数据,长度比src+1
			Object[] dest = new Object[src.length + rate];
			// 将源数组中的数据按照下标顺序拷贝到新数组
			System.arraycopy(src, 0, dest, 0, len);
			src = dest;

		}
		src[len] = s;

		len++;
	}

	/**
	 * 获取指定下标位置的元素
	 * 
	 * @param index
	 *            要获取的元素的下标
	 * @return 返回获取到的元素
	 */
	public E get(int index) {
		return (E) src[index];
	}

	/**
	 * 修改指定位置元素的值
	 * 
	 * @param index要修改的元素位置
	 * @param s
	 *            修改后的新元素
	 */
	public void update(int index, E s) {
		if (index >= 0 && index < size()) {
			src[index] = s;
		} else {
			System.out.println("指定的下标超出范围!!!");
		}

	}

	/**
	 * 将指定元素插入到指定位置
	 * 
	 * @param index
	 *            要插入元素的位置
	 * @param s
	 *            要插入的新元素
	 */
	public void insert(int index, E s) {
		if (index >= 0 && index < size()) {
			// 定义新数组,长度比原数组+1
			Object[] dest = new Object[src.length + 1];
			// 将新元素放到新数组的指定位置
			dest[index] = s;
			// 将源数组中下标<index,拷贝到新数组相同的下标位置
			for (int i = 0; i < index; i++) {
				dest[i] = src[i];
			}

			// 将源数组中其他下标的元素拷贝到新数组下标+1的位置
			for (int i = index; i < src.length; i++) {
				dest[i + 1] = src[i];
			}
			// 将src指向新数组
			src = dest;

		} else {
			System.out.println("指定的下标超出范围!!!");
		}
	}

	/**
	 * 删除指定位置的元素
	 * 
	 * @param index
	 *            要删除的元素的下标
	 */
	public void delete(int index) {
		if (index >= 0 && index < size()) {
			// 定义新数组,长度是原始数组长度-1
			Object[] dest = new Object[src.length - 1];

			// 如果下标<index,则按下标位置拷贝
			for (int i = 0; i < index; i++) {
				dest[i] = src[i];
			}
			// index位置的值丢掉不需要拷贝

			// >index的下标位置拷贝到新数组下标-1的位置
			for (int i = index + 1; i < src.length; i++) {
				dest[i - 1] = src[i];
			}
			// 将src指向新数组
			src = dest;

		} else {
			System.out.println("指定的下标超出范围!!!");
		}
	}

	/**
	 * 获得容器中元素个数的方法 容器中不为null的元素个数
	 * 
	 * @return 返回元素的个数
	 */
	public int size() {
		return len;
	}
}



//测试
public class MainDemo {

	public static void main(String[] args) {
		// 在创建容器对象的时候,将泛型具体化
		ArrayQueue<String> queue = new ArrayQueue<String>();

		
		//获得系统时间
		long t1 = System.currentTimeMillis();
		
		for (int i = 0; i < 10; i++) {
			queue.add("元素" + i);
		}
		queue.add("新元素");
		
		
		long t2 = System.currentTimeMillis();

		for (int i = 0; i < queue.size(); i++) {
			String s = queue.get(i);
			System.out.println(s);
		}
		System.out.println(Math.abs(t2-t1));
	}

}



 //上述的两个是对数据的存取速度进行比较,第二种的速度比第一种的开辟速度快很多

java的API中有一系列的方法可以供调用,例如:list  set  map等

分享到:
评论

相关推荐

    数组和集合

    在多线程环境下使用集合时,需要注意线程安全问题,选择合适的线程安全集合类或使用并发集合框架。 在图形界面、输入输出流、线程池和网络编程等其他Java知识点中,数组和集合也扮演着重要角色。例如,在进行文件...

    java 动态数组的体现

    本篇文章将深入探讨Java中的动态数组实现,主要关注ArrayList类,它是Java集合框架中的一种重要实现,体现了动态数组的概念。 首先,我们来看看ArrayList的内部机制。ArrayList是基于数组实现的,它继承自...

    Java 集合与数组

    Collection API 是 Java 提供的集合类库,主要包括了集合框架的体系结构、接口和类。Collection API 的主要接口和类有: * Collection 接口:最基本的接口,集合框架的根,代表一组 Object。 * Set 接口:扩展 ...

    集合框架学习笔记

    集合框架是Java编程语言中的核心组成部分,它提供了一套高效、灵活的数据结构和算法操作,使得程序员能够方便地存储和管理对象。这篇学习笔记将深入探讨Java集合框架的基础概念、主要类库以及常见应用场景。 首先,...

    java 动态的数组链表

    动态数组链表,也称为ArrayList,是Java集合框架中的一种实现,位于`java.util`包下。ArrayList类继承自AbstractList,并实现了List接口,提供了一种动态增长的数组。当数组达到其容量限制时,ArrayList会自动创建一...

    C语言动态数组.docx

    C#中的动态数组可以通过接口如`IList`来实现,这提供了类似数组的访问机制,支持通过索引访问集合对象。`ArrayList`是.NET框架中一个实现`IList`接口的例子,它提供了动态调整大小的功能。 总之,C语言的动态数组是...

    数组、集合、列表与数据表的查找速度比较

    基于多条记录有多种存储方法,而我们在选择使用哪种方法时考虑最多的还是其执行哪种方法的执行速度比较快,本人特编写了此程序,用于对比四种最常用的方法(数组、集合、列表、数据表)的执行速度。 又因为列表与...

    java实验数组和集合

    Java 集合框架提供了多种集合类,包括ArrayList、LinkedList、HashSet 等。 在本实验中,我们没有直接使用集合,而是使用数组来实现实验题目。但是,集合可以用来实现更加灵活和高效的数据存储和操作。 Java 数组...

    Java集合框架及泛型

    1. **ArrayList**: 这是一个基于数组实现的列表,内部使用Object数组存储元素。它提供了快速的索引访问,但插入和删除操作相对较慢,因为需要移动后续元素。 2. **LinkedList**: 它通过节点链接实现,插入和删除...

    Java集合框架详解

    Java集合框架是Java编程语言中的一个核心组成部分,它为存储、管理和操作对象提供了一套统一的接口和类。本文将深入解析Java集合框架的各个方面,包括Collection、List、Set和Map,以及它们的相关实现和使用原理。 ...

    java集合 框架 泛型

    Java集合框架是Java编程语言中一个至关重要的组成部分,它为数据存储和操作提供了丰富的类库。泛型是Java 5引入的一项创新特性,极大地增强了集合框架的安全性和效率。本讲解将深入探讨这两个主题,以及与之相关的...

    集合框架的总结

    以`ArrayList`为例,其内部使用动态增长的数组存储元素,当添加元素超过数组容量时,会自动扩容。`HashSet`的核心是`HashMap`,每个元素的键值就是元素本身,值为`null`。`HashMap`通过哈希算法确定元素的位置,快速...

    Java集合框架面试题

    Java 集合框架是 Java 语言中的一组预定义类和接口的集合,用于存储和操作数据。下面是 Java 集合框架的知识点总结: 1. Java 集合类主要有两大分支:Collection 接口和 Map 接口。Collection 接口实现了 iterator ...

    Java程序设计 3 数组与集合 简图.ppt

    数组是最基本的数据结构,而集合框架则提供了一种更高级、更灵活的方式来存储和操作对象。 首先,我们来看看数组。数组是固定大小的、同类型元素的线性序列,它的大小在创建时就需要指定,并且一旦确定就无法改变。...

    java集合框架图

    Java集合框架是Java标准库的重要组成部分,它提供了存储和操作对象的各种数据结构。通过使用集合框架,开发人员可以轻松地管理不同类型的数据集,并且能够利用Java集合框架提供的高效算法进行数据处理。 在Java集合...

    java数组 遍历方法集合

    迭代器(`Iterator`)是Java集合框架的一部分,主要用于遍历集合中的元素。对于数组而言,我们可以通过将数组转换为列表的方式利用迭代器来遍历数组。 **代码示例**: ```java import java.util.ArrayList; import ...

    java集合框架全面进阶.pdf

    Java集合框架是Java编程语言中处理对象集合的一套接口和类。该框架提供了用于存储和操作集合的标准方法。在Java集合框架中,基本的接口分为两大类:Collection和Map。 Collection接口用于表示一组对象,称为其元素...

    C#动态数组动态分配长度的方法[归类].pdf

    在C#中,实现动态数组主要有三种方法,这些方法都适用于处理那些在编译时无法确定确切长度的数据集合。 1. **重新初始化数组**: 这是最基础的方式,通过重新分配内存来改变数组的长度。例如,当`m`增加时,可以...

    学士后Java集合框架和泛型课后习题答案

    Java集合框架是Java编程语言中的一个核心组成部分,它为数据存储和操作提供了丰富的类库。在Java中,集合框架主要包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。这个...

Global site tag (gtag.js) - Google Analytics