集合包是Java中最常用的包,它最常用的有Collection和Map两个接口的实现类,Collection用于存放多个单对象,Map用于存放Key-Value形式的键值对。

Collection中常用的又分为两种类型的接口:List和Set,两者最明显的差别为List支持放入重复的对象,而Set不支持。List接口常用的实现类有:ArrayList,LinkedList,Vector和Stack;Set接口常用的实现有HashSet,TreeSet。而Map的常用实现有TreeMap和HashMap。

1. ArrayList基于数组方式实现,无容量的限制。

2. ArrayList在执行插入元素时可能要扩容,在删除数组时并不会减少数组的容量(如希望相应的减少数组的容量,可以调用ArrayList的trimToSize()),在查找元素时需要遍历数组,对于非null的元素采取equals的方式寻找。

3.ArrayList是非线程安全的。

1. LinkedList基于双向链表机制实现。

2. LinkedList在插入元素时,必须创建一个新的Entry对象,并切换相应元素的前后元素的引用;在查找元素时,须遍历列表;在删除元素时,要遍历列表,找到要删除的元素,然后从列表上将此元素删除即可。

3. LinkedList是非线程安全的。

从LinkedList和ArrayList的区别来看,我们可容易的得出什么时候使用ArrayList,什么时候使用LinkedList:

1)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。 
     2)  对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

三、Vector

和ArrayList的不同点有

1) Vector是基于Synchronized实现的线程安全的ArrayList。即Vector是线程安全的。

2)在插入元素时容量扩充的机制和ArrayList稍微有所不同,Vector是扩充2倍,并 可通过传入capacityIncrement来控制容量的扩充。 而ArrayList是扩充1.5倍并加1。

四、Stack

Stack继承与Vector,在Vector的基础上实现了Stack所要求的后进先出(LIFO)的弹出即压入操作,其提供了push,pop,peek等三个主要方法。

五、HashSet

1. HashSet基于HashMap实现,无容量限制。

2. HashSet是非线程安全的。

3. HashSet不保证有序。

六、TreeSet

1、TreeSet基于TreeMap实现,支持排序。

2、TreeSet是非线程安全的。

从对HashSet和TreeSet的描述来看,TreeSet和HashSet一样,也是完全基于Map来实现的,并且都不支持get(int)来获取指定位置的元素(需要遍历获取),另外TreeSet还提供了一些排序方面的支持。例如传入Comparator实现、descendingSet以及descendingIterator等。

七、HashMap

1、HashMap采用数组方式存储key,value构成的Entry对象,无容量限制。

2、HashMap基于Key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式来解决。

3、HashMap在插入元素时可能会要扩大数组的容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中。

4、HashMap是非线程安全的。

5、HashMap遍历使用的是Iterator

八、HashTable

1、HashTable是线程安全的。

2、HashTable中无论是Key,还是Value都不允许为null。

3.   HashTable遍历使用的是Enumeration。

曾经HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable,可以使用ConcurrentHashMap。那么几者之间有什么区别呢?

      1、HashTable的内部存储结构

HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:

1)、HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是synchronized。

2)、HashTable不允许有null值的存在。

在HashTable中调用put方法时,如果key为null,直接抛出NullPointerException。其它细微的差别还有,比如初始化Entry数组的大小等等,但基本思想和HashMap一样。

       2、HashTable和 ConcurrentHashMap的比较

ConcurrentHashMap是目前最好的线程安全的HashMap的实现。同样是线程安全的类,它与HashTable在同步方面有什么不同呢?

HashTable使用synchronized关键字来确保同步,而Synchronized其实是对对象加锁,不论你是在方法前加synchronized还是语句块前加, 锁住的都是对象整体 , 但是ConcurrentHashMap的同步机制和这个不同,它不是加synchronized关键字,而是基于lock操作的,这样的目的是保证同步的时候,锁住的不是整个对象。事实上,ConcurrentHashMap可以满足concurrentLevel个线程并发无阻塞的操作集合对象。

需要特别注意的是,我们在具体的项目开发中必须对HashMap的非线程安全保持足够的关注,如果在并发场景中不保持足够的同步,就有可能在执行HashMap.get是进入死循环,将CPU耗到100%。

1、TreeMap是一个典型的基于红黑树的Map实现,因此它要求一定要有Key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口。

2、TreeMap是非线程安全的。

java集合对象区别二的更多相关文章

  1. java集合对象区别一

    Vector和ArrayList 1.vector是线程同步的,所以他也是线程安全的,而ArrayList是线程异步的,是不安全的.如果不考虑到线程的安全因素,一般用ArrayList效率较高. 2. ...

  2. 转载---Java集合对象的深度复制与普通复制

    原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复 ...

  3. 2019/3/4 java集合学习(二)

    java集合学习(二) 在学完ArrayList 和 LinkedList之后,基本已经掌握了最基本的java常用数据结构,但是为了提高程序的效率,还有很多种特点各异的数据结构等着我们去运用,类如可以 ...

  4. Java 集合系列之二:List基本操作

    1. Java List 1. Java List重要观点 Java List接口是Java Collections Framework的成员. List允许您添加重复元素. List允许您拥有'nu ...

  5. JAVA集合类型(二)

    JAVA集合类型 (现代的变量集群) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0J ...

  6. Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet

    Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...

  7. 一图看懂Spring获取对象与java new对象区别

    Spring获取对象与java new对象的区别,图片被压缩了,请点击图片放大查看

  8. java集合框架(二):HashTable

    HashTable作为集合框架中的一员,现在是很少使用了,一般都是在面试中会问到其与HashMap的区别.为了能在求职的时候用上场,我们有必要对其原理进行解读. HashTable的实现原理跟Hash ...

  9. Java 集合框架(二)—— ArrayList

    二.数组列表 —— ArrayList 1.构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变. 它有个带 int 类型参数的构造方法,根 ...

随机推荐

  1. 通过JAVA反射修改JDK1.6*当中DNS缓存内容

    时间 2012-05-28 17:09:03  Taobao QA Team原文  http://qa.taobao.com/?p=15523 为了实现性能压测时的域名动态绑定功能,尝试通过java反 ...

  2. yum出现Error downloading packages错误

    yum出现Error downloading packages错误错误表现方式:yum可以list,可以clean cache,但是无法安装,错误提示: Downloading packages: E ...

  3. vs2010编译C++ 指向指针的指针

    #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _T ...

  4. Linux-hosts

    Linux-hosts hosts文件 /etc/hosts OS hosts (path) 使其生效,命令行执行 Windows (C:\Windows\System32\drivers\etc\h ...

  5. bzoj 4754: [Jsoi2016]独特的树叶

    不得不说这是神题. %%%   http://blog.csdn.net/samjia2000/article/details/51762811 #include <cstdio> #in ...

  6. 和为S的连续正整数序列(双指针法)

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  7. eshop2-linux 软件源配置 and 建议

    1. 阿里云源配置:http://mirrors.aliyun.com/ 2. 源配置 2.1 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r ...

  8. gem5-gpu 全系统FS模式 系统调用SE模式

    SE模式中无线程调度器,只能运行单线程程序,如SPEC CPU 2006,仅模拟片上CPU.GPU.Network和DRAM等. FS模式需加载虚拟Linux和磁盘,Linux负责线程调度.实现了Pt ...

  9. ubuntu18.04.2 Hadoop伪集群搭建

    准备工作: 若没有下载vim请下载vim 若出现 Could not get lock /var/lib/dpkg/lock 问题请参考: https://jingyan.baidu.com/arti ...

  10. C++ mfc 简易文本编辑器 遇到的一些问题

    [题目40]简易文本编辑器. 设计一个简易的文本编辑器. 设计要求: (1) 具有图形菜单界面: (2) 查找,替换(等长,不等长),插入(插串,文本块的插入).文本块移动(行块,列块移动),删除; ...