Java集合框架总结

来源:互联网 发布:php推广系统源码 编辑:程序博客网 时间:2024/06/10 20:59

  Java集合类框架如下图所示:
  
  image_1b8ejdtlv1a5r1v3g137p1rjg10al9.png-47.5kB
  

Collection

  Collection接口概括了序列的概念——一种存放一组对象的方式。Collection接口继承了迭代接口Iterable,有三个主要的子接口List,Set和Queue,需要注意,Map不是Collection的子接口。
  
  Collection接口包含的方法如下:
  
  image_1b8elf42n17tgftd75jm3focn13.png-56.9kB
  

List

  List会按照插入的顺序保存元素。 List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。
  
  List包含的方法如下:
  
  image_1b8eneivfv5n5ps11gnd5khs1t.png-85.7kB
  
  有两种类型List:Arraylist和LinkedList。
  

  ArrayList

  ArrayList类封装了一个动态再分配的Object[]数组。它擅长于随机访问元素。
  
  ArrayList类包含的方法如下:
  
  image_1b8enuqgv1ium176n1b731j8t11jk2a.png-96.4kB
  
  此外,在Java中有一个接口RandomAccess,这是一个特征接口,该接口没有任何方法,通常使用该接口来测试某个类是否支持有效的随机访问。ArrayList实现了该接口:
  
  image_1b8eo8o9l1ddi9je1ia0ik0eit2n.png-46.2kB

  LinkedList
  
  LinkedList是一种链式存储结构,它通过代价较低地在List中进行插入和删除操作,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢,但是当在集合中间位置执行插入或者删除操作较多时,效率要比ArrayList快很多。
  
  LinkedList类包含的方法如下:
  
  image_1b8eojb891rr3gs21jtn18t21l6034.png-173.3kB
  

Set

  Set不保存重复的元素。 如果你试图将相同对象的多个实例添加到一个Set中,那么它会阻止这种重复现象:
  
  image_1b8eovo9jkvh1iqre31gvm1n2j3h.png-44.4kB
  
  Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同。
  加入Set中的元素必须定义equals()方法以确保对象的唯一性。Set接口不保证维护元素的次序。
  Set接口的常见实现类有HashSet,LinedHashSet和TreeSet。
  

  HashSet
  
  HashSet是为了快速查找而设计的Set,存入HashSet的元素必须定义hashCode()方法。
  通常情况下,如果没有其他的限制,应该尽量使用HashSet,因为它对速度进行了优化。
  HashSet中允许存放null值,但是只能存放一个null值,即“null值也不能重复”。
  HashSet中存储的元素的是无序的,但是由于HashSet底层是基于hash算法使用hashcode实现的,所以HashSet中的元素的位置是固定的。
  

  LinkedHashSet
  
  LinkedHashSet具有HashSet的查询速度,而且它的内部使用链表维护元素的顺序(插入的次序)。所以在使用迭代器遍历LinkedHashSet,结果会按元素插入的次序显示。LinkedHashSet中的元素也必须定义hashCode()方法。
  LinkHashSet不仅实现了Set,而且同时继承了HashSet。
  LinkedHashSet和HashSet主要区别在于,LinkedHashSet中存储的元素是在哈希算法的基础上增加了链表的结构。而且,LinkedHashSet维护着一个运行于所有条目的双重链接列表,这也增加了实现的代价。
  

  TreeSet
  
  TreeSet是一种保持次序的Set,其底层是基于红黑树实现的。使用TreeSet可以从集合中提取有序的序列。
  集合中的元素需要实现Comparable接口,或者在创建TreeSet对象时需要使用构造函数TreeSet(Comparator<? super E> comparator)来指定比较器。
  

Queue

  队列是一个典型的先进先出的容器。LinkedList提供了方法以支持队列的行为,并且它实现了双端队列接口Deque,从而实现了队列接口Queue(因为Deque继承自Queue)。因此,可以通过将LinkedList向上转型为Queue,用作为Queue的一种实现。
  先进先出描述了最典型的队列规则,队列规则是指在给定一组队列的元素的情况下,确定下一个弹出队列的元素的规则。先进先出声明的是下一个元素应该是等待时间最长的元素。此外,还存在一种Queue的实现类PriorityQueue(优先级队列),它声明的队列规则是:下一个弹出元素是最需要的元素,即优先级最高的元素。
  当你在PriorityQueue中调用offer()方法来插入一个对象时,这个对象会在队列中被排序。默认的排序是对象在队列中的自然顺序,但是你可以通过提供自己的Comparator来修改这个排序规则。PriorityQueue确保当你调用peek(),poll()和remove()方法时,获取的元素将是队列中优先级最高的元素。
  
  image_1b8f5mc36jc4q01khehmf7ce5v.png-46.5kB

Map

  Map接口并没有实现Collection接口。 Map接口用于维护键/值对,它描述了不重复的键到值得映射。
  Map接口常用的实现类有HashMap,LinkedHashMap,TreeMap,WeakHashMap,ConcurrentHashMap和IdentityHashMap。
  
  Map接口包含的方法如下:
  
  image_1b8f237p6112g9cn15a99dl1mmo4b.png-85.7kB

  HashMap
  
  HashMap是Map基于散列表的实现,插入和查询“键值对”的开销是固定的。可以通过构造函数设置容量和负载因子,以调整容器的性能。新建一个HashMap时,默认会初始化一个大小为16,负载因子为0.75的空的HashMap。
  
  实际上,HashSet的底层是基于HashMap来实现的,查看HashSet的构造函数就可以看到:
  
  image_1b8eqqasrc711nstlqmi3okg53u.png-17.1kB
  
  类似地,LinkedHashMap和LinkedHashSet,TreeMap和TreeSet也有这样的关系。
  

  LinkedHashMap

  LinkedHashMap类似于HashMap,但是在迭代遍历它时,得到的“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序,这可以在构造函数中指定:
  
  image_1b8f3nlai12i11ard176u147q6824o.png-60.3kB
  

  TreeMap
  
  TreeMap是基于红黑树的实现。在查看“键”或者“键值对”时,它们会被排序,次序由Comparable或者Comparator决定。TreeMap的特点在于,所得到的结果是经过排序的。
  
  TreeMap是唯一一个带有subMap()方法的Map,它可以返回一个子树:
  
  image_1b8f498n71g8n10fjvc912ku1pjc55.png-30.4kB
  
  WeakHashMap
  
  WeakHashMap表示弱键映射,它允许释放映射所指向的对象,这是为了解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此“键”可以被垃圾收集器回收。
  
  ConcurrentHashMap
  
  这是一种线程安全的Map,它不涉及同步加锁。
  
  IdentityHashMap
  
  这是使用“==”代替“equals()”对“键”进行比较的散列映射,是专为解决特殊问题而设计的。

Collections和Arrays

  Collections类的addAll()方法接受一个Collection对象,以及一个数组或者一个用逗号分隔的列表,将元素添加到Collection对象中。
  Arrays类的asList()方法接受一个数组或者一个用逗号分隔的元素列表,并将其转换为一个List对象,但是这个List的底层表示的是数组,因此不能调整尺寸。如果试图使用add()或者delete()等方法在该列表中添加或者删除元素,就有可能会引发去改变数组尺寸的尝试,从而抛出UnsupportedOperationException异常:
  
  image_1b8en488o1a5jsqkcv18hn6k41g.png-68.7kB

0 0
原创粉丝点击