概述
ArrayList、Hashmap、Vector等集合类型,是在应用程序开发中经常使用到的数据类型。在使用集合类时,我们究竟使用那种数据类型来定义我们的变量,就要了解其实现机制,选择性能最好的集合类完成定义。同时java招聘的面试题中也会常问问题,以下对java集合类中内容做以总结,提供大家参考。
Collection相关类
Collection接口继承Iterable接口,每种Collection都支持迭代器进行遍历。List和Set都是继承了Collection的子接口。区别是List集合中的元素可重复,Set中的元素不可以重复;List集合中的元素有序,Set中的元素可以无序。
1. List:List的具体类包括:具体类包括Vector、ArrayList、LinkedList和Stack;
ArrayList的底层数据结构是数组,查询快,增删慢,效率高。缺点: 线程不安全
Vector底层数据结构是数组,查询快,增删慢,线程安全
Stack是Vector的子类,继承了Vector中的方法和特点,具有先进后出的特点。
LinkedList:底层数据结构是链表,查询慢,增删快。缺点: 线程不安全
使用场景:假如要定义一个有序的集合变量,可以由以上三种类型中选取,当集合中的数据频繁进行增删操作,使用LinkedList;当涉及多线程,数据同步时使用Vector;不知道用哪个时选ArrayList。
2.Set:Set具体类包括HashSet、TreeSet、LinkedHashSet。
HashSet:唯一,无序,底层数据结构是哈希表,什么,哈希表,哈希表不是<key,value>键值对?,是的,HashSet中的哈希表,其中数据存在key中,value是一个的Object。注意看源码:
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
static final long serialVersionUID = -5024744406713321676L;
// 使用哈希表来保存HashSet中所有元素。
private transient HashMap<E,Object> map;
//final修饰只能赋一次值,PRESENT
private static final Object PRESENT = new Object();
//构造函数
public HashSet() {
map = new HashMap<E,Object>();
}
//每次增加值时,value值都为PRESENT
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
}
LinkedHashSet是HashSet的子类,继承了其功能,并对其进行扩展,具有先进先出(FIFO)功能,底层数据结构是链表和哈希表。
TreeSet:有序不重复,底层数据结构是红黑树。
使用场景:如果需要的是一个排序集合(不重复),请选择TreeSet,如果需要一套能够存储插入顺序的集合,使用LinkedHashSet;没有条件,不知道用哪个时选HashSet
Map相关类
Map表示存储键值对;具体实现类包括:HashMap、HashTable、TreeMap,这三个类型就是我们常用的三种类型。Map相关类图如下:
TreeMap是有序的,实现数据结构是红黑树,具体顺序需要实现comparator接口,时间复杂度为log(n)。
而HashMap和HashTable是无序的。Hashtable的方法是同步的,HashMap的方法不是同步的,HashMap的性能优于Hashtable。
使用场景:加入应用中我们不断加入数据,输出时需要按照一定规则排序,则使用TreeMap。否则使用HashMap或HashTable,如果多线程并发性选择HashTable,否则选择HashMap。缺省使用HashMap。