Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:

(1)Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序。

(2)Map。一组成对的“键值对”对象,允许你使用键来查找值。映射表让我们能够使用一个对象来查找另一个对象,就像“字典”一样。Map是强大的编程工具。

Map接口和Collection接口的不同

Map是双列的,Collection是单列的

Map的键唯一,Collection的子体系Set是唯一的

Map集合的数据结构是针对键有效,跟值无关

Collection集合的数据结构是针对元素有效

一, Collection接口
(1). collection接口的成员方法
​ 增加: boolean add(E e)
​ 删除: boolean remove(Object o)
​ 清空: void clear()
​ 包含: boolean contains(Object o)
​ 判断为空: boolean isEmpty()
​ 容量: int size()

​ boolean addAll(Collection c)
​ boolean removeAll(Collection c)
​ boolean containsAll(Collection c)
​ boolean retainAll(Collection c)

(2). Object[] toArray()
​ 把集合转成数组,可以实现集合的遍历.

(3). Iterator iterator()
​ 迭代器,集合的专用遍历方式.

使用方法iterator()要求容器返回一个Iterator

boolean hasNext() 检查是否有下一个元素

E next() 获取下一个元素

remove() 将迭代器新进返回的元素删除

1, List接口(继承Connection)
ArrayList(开发中用的很多)
底层数据结构是一个自增长的数组,查询快,增删慢.
线程不安全,效率高.
LinkedList
底层数据结构是链表(存储地址不连续),查询慢,增删快
线程不安全,效率高
LinkedList类特有功能
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()
Vector
底层数据结构是也是数组,查询快,增删慢.

线程安全,效率低.

Vector类特有功能:

public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()

2, Set接口(继承Connection)
​ Set是一个不包含重复元素的 collection。Set中最常被使用的是测试归属性,你可以很容易的查询某个对象是否在其中。正因如此,查找成了set中的重要操作,因此你通常都会选择一个HashSet实现,它专门进行了优化。

​ Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像List一样有不同的list。实际上Set就是Collection,只是行为不同。加入Set的元素必须定义equals方法以确保对象的唯一性

HashSet:为快速查找而设计的Set。存入HashSet的元素必须定义hashCode()方法,不保证set的迭代顺序,特别是它不保证该顺序恒久不变。
HashSet如何保证元素唯一性?底层数据结构是哈希表(元素是链表的数组)哈希表依赖于哈希值存储添加功能底层依赖两个方法: int hashCode()
boolean equals(Object obj)

LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。元素也必须定义hashCode()方法

元素有序唯一
由链表保证元素有序
由哈希表保证元素唯一
TreeSet:保持次序的set,底层为树结构。使用它可以从set中提取有序的序列。元素必须实现Comparable接口。
使用元素的自然顺序对元素进行排序
或者根据创建 set 时提供的 Comparator 进行排序
具体取决于使用的构造方法。
必须提的一点:TreeSet是如何保证元素的排序和唯一性的?

​ 底层数据结构是红黑树(红黑树是一种自平衡的二叉树)!

各种set集合性能分析
HashSet和TreeSet是Set集合中用得最多的集合。HashSet总是比TreeSet集合性能好,因为HashSet不需要额外维护元素的顺序。
LinkedHashSet需要用额外的链表维护元素的插入顺序,因此在插入时性能比HashSet低,但在迭代访问(遍历)时性能更高。因为插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素。
EnumSet元素是所有Set元素中性能最好的,但是它只能保存Enum类型的元素
3, Queue接口
Queue队列,它主要分为两大类,一类是阻塞式队列,队列满了以后再插入元素则会抛出异常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另一类则是双端队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、**LinkedList**。
1
​ Queue用于模拟队列这种数据结构,队列通常是指“先进先出”的容器。队列的头部保存在队列中时间最长的元素,队列的尾部 保存在队列中时间最短的元素。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
Queue接口中定义了如下操作方法:
​ void add(Object e): 将指定元素加入此队列的尾部。
​ Object element(): 获取队列头部的元素,但是不删除该元素。
​ boolean offer(Object e): 将指定元素加入此队列的尾部。当使用有容量限制的队列时,此方法通常比add(Object e)方法更好。
​ Object peek(): 获取队列头部的元素,但是不删除该元素。如果此队列为空,则返回null。
​ Object poll(): 获取队列头部的元素,并删除该元素。如果此队列为空,则返回null。
​ Object remove(): 获取队列头部的元素,并删除该元素。
Queue有两个常用的实现类:LinkedList和PriorityQueue。

​ LinkedList类 是一个比较奇怪的类,它是List接口的实现类–这意味着它是一个List集合,可以根据索引来随机访问集合中的元素。除此之外,LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列Deque接口里定义了一些可以双向操作队列的方法。

​ LinkedList与ArrayList的实现机制完全不同,ArrayList内部以数组的形式来保存集合中的元素,因此随机访问集合元素上有较好的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但在插入、删除元素时性能非常出色(只需改变指针所指的地址即可)。
通常的编程过程中无须理会ArrayList和LinkedList之间的性能差异,只需知道LinkedList集合不仅提供了List的
功能,还额外提供了的双向队列、栈的功能。但在一些性能非常敏感的地方,可能需要慎重选择哪个List实现。

4, Map接口(实现Connection)
Map的思想,映射表(也可以称为关联数组)的基本思想是它维护的键-值(对)关联,因此你可以使用键来查找值。标准的Java类库中包含了Map的集中基本实现类,包括HashMap,TreeMap、LinkedHashMap、WeakHashMap,ConcurrentHashMap、IdentityHashMap。它们都有同样的基本接口Map,但是行为特效各不同,这表现在效率、键值对的保存及呈现次序、对象的保存周期、映射表如何在多线程程序中工作和判定“键”等价的策略等方面。Map接口实现的数量应该可以让你感觉到这种工具的重要性。
1
Map接口成员方法:

V put(K key,V value)
V remove(Object key)
void clear()
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
int size()
V get(Object key)
Set keySet()
Collection values()
Set<Map.Entry<K,V>> entrySet()
这里提一下Map的遍历方式吧:

方式1:根据键找值
获取所有键的集合
遍历键的集合,获取到每一个键
根据键找值

方式2:根据键值对对象找键和值

获取所有键值对对象的集合
遍历键值对对象的集合,获取到每一个键值对对象
根据键值对对象找键和值
1
2
3
HashMap:Map基于散列表的实现(它取代 了Hashtable)。插入和查询“键值对”的开销是固定的。可以通过构造器设置容器和负载因子,以调整容器的性能。
LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用的(LRU)的次序。只是比HashMap慢一点,而在迭代访问时,反而更快,因为它使用链表维护内部次序。
TreeMap:基于红黑树的实现,查看“键”或“键值对”时,它们会被排序(次序由Comparable或Comparator决定)。TreeMap的特点在于所得到的结果是经过排序的。TreeMap是唯一带有subMap()方法的Map,它可以返回一个子树
WeakHashMap:弱键(weak key)映射,允许释放映射所指向的对象,这是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此键可以被垃圾回收器回收。
ConcurrentHashMap:一种线程安全的Map,它不涉及加同步锁。
IdentityHashMap:使用==代替equals()对“键”进行比较的散列映射。专为解决特殊问题而设计的。
既然谈到了HashMap那么就来总结一下与Hashtable的不同,最直观的方法,看其底层实现的源码。

1.它们的家族就不同,虽然都实现了Map接口,但HashMap是继承自AbstractMap,Hashtable继承自古老的Dictionary

2.HashMap是允许key为null的,而Hashtbale是不允许的

3.在Hashtable的源码里,一眼我们就能看到一个关键字 -----**synchronized ,**所以其是线程同步的,HashMap不是线程同步的,所以效率会高上一些,简而言之,HashMap是Hashtable的轻量级实现(非线程安全实现)

​ 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。

二、各种集合的异同点
1、Vector和ArrayList
1,vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。
2,如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.如果在集合中使用数据量比较大的数据,用vector有一定的优势。
3,如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以。而如果移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用arraylist,因为它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。

ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
1
2
3
4
5
2、Aarraylist和Linkedlist
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
1
2
3
这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

3、HashMap与TreeMap
1、 HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。

2、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。 TreeMap没有这个调优选项,因为该树总处于平衡状态。
1
2
3
4、hashtable与hashmap
1、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 。

2、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 。

3、值:只有HashMap可以让你将空值作为一个表的条目的key或value 。
1
2
3
4
5
三、对集合的选择
1、对List的选择
1、对于随机查询与迭代遍历操作,数组比所有的容器都要快。所以在随机访问中一般使用ArrayList

2、LinkedList使用双向链表对元素的增加和删除提供了非常好的支持,而ArrayList执行增加和删除元素需要进行元素位移。

3、对于Vector而言,我们一般都是避免使用。

4、将ArrayList当做首选,毕竟对于集合元素而已我们都是进行遍历,只有当程序的性能因为List的频繁插入和删除而降低时,再考虑LinkedList。
1
2
3
4
5
6
7
2、对Set的选择
1、HashSet由于使用HashCode实现,所以在某种程度上来说它的性能永远比TreeSet要好,尤其是进行增加和查找操作。

3、虽然TreeSet没有HashSet性能好,但是由于它可以维持元素的排序,所以它还是存在用武之地的。
1
2
3
3、对Map的选择
1、HashMap与HashSet同样,支持快速查询。虽然HashTable速度的速度也不慢,但是在HashMap面前还是稍微慢了些,所以HashMap在查询方面可以取代HashTable。

2、由于TreeMap需要维持内部元素的顺序,所以它通常要比HashMap和HashT

Java 集合介绍,常用集合类的更多相关文章

  1. java集合介绍(List,Set,Map)

    前言 介绍java的常用集合+各个集合使用用例 欢迎转载,请注明作者和出处哦☺ 参考: 1,<Java核心编程技术(第二版)> 2, http://www.cnblogs.com/Litt ...

  2. JAVA集合介绍

    一.集合概述 Java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储.而数组长度固定,不能满足变化的要求.所以,java提供了集合. 特点 1.        长度可以发 ...

  3. Java 集合介绍

    1, Set :集合中对象不按特定的方式排序,并且没有重复对象,它有些实现类能对集合按特定方式排序 List :集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索独享,Li ...

  4. HashSet HashTable HashMap的区别 及其Java集合介绍

    (1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...

  5. java集合:常用集合的数据结构

    List 有序可重复 ArrayList ArrayList数据结构是数组.查询快,增删慢.ArrayList是线程不安全的,允许元素为null . Vector 线程安全的数组,效率较差,已经过时不 ...

  6. 「 深入浅出 」java集合Collection和Map

    本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...

  7. java集合迭代器

    一.Java中有一个设计模式是迭代器模式 1.迭代器模式定义迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.迭代器模式概述Java集合框 ...

  8. java集合-数组ArrayList

    1.简介 ArrayList是java集合框架常用的集合类之一,底层是基于数组来实现容量大小动态变化的. 2.类图(JDK 1.8) 下图是ArrayList实现的接口和继承的类关系图: public ...

  9. Java集合 -- ArrayList集合及应用

    JAVA集合 对象数组 集合类之ArrayList 学生管理系统 斗地主案例 NO.one 对象数组 1.1 对象数组描述 A:基本类型的数组:存储的元素为基本类型 int[] arr={1,2,3, ...

随机推荐

  1. netcat瑞士军刀实现电脑远程控制termux

    关于nc实现远程控制termux 1.首先termux安装namp pkg install namp 2.windows系统安装netcat 此为netcat下载连接 下载得到zip压缩包,解压得到里 ...

  2. 【转载】C#指定文件夹下面的所有内容复制到目标文件夹下面

    在涉及到文件夹操作的过程中,有时候需要将文件夹下的所有内容复制拷贝到另一个文件夹,在C#的开发中有时候会遇到这个功能需求将指定文件夹下所有的内容复制到另一个文件夹,这个过程需要遍历所有的文件和目录.此 ...

  3. 【转】SpringCloud学习笔记(一)——基础

    什么是微服务架构 简单地说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进 ...

  4. 记一次bypass某场景GD库及拓展分析

    0x00 前言 gou楼兰师傅发来个站说是过不了gd库,问我有啥办法没有,给了他之前海贼师傅说的jpg_payload脚本,但是绕不过,问他拿了站点,写了个jpg_payload批量的fuzz脚本,f ...

  5. 使用pandoc制作幻灯片

    示例Md % Habits % John Doe % March 22, 2005 # In the morning ## Getting up - Turn off alarm - Get out ...

  6. 关于MUI页面之间传值以及刷新的问题

    一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...

  7. 【nodejs代理服务器四】代理服务器增加频繁访问的ip加入黑名单

    问题 渗透者在扫站的时候会频繁请求,我们可以做一些策略来封堵这些频繁访问的ip,把ip加入黑名单. 策略 2秒之内访问次数超过100,加入黑名单. 实现思路 初次访问把访问Ip作为键,访问ip,时间, ...

  8. 第十七篇:WEB服务器之HTTP协议

    本篇主要为为了实现WEB服务器,其中包含了HTTP协议的理解,以及TCP的三次握手.四次挥手等方面相关知识,同时还包含了关于web浏览器与服务器之间的通信过程. 一.web浏览器 通常在我们上网时会在 ...

  9. 基于ELK的日志分析、存储、展示

    原文:https://blog.51cto.com/11134648/2163789 ELK简介 ELK是一套完整的日志解决方案,由ElasticSearch.Logstash. Kibana这三款开 ...

  10. 遍历SQL SERVER中所有存储过程和触发器

    如果需要查找某个存储过程或触发器中是否含有某段文本(比如:你想知道有哪些存储过程操作了某个表) 可以这么写 select name from sysobjects o, syscomments s w ...