Java的容器类小结
Java的容器类其实就是集合类,只是为了不与Collection接口混淆,国内基本翻译为容器类。
容器类分为两种:独立元素序列的Collection和键值对的Map.
Collection主要有如下几种:
- List:按插入顺序保存元素;
- ArrayList:擅长于随机访问元素,但是在List的中间插入和移除元素较慢;
- LinkedList:插入删除代价较低,特性集比ArrayList大,但随机访问相对比较慢;
- Set:不重复保存元素;
- HashSet:提供最快查找,使用了散列函数,顺序是杂乱的;
- TreeSet:按照比较结果的升序保存对象,保留了HashSet的查询速度;
- LinkedHashSet:按照被添加的顺序保存对象,使用了散列函数,同时保留了HashSet的查询速度;
- Queue:按排队规则顺序保存元素;
Map:一组成对的“键值对”对象,允许键来查找值,有如下几种:
- HashMap:提供最快的查找,没有明显顺序保存对象;
- TreeMap:按照比较结果的升序保存键,保留了HashMap的查询速度;
- LinkedHashMap:按照插入的顺序保存键,保留了HashMap的查询速度;
示例
package net.oseye; import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; public class RunMain { public static void main(String[] args) {
int total=1000000; List<Integer> arrayList=new ArrayList<Integer>();
List<Integer> linkedList=new LinkedList<Integer>();
long start=System.currentTimeMillis();
for(int i=0;i<total;i++){
arrayList.add(i);
}
long end=System.currentTimeMillis();
System.out.println("ArrayList插入数据时间:"+(end-start)); start=System.currentTimeMillis();
for(int i=0;i<total;i++){
linkedList.add(i);
}
end=System.currentTimeMillis();
System.out.println("LinkedList插入数据时间:"+(end-start)); start=System.currentTimeMillis();
Iterator<Integer> itArrayList=arrayList.iterator();
while(itArrayList.hasNext()){
itArrayList.next();
}
end=System.currentTimeMillis();
System.out.println("ArrayList顺序访问时间:"+(end-start)); start=System.currentTimeMillis();
Iterator<Integer> itLinkedList=linkedList.iterator();
while(itLinkedList.hasNext()){
itLinkedList.next();
}
end=System.currentTimeMillis();
System.out.println("LinkedList顺序访问时间:"+(end-start)); start=System.currentTimeMillis();
for(int i=0;i<total;i++){
arrayList.get(i);
}
end=System.currentTimeMillis();
System.out.println("ArrayList随机访问时间:"+(end-start)); start=System.currentTimeMillis();
for(int i=0;i<total;i++){
linkedList.get(i);
}
end=System.currentTimeMillis();
System.out.println("LinkedList随机访问时间:"+(end-start));
}
}
输出
ArrayList插入数据时间:219
LinkedList插入数据时间:266
ArrayList顺序访问时间:15
LinkedList顺序访问时间:16
ArrayList随机访问时间:16
输出结果少了一条“随机访问时间”,因为实在太慢了,我等了20+分钟一直没出现结果,就先放弃了。
而插入时间ArraryList反而快,估计是因为都是在尾部添加所致,如果随机插入就可以看出结果了:
package net.oseye; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; public class RunMain { public static void main(String[] args) {
int total=100000; List<Integer> arrayList=new ArrayList<Integer>();
List<Integer> linkedList=new LinkedList<Integer>(); for(int i=0;i<1000;i++){
arrayList.add(i);
}
for(int i=0;i<1000;i++){
linkedList.add(i);
} long start=System.currentTimeMillis();
for(int i=0;i<total;i++){
arrayList.add(800,i);
}
long end=System.currentTimeMillis();
System.out.println("ArrayList插入数据时间:"+(end-start)); start=System.currentTimeMillis();
for(int i=0;i<total;i++){
linkedList.add(800,i);
}
end=System.currentTimeMillis();
System.out.println("LinkedList插入数据时间:"+(end-start));
}
}
输出
ArrayList插入数据时间:3391
LinkedList插入数据时间:203
PS:我这里一直存在一个疑问:我使用迭代器遍历,是否就是传说中的顺序访问呢?(待解决)
Java的容器类小结的更多相关文章
- Java的容器类Collection和Map
一,概念 JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. java的容器类一共有两种主要类型,Colllection和Map. 两者的区别是:Collection是单个元素,而Map是存 ...
- java并发包小结(二)
接上一篇 java并发包小结(一):http://blog.csdn.net/aalansehaiyang52/article/details/8877579 Future 接口Future 接口允许 ...
- java IO 流小结
java IO 流小结 java流类图结构 流的分类 按方向 输入流 输出流 按类型 字节流 字符流 结论:只要是处理纯文本数据,就优先考虑使用字符流. 除此之外都使用字节流.
- Java:容器类线程不安全
Java:容器类线程不安全 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. Collection 线程不安全的举例 前言 1.当我们执行下面语句的时候,底层 ...
- java Concurrent并发容器类 小结
Java1.5提供了多种并发容器类来改进同步容器的性能. 同步容器将所有对容器的访问都串行化,以实现他们的线程安全性.这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重减低. 一 ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- Java的容器类
程序总是根据运行时才知道的某些条件去创建新对象.需要在任意时刻和任意位置创建任意数量的对象. 如果你想保存一组基本数据类型数据,建议使用数组,但是数组有固定的尺寸. 一般情况下,你在写程序时并不知道将 ...
- Java调用存储过程小结
学生在学习jdbc的时候,会问到怎么调用存储过程,现在将java调用oracle存储过程的示例总结如下.(关于调用sqlserver的存储过程将在下次进行小结请关注) 一:无返回值的存储过程 存储过程 ...
- 性能测试工具LoadRunner13-LR之Virtual User Generator 创建java脚本以及小结
Java vuser是自定义的java虚拟脚本,脚本中可以使用标准的java语言. 环境配置 1.安装jdk(注意:lr11最高支持1.6) 2.配置环境变量 3.在lr选择java Vuser协议 ...
随机推荐
- 【HDU 5808】 Price List Strike Back (整体二分+动态规划)
Price List Strike Back There are nn shops numbered with successive integers from 11 to nn in Bytelan ...
- awakeFromNib与initWithCoder
- Delphi操作XML
Delphi操作XML Delphi操作XMl,只要使用 NativeXml.我是用的版本是4..NativeXML的使用方法比较简单,但是功能很强大. XE2的话,要在simdesign.inc后面 ...
- delphi 字符串查找替换函数 转
1. 提取字符串中指定子字符串前的字符串 Function Before( Src:string ; S:string ): string ; Var F: Word ; begin ...
- js模块化开发——require.js的实战写法1
关于在Require.js使用一个JS插件的问题 我需要在项目中引用一个js控件,这个控件依赖于a.js,b.js,c.js,.....n.js N多个js以及jquery及jquery-ui,各js ...
- MySQL只恢复某个库或某张表
在Mysqldump官方工具中,如何只恢复某个库呢? 全库备份 [root@HE1 ~]#mysqldump -uroot -p --single-transaction -A --master-da ...
- SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config
在上一篇文章中,我们已经了解到了如何在SuperSocket处理客户端请求. 同时我们可能会发现一个问题,如果我们的服务器端包含有很多复杂的业务逻辑,这样的switch/case代码将会很 ...
- [html5] 学习笔记-表单新增的元素与属性(续)
本节主要讲解表单新增元素的controls属性.placeholder属性.List属性.Autocomplete属性.Pattern属性.SelectionDirection属性.Indetermi ...
- 腾讯优图及知脸(ZKface)人脸比对接口测试(python)
一.腾讯优图 1.开发者地址:http://open.youtu.qq.com/welcome/developer 2.接入流程:按照开发者页面的接入流程接入之后,创建应用即可获得所需的AppID.S ...
- 《Effective Objective-C 2.0》 读后总结
感觉自己最近提升很慢了.然后去找了一些面试题看看.发现自己自大了.在实际开发中,让我解决bug.编写功能,我有自信可以完成.但是对项目更深层的思考,我却没有.为了能进到自己的目标BAT.也为了让自己更 ...