Java编程实践 - 集合的使用

242 阅读4分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

Java框架中的集合实现

Java 集合框架主要包括两种类型的容器,一种是集合(实现Collection接口),存储一个元素集合,另一种是图(实现Map接口),存储键/值对映射。

继承Collection的接口有分别是List、Set、Queue。

  • List 表示有序的集合,包括ArrayList、LinkList等
  • Set 表示无序的集合,包括HashSet,TreeSet等
  • Queue 队列,遵循先进先出的原则,提供队列的数据结构

由Map衍生的常用基础类有:HashMap,TreeMap,HashTable等。

List、Set与Map的区别

List和Set的数据结构是从一个节点,可以用next去访问下一个节点,一般我们访问的方式是从开始节点,用next遍历所有节点。为了更方便定位,List和Set的实现类会提供下标去访问的入口,但本质上还是通过遍历去实现的。

Map则是通过关键字直接去定位节点,当然前提是你要知道关键字,而且关键字也意味着系统需要更多的计算和存储空间。

所以,如果是访问一系列的元素,选择List或Set。 如果访问有特征的元素,选择Map

List与Set的区别

  1. List允许重复、Set不允许重复
  2. Set是自动排序的,List不会自动排序

所以选用Set可以让数据结构变得整洁、有序。如果确定集合是有序且不重复的话,可以用Set来省去排序的去重的工作,如果不确定,还是应该使用List,更加灵活的来处理。

ArrayList与LinkList的区别

  1. 底层数据结构:Arraylist底层使用的是Object数组,LinkedList底层使用的是双向链表(JDK1.6循环双向链表,JDK1.7取消了循环)
  2. 插入和删除是受到的影响。ArrayList插入和删除时,需要维护下标。LinkList则只需要维护前后节点的指向就行了。所以ArrayList插入和删除的性能和位置有关,数组越大,位置也靠前,维护下标的量越大,LinkList的插入删除和位置的关系则比较小。
  3. ArrayList随机访问的效率更高。 ArrayList实现了RandomAccess接口,LinkedList则没有。
  4. ArrayList需要更多的内存空间

ArrayList与Vector区别

Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。Arraylist不是同步的,所以在不需要保证线程安全时建议使用Arraylist。

HashMap和Hashtable的区别

1.线程是否安全: HashMap是非线程安全的,HashTable是线程安全的;HashTable内部的方法基本都经synchronized修饰。

2.效率:因为线程安全的问题,HashMap要比 HashTable效率高一点。

3.对Null key和Null value的支持: HashMap中,null可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null。但是在HashTable 中 put进的键值只要有一个null,直接抛出NullPointerException。

4.初始容量大小和每次扩充容量大小的不同:HashTable创建时如果不指定容量初始值,Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16,之后每次都变成原来的两倍。

5.底层数据结构: JDK1.8以后的HashMap在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable没有这样的机制。

总结: HashTable不推荐使用,在同步的环境可以使用ConcurrentHashMap。

HashMap和TreeMap的区别

HashMap是用Hash表存储元素的,TreeMap则用树结构存储的。HashMap的Key是无序的,TreeMap的Key是有序的。Hash表的初始化比较简单,所以初始化效率高,TreeMap有序的代价是初始化需要更多的计算。

Array与ArrayList

ArrayList的顶层实现其实就是Array对象,但是Array在插入和删除的操作非常复杂,但是不考虑插入和删除操作的话,Array的效率更高。