Java基础 - java容器

  Java的容器是用来存放对象数据,根据不同的业务需求选择不同的容器类型(List、Set、Queue、Map)。
这里写图片描述
  通过上述的图可以了解到Java的容器大致分成两类map类和Collection类

  • Collection 对象集合
    • List 对象有顺序集合
    • Set 对象不重复集合
    • Queue 对象先进先出集合
  • Map 对象键值对集合

一、Collection 容器

1.1 List 容器

  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,也就是说它是有顺序的,类似于Java的数组。和Set不同,List允许有相同的元素。

1.1.1 ArrayList

  基于数组实现的List类,它封装了一个动态的增长的、允许再分配的Object[]数组,相当于顺式存储。当向ArrayList中添加对象时,数组的大小也相应的改变。快速随即访问,你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的数组元素。向其中添加对象速度慢,当你创建数组时并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。操作其中对象的速度慢,当你要向数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。

1.1.2 LinkedList

  LinkedList相当于链式存储,它是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。操作其中对象的速度快,只需要改变连接,新的节点可以在内存中的任何地方。不能随即访问,虽然存在get()方法,但是这个方法是通过遍历接点来定位的,所以速度慢。

1.1.3 Vector

  Vector和ArrayList在用法上几乎完全相同,但由于Vector是一个古老的集合,所以Vector提供了一些方法名很长的方法,但随着JDK1.2以后,java提供了系统的集合框架,就将Vector改为实现List接口,统一归入集合框架体系中。

1.1.4 Stack

  Stack是Vector提供的一个子类,用于模拟”栈”这种数据结构(LIFO后进先出)

1.2 Set 容器

   Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。Set判断两个对象相同不是使用”==”运算符,而是根据equals方法。也就是说,我们在加入一个新元素的时候,如果这个新元素对象和Set中已有对象进行注意equals比较都返回false。 

1.2.1 HashSet

   HashSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。此类允许使用 null 元素。

1.2.2 LinkedHashSet

  LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但和HashSet不同的是,它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时(遍历)将有很好的性能(链表很适合进行遍历)。

1.2.3 TreeSet

  TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。

1.3 Queue 容器

  Queue用于模拟”队列”这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素,队列不允许随机访问队列中的元素。

1.3.1 PriorityQueue

  PriorityQueue并不是一个比较标准的队列实现,PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序。

1.3.2 Deque

  Deque接口代表一个”双端队列”,双端队列可以同时从两端来添加、删除元素,因此Deque的实现类既可以当成队列使用、也可以当成栈使用。

1.3.3 ArrayDeque

  是一个基于数组的双端队列,和ArrayList类似,它们的底层都采用一个动态的、可重分配的Object[]数组来存储集合元素,当集合元素超出该数组的容量时,系统会在底层重新分配一个Object[]数组来存储集合元素。

1.3.4 LinkedList

  LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

二、Map 容器

  Map用于保存具有”映射关系”的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value。key和value都可以是任何引用类型的数据。Map的key不允
许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false。

2.1 LinkedHashMap

  LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区分)。

2.2 HashMap

  和HashSet集合不能保证元素的顺序一样,HashMap也不能保证key-value对的顺序。并且类似于HashSet判断两个key是否相等的标准也是: 两个key通过equals()方法比较返回true,同时两个key的hashCode值也必须相等。

2.3 Hashtable

  底层是哈希表数据结构,不可以存入null键和null值,但是他是线程安全的。相比其他线程安全方式,hashtable的线程安全更耗性能。

总结

这里写图片描述

猜你喜欢

转载自blog.csdn.net/myt0929/article/details/80527823