自己绘制的常用的集合接口及实现类
一、Celletion接口
Cellection接口下常用的有Set、List接口
1.Set
- SortedSet接口是Set的子接口,其主要的实现类就是TreeSet。大家都知道,Set类存储的数据是无序,且不重复的。但是这个接口比较特殊,看这个名字应该也能知道,作为SortedSet的实现类TreeSet是有序的。它对存储的数据也是有要求的,需要存储的数据类型一致。
- HashSet存入的数据是无序(要遍历的话需要用迭代器)不重复的,其底层实现的是HashMap。附上代码:
1 public HashSet() { 2 map = new HashMap<E,Object>(); 3 } 4 5 6 public HashSet(Collection<? extends E> c) { 7 map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); 8 addAll(c); 9 } 10 11 public HashSet(int initialCapacity, float loadFactor) { 12 map = new HashMap<E,Object>(initialCapacity, loadFactor); 13 } 14 15 16 public HashSet(int initialCapacity) { 17 map = new HashMap<E,Object>(initialCapacity); 18 }
2、List
List接口下的实现类都是可以存储相同的数据的,并且能排序。
- ArrayList:通过变长数组的方法来实现的,线程不安全。默认长度为10,当空间不足时会自动扩充,扩充为当前的1.5倍,再加1。
- Vector:与ArrayList相似,但是是线程安全的,通过synchronized来控制的。
- LinkedList:通过双向循环链表实现的。
ArrayList与LinkedList的区别:
- ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
-
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
-
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
3、Map
- SortedMap:是Map子接口,主要提供了TreeMap的实现,是Map下有序的一个实现类。顺序是按照key值的升序来排。与HashMap不同的是,它的键值都不能为null。
- HashMap:是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。HashMap的值不相同是由hashcode(),equals()两个方法来保证的。
HashMap和TreeMap比较:
- HashMap:适用于在Map中插入、删除和定位元素。
- TreeMap:适用于按自然顺序或自定义顺序遍历键(key)。
- HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap.
- HashMap 非线程安全 TreeMap 非线程安全
- HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。
在HashMap中通过get()来获取value,通过put()来插入value,ContainsKey()则用来检验对象是否已经存在。可以看出,和ArrayList的操作相比,HashMap除了通过key索引其内容之外,别的方面差异并不大。
- HashTable\SynchronizedMap\ConcurrentHashMap:这三个都是线程安全的。ConcurrentHashMap采用的是红黑树和CAS算法,效率提高了不少。
Hashtable是线程安全的,它的方法是同步了的,可以直接用 在多线程环境中。而HashMap则不是线程安全的。在多线程环境中,需要手动实现同步机制。