数组和集合的效率问题数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素。但是速度是要有代价的,当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的。还有一点,JAVA里面的数组是会做边界检查的,所以当你越界访问时,会抛出RuntimeException,所以不用担心在C或C++因为不做边界检查而出现的问题了,当然边界检查是以牺牲效率为代价的。数组与其它容器类的区别体现在三个方面:效率、类型识别和可以持有primitives。

int sum = 0;

int[] arrays = new int[100000000];

ArrayList list = new ArrayList();

for(int i=0;i<100000000;i++) {

list.add(0);

}

Long time01 = System.currentTimeMillis();

for(int i=0;i<100000000;i++) {

sum += arrays[i%10];

}

Long time02 = System.currentTimeMillis();

System.out.println("数组求和所花费的时间:"+(time02-time01)+"毫秒");

Long time03 = System.currentTimeMillis();

for(int i=0;i<100000000;i++) {

sum += list.get(i%10);

}

Long time04 = System.currentTimeMillis();

System.out.println("集合求和所花费的时间:"+(time04-time03)+"毫秒");

数组求和所花费的时间:144毫秒

集合求和所花费的时间:175毫秒

在追求计算效率的地方,我们应该用数组。

2. 集合Collection 接口的接口 对象的集合

├ List 子接口 按进入先后有序保存 可重复

│├ LinkedList 接口实现类 链表 插入删除 没有同步 线程不安全

│├ ArrayList 接口实现类 数组 随机访问 没有同步 线程不安全

│└ Vector 接口实现类 数组 同步 线程安全

│   └ Stack

└ Set 子接口 仅接收一次,并做内部排序

├ HashSet

│   └ LinkedHashSet

└ TreeSet

List容器侧重于顺序,添加元素是按顺序保存,并且允许重复元素,使用此容器能够保证元素下标位置的精确。

用户能够使用索引(也就是位置,可以理解为数组中的下标)来访问 List 中的元素。

对于 Set ,只关心某元素是否属于 Set (不允许有相同元素 ),而不关心它的顺序。Map 接口 键值对的集合

├ Hashtable 接口实现类 同步 线程安全

├ HashMap 接口实现类 没有同步 线程不安全

│├ LinkedHashMap

│└ WeakHashMap

├ TreeMap

└ IdentifyHashMap

对于 Map ,最大的特点是键值映射,且为一一映射,key不能重复value可以,所以是用键来索引值。

方法 put(Object key, Object value) 添加一个“值” (真实的值 ) 和与“值”相关联的“键” (key) ( 索引 ) 。方法 get(Object key) 返回与给定“键”相关联的“值”。

Map 同样对每个元素保存一份,但这是基于 ” 键 ” 的, Map 也有内置的排序方法,因而不关心元素添加的顺序(我们无法干涉元素的顺序)。

如果添加元素的顺序对你很重要,应该使用 LinkedHashSet 或者 LinkedHashMap.

对于效率, Map 由于采用了哈希散列,查找元素时明显比 ArrayList 快。

HashMap线程不安全,效率比HashTable高。反之HashTable线程更安全。HashMap不安全是因为底层维护了一个数组,在多线程访问这个数组就不安全。

综上所述,在集合中Map效率最高,那Map和数组谁更快?

insert和delete时,Map效率高,因为底层是链表(长度比较小的时候)。

select和update的时候,数组最快,毕竟有下标,也就是有地址,直达列车。在查改方面数组可以通过索引迅速确定位置,而链表只能依次寻找,所以数组有着无法匹敌的优势。而在增删方面,数组每次插入元素都要将该元素后面的所有元素向后挪动一位,删除则将该元素之后所有元素向前移动一位。而链表在插入元素的时候,只需将该元素前驱的指针指向本身,将本身的指针指向后驱,删除则将该元素的前驱指向该元素的后驱。相比之下,链表确实优势挺大。

在容器长度很大(几千上万时),增删改查都是数组有优势。

java 一个数组key一个数组value_在各种语言中,使用key在map中获取value 和 使用下标获取数组中的数据 相比哪个更快?...相关推荐

  1. c语言中数组的变量j是什么,C语言中x[i][j]的意思是?

    x[i][j]是一个二维数组中成员数组中的一个成员(当i值和j值固定的时候) 当你定义这个数组时(假设i和j是数字),int x[i][j];他就会生成一个具有i个包含j个int型变量的数组的数组(可 ...

  2. C语言中的int8_t,uint8_t, int16_t,uint16_t, int32_t,uint32_t, int64_t,uint64_t和int数组,char数组以及sizeof()的理解

    C语言中的数据类型理解 前言 一.嵌入式开发过程中常遇到的数据类型 二.关于printf的使用 前言 根据开发需要决,用 char 时,数组每个元素的 字长与存储单元 是1个byte(16进制2位,2 ...

  3. 单片机c语言中void key(void),STC单片机C语言通用万能编程模板

    <STC单片机C语言通用万能编程模板>由会员分享,可在线阅读,更多相关<STC单片机C语言通用万能编程模板(23页珍藏版)>请在人人文库网上搜索. 1.8051 单片机 C 语 ...

  4. 在c语言中,可以使用动态内存分配技术定义元素个数可变的数组,C语言复制在线考题1精选.doc...

    C语言复制在线考题1精选 窗体顶端 <C语言程序设计208304>综合测试 返回测验列表 大项 1 / 2 - 单项选择题 60.0/ 70.0 分 本大题共35道,每题2分,共计70分, ...

  5. 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

    本文并不讲C语言的基础 文章目录 1 空struct的大小 2 结构体与柔性数组 2.1 柔性数组的使用方法 2.2 柔性数组使用代码案例分析 3 C语言中的union分析 3.1 使用union判断 ...

  6. linux中向空文件写入内容,linux – 为什么写入现有文件比写一个新的空文件更快?...

    我使用MappedByteBuffer在linux中编写文件. File file = new File("testFile"); RandomAccessFile raf = n ...

  7. java可以使用c语言中的输入,c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  8. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  9. Java黑皮书课后题第7章:7.16(执行时间)编写程序,随机产生一个包含100 000个整数的数组和一个关键字。估算调用程序清单7-6中的linearSearch方法的执行时间

    7.16(执行时间)编写程序,随机产生一个包含100 000个整数的数组和一个关键字.估算调用程序清单7-6中的linearSearch方法的执行时间 题目 题目描述 程序清单7-6的linearSe ...

最新文章

  1. 百架无人机“失控撞楼”,程序员写的 Bug?
  2. java学习曲线建议
  3. 本土品牌“资源诅咒”之下,为何李宁逆袭,达芙妮跌落?
  4. 电脑桌面便签_在电脑桌面使用敬业签怎么操作退出团队便签?
  5. ansible模块介绍
  6. linux内核态获取ip地址,Linux内核支持动态获取IP地址
  7. hdata datax交流总结
  8. 2014-08-06 小代码,大道理
  9. C#、JS、HTML - 转义字符
  10. SQL必知必会 课后题答案
  11. IR2103驱动+双H桥电路=步进电机
  12. Python汉诺塔递归算法实现
  13. warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  14. RabbitMQ整合SpringCloud
  15. Premiere银色金属玻璃质感logo标志片头AE模板mogrt
  16. ps裁剪和裁切的区别_ps裁剪工具怎么用?调整图像与画布的尺寸(三)
  17. JAVA毕业设计vue健康餐饮管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  18. 计算机各类语言的区别
  19. 图书管理系统需求规格说明文档目录_软件需求分析教与学(教学大纲)
  20. 怀旧服背包显示本服务器金,WOW怀旧服1.13.5说明:赠送4个背包格 开放仇恨数值API...

热门文章

  1. Python Imaging Library: ImageStat Module(图像统计模块)
  2. 光电整纬机(日本世联电子株式会社)
  3. 不了解这些“高级货”,活该你面试当炮灰。。。【石杉的架构笔记】
  4. Axure-----三级下拉菜单的具体实现过程
  5. 【刷算法】LeetCode- 阶乘后的零
  6. 基于vue-cli的webpack配置优化
  7. 明天支付宝就开始提现收费了!这几招可以让你受用
  8. [C#]方法示例:判断是否闰年
  9. 【转】B树的插入和删除
  10. HVXC(Harmonic Vector Excitation Coding):