几个操作速度对比

对集合操作进行简单的进行测试速度,数据量20w,对map,list,set,array,queue进行遍历测试时间对比。

先粘贴一段对这些集合的介绍:

1.1 Set接口

  1. 存入Set的每个元素都必须是唯一的,Set接口不保证维护元素的次序;
  2. HashSet类: 为快速查找设计的Set,存入HashSet的对象必须定义hashCode(),它不保证集合的迭代顺序;
  3. LinkedHashSet类: 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。

1.2 List接口

  1. List按对象进入的顺序保存对象,不做排序等操作;
  2. ArrayList类:由数组实现的List,允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢;
  3. LinkedList类: 对顺序访问进行了优化,向List中间插入与删除的开销并不大,随机访问则相对较慢。

1.3 Queue接口

  1. Queue用于模拟队列这种数据结构,实现“FIFO”等数据结构。通常,队列不允许随机访问队列中的元素。
  2. ArrayDeque类:为Queue子接口Deque的实现类,数组方式实现。
  3. LinkedList类:是List接口的实现类,同时它也实现了Deque接口(Queue子接口)。因此它也可以当做一个双端队列来用,也可以当作“栈”来使用。

1.4 Map接口

  1. 添加、删除操作put/remove/putAll/clear
  2. 查询操作get/containsKey/containsValue/size/isEmpty
  3. 视图操作keySet/values/entrySet
  4. Map.Entry接口(Map的entrySet()方法返回一个实现Map.Entry接口的对象集合)  getKey/getValue/setValue

下面是测试代码:

public static int leng = 200000;
	private String[] array;
	private Set<String> set;
	private List<String> list;
	private Queue<String> queue;
	private Map<String, String> map;

	@Before
	public void init() {
		array = new String[leng];
		set = new HashSet<String>();
		list = new ArrayList<String>();
		queue = new LinkedList<String>();
		map = new HashMap<String, String>();
		for (int i = 0; i < leng; i++) {
			String key = "didi:" + i;
			String value = "da";
			array[i] = key;
			set.add(key);
			list.add(key);
			queue.add(key);
			map.put(key, value);

		}
	}

	// shzu
	@Test
	public void testArray() {
		Long startTime = new Date().getTime();
		for (String sk : array) {
			///
		}
		Long endTime = new Date().getTime();
		Long times = endTime - startTime;
		System.out.println("时间:" + times);
	}

	// list
	@Test
	public void testList() {
		Long startTime = new Date().getTime();
		for (String sk : list) {
			///
		}
		Long endTime = new Date().getTime();
		Long times = endTime - startTime;
		System.out.println("时间:" + times);
	}

	// map
	@Test
	public void testMap() {
		Long startTime = new Date().getTime();
		for (Map.Entry<String, String> entry : map.entrySet()) {
			entry.getKey();
		}
		Long endTime = new Date().getTime();
		Long times = endTime - startTime;
		System.out.println("时间:" + times);
		Long startTime1 = new Date().getTime();
		for (String key : map.keySet()) {
			String value = (String) map.get(key);
		}
		Long endTime1 = new Date().getTime();
		Long times1 = endTime - startTime;
		System.out.println("时间1:" + times1);
	}

	// Queue
	@Test
	public void testQueue() {
		Long startTime = new Date().getTime();
		for (String s: queue) {
			//
		}
		Long endTime = new Date().getTime();
		Long times = endTime - startTime;
		System.out.println("时间1:" + times);
	}
	// Set
		@Test
		public void testSet() {
			Long startTime = new Date().getTime();
			for (String s: set) {
				//
			}
			Long endTime = new Date().getTime();
			Long times = endTime - startTime;
			System.out.println("时间:" + times);
		}

  时间:array:4ms,list:17ms,map:14ms,13ms,queue:15ms,set:14ms

数据根据每次测试略有差距,但相差不大,array和其他差距最大,属于 最快的遍历,list最慢。

参考资料:http://www.cnblogs.com/nayitian/archive/2013/03/08/2950730.html

时间: 2024-08-26 00:10:55

几个操作速度对比的相关文章

如何用一个app操作另外一个app.比如微信群控那样的

如何实现一个app.控制另外的app,比如市面上群控微信的,是用测试工具的原理?还是什么模拟点击的原理? 如何用一个app操作另外一个app.比如微信群控那样的 >> android 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/android/1010000007186891/如何用一个app操作另外一个app比如微信群控那样的.html

ELK 学习笔记之 elasticsearch Mget操作

Mget操作: 查询多个文档: curl -XGET 'http://192.168.1.151:9200/_mget' -d '{"docs": [{"_index": "library","_type": "books", "_id": "1"}, {"_index": "library","_type"

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

Python 文件操作

操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读: 不存在则创建:存在则只追加内容:] "+" 表示可以同时读写某个文件 r+,可读写文件.[可读:可写:可追加] w+,写读 a+,

Python操作数据库(mysql redis)

一.python操作mysql数据库: 数据库信息:(例如211.149.218.16   szz  123456) 操作mysql用pymysql模块 #操作其他数据库,就安装相应的模块 import  pymysql ip='211.149.218.16' port=3306 passwd='123456' user='root' db='szz' conn=pymysql.connect(host=ip,user=user,port=port,passwd=passwd,db=db,cha

数据库权限分配操作

1.远程登录mysqlmysql -h ip -u root -p 密码2.创建用户格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";例1:增加一个test1用户,密码为123456,可以在任何主机上登录,并对所有数据库有查询,增加,修改和删除的功能.需要在mysql的root用户下进行mysql>grant select,insert,update,delete on *.* to [email protected]&quo

Django(三) ORM 数据库操作

比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段类型 1.字段类型介绍 2.字段参数介绍 3.Django ORM 外键操作 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 ORM:关系对象映射.定义一个类自动生成数

python操作mysql ------- SqlAchemy正传

本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 pip3 install pymysql 使用操作 1.执行SQL #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 创建连接 conn = pymysql.connect(host='127.0.0.1

SQLServer数据库自增长标识列的更新修改操作

SQLServer数据库自增长标识列的更新修改操作方法在日常的sql server开发中,经常会用到Identity类型的标识列作为一个表结构的自增长编号.比如文章编号.记录序号等等.自增长的标识列的引用很大程度上方便了数据库程序的开发,但是有时这个固执的字段类型也会带来一些麻烦. 一.修改标识列字段的值:(在执行insert时,将ID手动的设置成想要的值)有时,为了实现某个功能,需要修改类型为Identity自增长类型的字段的值,但由于标识的类型所限,这种操作默认是不允许的.比如,目前数据库有