java基础[9]集合总结

来源:互联网 发布:好想告诉你 知乎 编辑:程序博客网 时间:2024/06/01 23:31

==========================【导读】[开始]==========================
(包括集合接口,类简述;常用散列集,树集两种数据结构;视图;线程安全集合)
Java中集合,从元素形式上来区分,分为’列表‘(元素是单个形式)和’映射‘(元素是键值对形式)。
==========================【导读】[结束]==========================

1 接口总览

接口


2 类总览

这里写图片描述


3 接口简述

接口名 简述 SortedSet;
SortedMap 这两个接口,会提供用于排序的比较器对象。
这两个接口定义了可以得到集合子集视图的方法。 NavigableSet;
NavigableMap 包含一些用于搜索和遍历有序集和映射的方法。
TreeSet 和 TreeMap实现了这些接口。 Iterator;
ListIterator hasNext(); next(); hasPrevious(); previous(); add();等。
定义了一个方法用于在迭代器位置前面增加一个元素。 Iterable 定义3个方法:
iterator()返回迭代器对象。
forEach(Consumer action)遍历。
spliterator()并行遍历。 Queue;
Deque 队列接口。 RandomAccess 标记接口,可根据索引随机访问元素。

4 类简述

类名 数据结构 效率 简述 LinkedList 双向链表 添加,删除元素效率高;
获取元素效率低,遍历查找耗时。 get(i),当i>(1/2)size,从尾端进行遍历。 ArrayList 数组 添加,删除效率低,部分元素做整体移动以保证元素存储的物理连续性,耗时。
获取元素效率高。 可动态拓展。 HashSet 哈希表 效率较高。 元素不可重复。 LinkedHashSet 哈希表和双链表的结合体。 相较于HashSet,效率稍低。 按照插入顺序进行迭代,即迭代输出顺序与插入顺序一致。
元素不可重复。
实现方式是对LinkedHashMap的适配转换。 EnumSet 二进制序列来唯一标记对应枚举值 效率非常高。 底层并不是直接存放枚举对象,是用二进制位向量来存放,存储紧凑,并且高效。 TreeSet 红黑树 添加元素时对元素进行排序。相对耗时。 元素会被排序。
元素不重复。 PriorityQueue 完全二叉树,即堆结构,具体应该是小顶堆 添加元素耗时。删除最小元素效率高。 可高效删除最小元素的集合。 ArrayDeque 循环数组实现的双端队列 效率上具有和数组类似的特点。 由于可从两端来操作队列中的元素。故即可当做队列使用,也可以当成栈来使用。 HashMap 哈希表 类比HashSet 元素为键值对。 LinkedHashMap 哈希表和双链表的结合体 类比LinkedHashSet 元素为键值对。 TreeMap 红黑树 类比TreeSet 元素为键值对。 EnumMap 同EnumSet 效率高 值属于枚举类型的映射表。 WeakHashMap 哈希表 效率较高 键值对的key是弱引用。(键值对被使用一次后,对应key被删除回收。) IdentityHashMap 哈希表 效率较高 判等时对key引用相等性判等,用 == 比较key的相等性。

EnumSet/EnumMap说明:
(由于枚举类型的所有值的个数是有限的,因此可以用二进制序列来唯一表示,如一个枚举有{a,b,c,d}四个值,这里就用4位二进制数表示,现在只有a、c、d这三个值,因此可以表示为1011,1表示该枚举值在集合中,0表示不在集合种;枚举值在枚举类型中是有序号的,就是按照其定义顺序排列的。


5 散列集(哈希表)

  • 数据结构特点:
    <1>数据结构:整体看做数组,每个数组元素为链表。(JavaSE8 桶满时,从链表变为平衡二叉树。)
    <2>效率:查找元素效率高。
  • 哈希表知识:
    <1>哈希码(散列码):根据哈希函数,为每个对象生成一个值,叫做哈希码。(JavaSE对HashCode约束:两个对象相同,hashCode一定相同;hashCode不同,两个对象一定不相同;hashCode相同,两个对象不一定相同。)
    <2>哈希码作用:当对象存储在哈希表中(如Hashtable,HashMap,HashSet)时,哈希表中查找对象时,先依据HashCode确定对象所在的链表(HashCode值对数组长度取余,确定链表索引),再依据equals方法在链表中确定对象是否存在。
    <3>哈希冲突:向哈希表插入元素时,根据HashCode找到了所在的链表。却发现链表已经被占满,这种情况叫做哈希冲突。解决哈希冲突,需要再散列。
    <4>再散列:再散列需要创建一个桶数更多的表,并将所有的元素都插入到新表中,废弃原来的表。
    <5>装填因子:决定何时进行再散列的依据。默认值为0.75,表示表中75%的位置已经被填入元素,这个表就会用双倍的桶数进行自动再散列。
    <6>HashMap提供了三个构造函数
    HashMap():
    构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
    HashMap(int initialCapacity):
    构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
    HashMap(int initialCapacity, float loadFactor):
    构造一个带指定初始容量和加载因子的空 HashMap。

6 树集(主要是二叉树)

  • 数据结构特点:
    <1>数据结构:元素会进行排序。
    <2>效率:查找元素效率高。插入元素效率相对哈希表稍慢。
  • 树集知识:
  • TreeSet和TreeMap都是红黑树结构,具体数据结构原理下一篇总结。

7 视图

7.1视图–对映射集合遍历的一种手段

❶ 对于列表集合来说(即AbstractCollection的所有子类集合),遍历元素可以使用以下方式:

     treeSet.forEach(item -> System.out.println(item));//forEach     treeSet.iterator();//使用迭代器     treeSet.stream();//stream()

❷对于映射集合来说(即AbstractMap的所有子类集合),Java中并不认为映射本身是一种集合,对”映射”集合遍历,首先需要得到映射的视图,然后再对视图进行操作。
❸视图是什么?视图是实现了Collection接口,或它的某个子接口对象,注意是对象,返回的视图并不是集合,对象里的方法是对原映射进行操作的。
❹映射对应于3种视图。

视图 类型 描述 键集视图 Set keySet() keySet是实现Set接口的另外某个类的对象,不是HashSet或TreeSet 值集视图 Collection values() 值的集合视图 键/值对集视图 Set<> entrySet() 泛型限定为Map.Entry接口的类的对象

❺转换为视图后,就是装换为了Collection接口的某个实现类的对象,就可以使用Collection中的3种方式进行变遍历操作。

    Iterator<Entry<String, String>> iterator = map.entrySet().iterator();//迭代器    Stream<Entry<String, String>> set = map.entrySet().stream();//forEach()    map.entrySet().forEach(item -> System.out.println(item.getKey() + "->" + item.getValue()));//stream()

❻注意:只能对这些视图进行元素删除操作,而不能进行增加元素操作。删除操作,会对应更改原来的映射集。

7.2视图–构造线程安全的集合视图

常规的集合都是非线程安全的集合。 类库的设计者使用视图来确常规集合的线程安全
java.util.Collections下的一组方法可以构造线程安全的集合视图,直接对构造出来的线程安全的集合视图进行get和put操作,可保证是同步的操作且,线程安全。可对视图的做get,put,remove,replace操作,可保证是同步的方法,线程安全。

static <T> Collection<T> synchronizedCollection(Collection<T> c);static <T> Set<T> synchronizedSet(Set<T> s);static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s);static <T> NavigableSet<T> synchronizedNavigableSet(NavigableSet<T> s);static <T> List<T> synchronizedList(List<T> list);static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m);static <K,V> NavigableMap<K,V> synchronizedNavigableMap(NavigableMap<K,V> m);

7.3 视图–局限性

视图还有其他的一些应用,包括获取子范围视图;生成不可修改的视图;生成受检查视图等等。但是视图有很多局限性,通常对一些视图可读,而不可修改。


8 java.util.concurrent.*包中的线程安全集合

java.util.concurrent包中也提供了一些线程安全的集合的实现。
常用的有:

    ConcurrentHashMap<K, V>//映射    ConcurrentSkipListMap<K, V>//有序集    ConcurrentSkipListSet<E>//有序集    ConcurrentLinkedQueue<E>//无边界非阻塞队列    ......

详细的总结,会在后续的多线程并发这一块。

原创粉丝点击