效率比较--集合

List
ArrayList

实现原理内部封装Object[]数组(若创建时未指定长度 数组初始长度默认为10)

实质为 :无序数组 插入快 查找和删除指定元素慢

总结


O(1)


O(N)


O(1) System.arraycopy


get(int i)


Y


set(int index,Object obj)


Y


add(Object obj)


Y


add(int index,Object obj)


Y


remove(int index)

remove(Object o)


Y


contains(Object obj)


Y

结论(实验 ArrayListPerformanceTest.java)

add(int index, E element) 添加元素到指定位置 效率低下

add(E e) 添加单个元素 效率高

LinkedList

实质:双向链表


O(1)


O(N)


getFirst()/getLast()


Y


removeFirst()/removeLast()


Y


addFirst(E e)/ addLast(E e)


Y


contains(Object o)


Y


add(E e)


Y


remove(Object o)


Y


get(int index)


Y


set(int index, E element)


Y

实验结果

ArrayList add(E e):                      60460850ns

LinkedList add(E e):        54999241ns

ArrayList remove(index):         1855036016ns

LinkedList remove(object):    42823941ns

ArrayList contains(Object o):     15517890276ns

LinkedList contains(Object o):    29827766030ns

ArrayList与LinkedList效率比较

ArrayList查找操作的效率最高为,但其在添加和删除操作时需要拷贝数组所以效率较低,尤其是删除操作。该数据结构适用于需要频繁快速查找的地方。

LinkList 查找操作效率较低为,但其插入与删除操作效率较高,适用于需要频繁进行插入删除操作的情况。

MAP
HashMap

Map是一组key-value(键值对)集合,其中的key(键)不能重复。

HashMap 用key对象生成hashcode然后映射到Entry<K,V>[]数组中(JDK1.6中其hashtable默认大小为16,在持有对象数量查过默认大小之后就会重新生成一个更大HashTable,然后将原有持有的对象逐个散列到新哈希表中)。其get(Object key) 最佳时间复杂度为O(1),最坏则为O(n)。但就查找的平均效率来说是要高于TreeMap。

TreeMap 用key对象为关键值存放在RBTree(红黑树)中。其get(Object key)方法的平均时间复杂度为O(logn)。

References Resource

http://topic.csdn.net/u/20100120/12/638e6f89-222b-42a5-9e94-765a2a33107d.html

http://blog.csdn.net/inkfish/article/details/5185320

http://www.cnblogs.com/lostyue/archive/2012/03/07/2383954.html

时间: 2024-11-07 21:16:00

效率比较--集合的相关文章

Java集合知识点总结——博客园:执、著

数组与集合的区别: Java中的数组是存放同一类型数据的集合.数组可以存放基本数据类型的数据,也可以存放引用数据类型的数据,但数组的长度是固定的. 集合只能存放引用数据类型的数据,不能存放基本数据类型的数据,但集合的数目是可变的. 所有的集合类都存放在java.util包中 List接口是元素有序,可重复的集合,添加自定义类时需要重写equals()方法 ArrayList集合中,插入一个元素时,列表需要将插入点后面的所有元素向后移动,而在删除(remove())一个元素时,需要将被删除元素后面

浅谈Collection集合

俗话说:一个东西,一件事都离不开三句话:"是什么,为什么,怎么办" 集合是什么: 集合简单的说一个数组集合的高级体现,用来存储数据或对象的容器: 集合为什么存在: 集合只是体现了对数据操作的灵活度:大大方便了开发者的效率: 集合怎么使用: 使用分了以下几种方式:        Collection     集合   1.list    2.Set List           List            底层数据结构   查询 增删 线程   效率  ArrayList     数

集合框架概述

集合框架的作用 实际开发当中,我们经常会对一组相同类型的数据进行统一管理操作.到目前为止,我们可以使用数组.链表结构.二叉树结构来实现. 数组的最大问题在于数组中的元素个数是固定的,要实现动态数组,比较还是比较麻烦,自己实现链表或二叉树结构来管理对象更是不方便. 在JDK1.2版本后,JAVA完整的提供了类集合的概念,封装了一组强大的.非常方便的集合框架API,让我们在开发中大大的提高了效率. 集合中分为三大接口 Collection(集合). Map(映射).Iterator(迭代.便利) 集

深入java集合学习2-ArrayList的实现原理

ArrayList概述 类概述 ArrayList是List 接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素. 每个 ArrayList 实例都有一个容量(capacity).该容量是指用来存储列表元素的数组的大小.它大于或等于列表的大小.随着向 ArrayList 中不断添加元素,其容量也自动增长.在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量.这可以减少递增式再分配的数量.注意,此实现不是同

深入.net(集合)

Java培训.Android培训.iOS培训..Net培训.期待与您交流! 集合技术: 用于“批量数据”管理的重要技术,是数组技术的替代技术! 与数组技术的对比: 数组:只提供“存储的空间”,但缺乏各种数据管理措施! 集合:在数组的基础上,提供丰富的“属性”和“方法”,来方便我们对数据的访问,且不限定长度! 典型“集合类型”: 传统集合  ----- ArrayList.Hashtable (灵活.需要装拆箱.提取数据容易拆箱错误) 泛型集合  -----List<T>.      Dicti

树结构在程序设计中的运用

                                                                                引言 近年来,由于各种竞赛纷纷采用free-pascal,因此对于算法来说,空间效率上的要求降低了,而对时间效率却提出了更高的要求.这使得选手不仅要娴熟地掌握常规算法,而且要大胆创新,构造更高效的算法来解决问题. 在以往的程序设计中,链式结构采用得较多.的确链式结构有编程复杂度低.简单易懂等优点,但有一个致命的弱点:相邻的两个元素间的联系

[PY3]——基本语法

Python3基本语法-xmind图 常量/变量1.常量:一旦赋值就不可再改变.不能对它重新赋值.python不存在常量2.字面常量:一个单独出现的量,未赋值给任何变量或常量3.变量: i=3 print(i) 3 类型系统1.python是动态类型语言:指的是变量可以重新赋值为其他类型 In [5]: i=4;type(i) Out[5]: int In [6]: i='4';type(i) Out[6]: str 2.python是强类型语言:强类型指的是不同类型之间不能相互计算 In [7

重写equals方法,就应该重写Hashcode方法。反过来呢?

1.如果equals两个对象相同,那么hashcode也必须相同. 2.hashcode相同,两个对象equals不一定相同.(可能发生散列碰撞) 为了提高效率才实现hashcode方法,先进行散列,如果不同,就没必要比较equals了. 因为做散列的速度远远快于equals.. 减少了equals的比较次数,提高效率.集合中就是这么使用的.例如HashMap 散列碰撞概率 http://www.freezhongzi.info/?p=100

140字

跑男他们这一组做的游戏,首先按任务来 他们做的技术难度很高感觉.需要在android里面用flash我自己从来没有接触过.而且制作的难度也很大,反正就目前难度系数来说的话,可以秒杀我的DB天气了.然后就是吐槽的也是我最不能忍的就是美化方面做得太差劲了不是一般的差劲好么.感觉09年左右安卓app的水平..原谅我说话不好..主要是我自己很在意app的UI设计 用户体验最主要最直观的就是UI了.这个做好我觉得才是第一要务. CS小分队,因为他们队里面两个成员和我在一个宿舍.所以对他们比较了解.不得不说