`
alucardggg
  • 浏览: 8736 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java的数组实现静态链表比JDK的链表快

阅读更多
用java的数组实现静态链表和JDK1.6自带的linkedlist做比较,经过测试(平台都是windows),发现如下结果:
由于java的linkedlist是不定长的,如果算上构造百万级list的时间,再加上遍历的时间,那么
速度明显比如静态链表慢1/2左右
如果将2个链表先填充满值,再进行遍历,计算遍历的时间,则发现JDK的linkedlist要慢1/3左右
代码如下:(静态链表)
package algorithms;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * 静态链表实现
 * 
 * @author Alucard Wang
 * 
 */

public class StaticList<T> {
	public static class Element<T> {
		/*
		 * 数据对象
		 */
		public T data;
		/*
		 * 游标
		 */
		public int cur;

	}

	private int maxsize = 100;

	private Element<T>[] space = null; 

	// 链表头为space[maxsize-1];

	private int r = maxsize - 1;
	
	public StaticList(int maxsize) {
		
		this.maxsize = maxsize;
		r = maxsize - 1;
		space = new Element[maxsize];
		initSpace();
	}
	// 初始化空间
	private void initSpace() {
		for (int i = 0; i < maxsize - 2; ++i) {
			space[i] = new Element<T>();
			space[i].cur = i + 1;
		}
		space[maxsize - 2] = new Element<T>();
		space[maxsize - 2].cur = 0;

		// 头结点
		space[maxsize - 1] = new Element<T>();
		space[maxsize - 1].cur = 0;
	}

	// 分配空间,返回0认为已经没有可用空间
	private int malloc() {
		int i = space[0].cur;
		if (i != 0) {
			space[0].cur = space[i].cur;
		}
		return i;
	}

	// 回收空间,将下标为k的结点回收
	private void free(int k) {
		space[k].cur = space[0].cur;
		space[0].cur = k;
	}

	//增加一个结点
	public void add(T obj) throws Exception {
		int i = malloc();
		if (0 == i) {
			throw new Exception("verflow!");
		} else {
			space[r].cur = i;
			r = i;
			// 尾结点为0
			space[r].cur = 0;
			space[r].data = obj;
		}
	}

	// i 为 index
	public Element get(int i) {
		int p = maxsize - 1;
		int j = 0;
		while (space[p].cur != 0 && j < i) {
			p = space[p].cur;
			++j;
		}

		if (j != i) {
			return null;
		}
		return space[p];
	}

	//删除一个结点
	public Element delete(int i) throws Exception {
		int p = maxsize - 1;
		int j = 0;
		while (space[p].cur != 0 && j < i - 1) {
			p = space[p].cur;
			++j;
		}

		if (j != i - 1) {
			return null;
		}

		int q = space[p].cur;
		space[p].cur = space[q].cur;
		free(q);
		return space[q];
	}

	//下一个结点
	public Element<T> next(Element<T> e) {
		if (e.cur != 0) {
			return space[e.cur];
		} else {
			return null;
		}
	}

	//清空
	public void clear() {
		initSpace();
	}
	
	public static void main(String[] args) throws Exception {
		
		System.out.println("Please enter the linklist number:");
		System.out.println("0:	static linked list");
		System.out.println("1:	jdk linked list");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String methodNo = br.readLine();
		System.out.println("Please enter the linklist max size");
		String maxsizeNo = br.readLine();
		int method = Integer.valueOf(methodNo);
		int maxsize = Integer.valueOf(maxsizeNo);
		
		System.out.println("============== test performance!!!  先构造,再计算遍历时间========================");
		
		final int COUNT = maxsize-2;
		
		
		List<String> javaList = null;
		StaticList<String> slist = null;
		if(method == 1) {
			javaList = new LinkedList<String>();
			for(int i=0; i<COUNT; i++) {
				javaList.add(String.valueOf(i));
			}
		}
		else {
			slist = new StaticList<String>(maxsize);
			for(int i=0; i<COUNT; i++) {
				slist.add(String.valueOf(i));
			}		
		}
		
		Calendar ca = Calendar.getInstance();
		long begin = ca.getTimeInMillis();
		
		if (method == 0) {
			Element<String> se = slist.next(slist.get(0));
			while (se != null) {
				se = slist.next(se);
			}
		}else {
			Iterator<String> iter = javaList.iterator();
			while(iter.hasNext()) {
				iter.next();
			}
		}
		
		System.out.println(Calendar.getInstance().getTimeInMillis() - begin);
		System.out.println("finish!");

	}
}



经测试(900000),可以看到
静态链表
Please enter the linklist number:
0: static linked list
1: jdk linked list
0
Please enter the linklist max size
900000
============== test performance!!!  先构造,再计算遍历时间========================
16
finish!

JDK linkedlist:
Please enter the linklist number:
0: static linked list
1: jdk linked list
1
Please enter the linklist max size
900000
============== test performance!!!  先构造,再计算遍历时间========================
62
finish!


如果先计算构造+遍历的时间,则静态链表为:
Please enter the linklist number:
0: static linked list
1: jdk linked list
0
Please enter the linklist max size
900000
============== test performance!!!  计算遍历+构造时间========================
719
finish!

JDK linkedlist为:
Please enter the linklist number:
0: static linked list
1: jdk linked list
1
Please enter the linklist max size
900000
============== test performance!!!  计算遍历+构造时间========================
1125
finish!

是否我的测试方法有误或者有其他的问题,如果不是,则在某些场景下,是否能用静态链表来代替JDK呢?
分享到:
评论

相关推荐

    Java开发技术大全(500个源代码).

    signByIF.java 用if语句实现符号函数示例 triangleStar.java 输出一个由*组成的直角三角形 upperToLowCase.java 大写转换成小写 variableScopeExample.java 变量使用范围示例 第3章 示例描述:本章学习对象和类...

    AIC的Java课程1-6章

    第10章 基本数据结构 4课时  了解和比较静态分配内存空间和动态分配内存空间,能够选择数组或链表表示线性结构。  掌握通过引用同类型对象(指针)实现链表,动态分配内存空间构建链表。 ...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    JAVA面试题最全集

    链表与散列表和数组的区别 19.堆和栈的区别 20.ejb的分类及区别 21.你对现在软件业以及国内软件业的看法 22.谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和...

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...

    java 面试题 总结

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出Session...

    Java范例开发大全 (源程序)

     实例216 动态的数组链表 382  实例217 你能猜出鱼是谁的宠物吗? 387  实例218 使用Collections类对List的排序操作 393  实例219 LinkedList的添加删除操作 395  实例220 运用Vector 397  实例221 改变...

    java范例开发大全

    实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变Properties文件中的...

    Java范例开发大全(全书源程序)

    实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变Properties...

    java范例开发大全(pdf&源码)

    实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变Properties文件中的...

    Java开发技术大全 电子版

    Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释...

    超级有影响力霸气的Java面试题大全文档

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

Global site tag (gtag.js) - Google Analytics