Java三大核心集合类详解

Java三大核心集合类详解_第1张图片

在Java三大核心集合类中,有两个(List、Set)都继承自Collection,它的重要性不言而喻。因此在介绍三大集合框架之前,我们先要了解Collection。Collection位于java.util包中,是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。
既然讲到了集合,什么是集合?集合的本质上是一种容器,而我们所熟知的数组本质上也是一种容器,它们二者的主要区别在于:
1.集合可以存储任意对象数据,而数组只能存储单一数据类型的数据
2.数组的长度不可变,而集合的长度则是可变的

在编写程序的过程中,使用到集合类,要根据不同的需求,来决定使用哪种集合类,比如,要经常遍历集合内元素,就要使用List,如果要保证集合中不存在重复的数据,就要用Set;如果要通过某一键来查找某一值,就要使用Map。

List (继承自Collection)

特点:容量可变、可按索引访问集合中元素、集合中的元素有序、并且可重复

列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。

具体实现类:

  • ArrayList:实现基于数组,规模可变,适合快速随机存取,非线程安全。
  • LinkedList:实现基于链表,适用于顺序插入或者删除。并且提供了List接口中所没有的获取头元素尾元素等方法,可以像队列、站或者链表一样使用。
  • Vector:实现基于数组,类似于AarryList,但是线程安全,因此效率较低。

Set(继承自Collection)

Set是一种不包含重复的元素的无序Collection。
特点:集合中的元素不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。对Set中成员的访问和操作是通过Set中对象的引用进行的,所以集中不能有重复对象。这也是Set与List类的最大区别。

具体实现类:

  • TreeSet:按红黑树方式有序不重复
  • HashSet:无序不重复。在HashSet的默认实现中,初始容量16,负载因子为0.75,也就是说当有75%的空间已被使用,将会进行一再散列(再哈希),之前的散列表(数组)将被删除,新增加的散列是之前散列表长度的2倍,最大值Integer.MAX_VALUE。
  • LinkedHashSet:按放入顺序有序不重复

Map

Map是一个单独的接口,不继承于Collection。Map是一种把键对象和值对象进行关联的容器。
特点:key不允许重复。

具体实现类:

  • HashMap:实现一个键到值映射的哈希表,通过键取得值对象,没有顺序,通过get(key)来获取value,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个),不是线程安全的。去掉了HashTable中有歧义的的contains()方法,改成了containsKey()和containsValue()方法。
  • HashTable:实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。是线程安全的。
  • TreeMap:基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
  • LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
  • weakHashMao:弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。

    当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。Hashtable的使用不被推荐,因为HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以转换为同步的。


Tips:
1.SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序
2.heap和stack有什么区别
  heap是堆,stack是栈。
  stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。
  stack空间有限,heap的空间是很大的自由区。
3.这些类的对比与选择:
如果涉及到堆栈队列等操作,应该考虑List中的stack,queue
对于需要快速插入删除元素,应该使用linkedlist
如果需要快速随机访问元素,应该选用arraylist
如果程序在单线程环境中,选用非同步类
如果在多线程中,选用同步类vector、stack和hashtable以及其子类。

你可能感兴趣的:(java)