Java的容器类其实就是集合类,只是为了不与Collection接口混淆,国内基本翻译为容器类。

容器类分为两种:独立元素序列的Collection和键值对的Map.

Collection主要有如下几种:

  1. List:按插入顺序保存元素;

    • ArrayList:擅长于随机访问元素,但是在List的中间插入和移除元素较慢;
    • LinkedList:插入删除代价较低,特性集比ArrayList大,但随机访问相对比较慢;
  2. Set:不重复保存元素;
    • HashSet:提供最快查找,使用了散列函数,顺序是杂乱的;
    • TreeSet:按照比较结果的升序保存对象,保留了HashSet的查询速度;
    • LinkedHashSet:按照被添加的顺序保存对象,使用了散列函数,同时保留了HashSet的查询速度;
  3. 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的容器类小结的更多相关文章

  1. Java的容器类Collection和Map

    一,概念 JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. java的容器类一共有两种主要类型,Colllection和Map. 两者的区别是:Collection是单个元素,而Map是存 ...

  2. java并发包小结(二)

    接上一篇 java并发包小结(一):http://blog.csdn.net/aalansehaiyang52/article/details/8877579 Future 接口Future 接口允许 ...

  3. java IO 流小结

    java IO 流小结 java流类图结构 流的分类 按方向 输入流 输出流 按类型 字节流 字符流 结论:只要是处理纯文本数据,就优先考虑使用字符流. 除此之外都使用字节流.

  4. Java:容器类线程不安全

    Java:容器类线程不安全 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. Collection 线程不安全的举例 前言 1.当我们执行下面语句的时候,底层 ...

  5. java Concurrent并发容器类 小结

    Java1.5提供了多种并发容器类来改进同步容器的性能. 同步容器将所有对容器的访问都串行化,以实现他们的线程安全性.这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重减低.  一 ...

  6. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  7. Java的容器类

    程序总是根据运行时才知道的某些条件去创建新对象.需要在任意时刻和任意位置创建任意数量的对象. 如果你想保存一组基本数据类型数据,建议使用数组,但是数组有固定的尺寸. 一般情况下,你在写程序时并不知道将 ...

  8. Java调用存储过程小结

    学生在学习jdbc的时候,会问到怎么调用存储过程,现在将java调用oracle存储过程的示例总结如下.(关于调用sqlserver的存储过程将在下次进行小结请关注) 一:无返回值的存储过程 存储过程 ...

  9. 性能测试工具LoadRunner13-LR之Virtual User Generator 创建java脚本以及小结

    Java vuser是自定义的java虚拟脚本,脚本中可以使用标准的java语言. 环境配置 1.安装jdk(注意:lr11最高支持1.6) 2.配置环境变量 3.在lr选择java Vuser协议 ...

随机推荐

  1. Oracle 11g RAC使用Manual和Policy Managed方法配置(转)

    原文地址:http://czmmiao.iteye.com/blog/2128771 软件环境: 操作系统:Red Hat Enterprise Linux 5.4(Tikanga)Oracle:11 ...

  2. XML文档的PHP程序查询代码

    PHP文档: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www ...

  3. shell 命令合并文本

    之前想把代码打印出来看来着,后来合并完之后放在word里发现有2000多页,然后放弃了~anyway,这个命令还是挺有用的. 比如我有文本a001.dat, a002.dat, a003.dat .. ...

  4. Cocos2d-x 多分辨率支持

    最近遇到多分辨率支持问题,所以查了一些资料.将一些收获共享一下,以便自己和其他需要的朋友日后参考. 如果我要建立一个cocos2d-x项目,我的目标是支持iphone3G( 480, 320 ),ip ...

  5. doubango(4)--SIP协议栈传输层的启动

    协议栈的默认传输结构 对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点.每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的 ...

  6. pureMVC简单示例及其原理讲解四(Controller层)

    本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...

  7. java工程打包成jar包,并且解压lib里的jar包

    在我们开发完java工程部署时,有时不需要web容器,为了方便部署有时候需要打成jar包. 这里介绍2种Eclipse打jar包的方式, 方式一.工程引用的jar包打在lib目录下 1.工程上右键,E ...

  8. [Machine Learning] 深度学习中消失的梯度

    好久没有更新blog了,最近抽时间看了Nielsen的<Neural Networks and Deep Learning>感觉小有收获,分享给大家. 了解深度学习的同学可能知道,目前深度 ...

  9. GIS制图人员的自我修养(1)--制图误区

    GIS制图人员的自我修养 by 李远祥 最近一直坚持写GIS制图的技术专题,并不是为了要介绍有什么好的技术和方法去制图,而是要告诉所有从事这一方向的人员一个铁铮铮的实现--要做好GIS制图,必须加强自 ...

  10. 数据库SQL,NoSQL之小感悟

    遇到1000万数据表 最近遇到一个问题,就是单表数据过的存储及查询问题.举个例子:1000万的数据存在一个表中,字段4-5个样子,日常 开发中难免要做过滤.排序.分页.如果把这几个放在一起即要过滤又要 ...