再谈java容器

    xiaoxiao2021-03-25  110

    总的来说java容器分为两大派系,即Collection和Map

    Collection实现了Itarable接口,这是为了给其子类提供规范的遍历方法,比如ArrayList使用数组存储,HashSet使用散列存储,其遍历方法肯定是不一致的,要求所有子类实现统一的Itarator方法,向调用者返回迭代器遍历(迭代器模式):迭代器迭代过程中,不允许进行除迭代器自己的remove之外的方法操作集合,否则报错;另外List接口还提供了ListIterator(Iterator子类)的方法,可以正/逆序遍历集合,也可对集合进行系列操作(使用ListIerator的API)。

    Collection主要子接口包括Set(无序,不可重复)、List(有序,可重复)、Queue.

    Set主要有HashSet、LinkedHashSet、TreeSet等实现类。

    其中HashSet使用散列数据结构存储元素,底层利用HashMap,储存的元素无序,且不能重复(HashMap键不能重复)。那么HashSet是如何判断元素是否重复的呢?因为是散列结构,储存的元素先调用hashCode方法,得到Hash值,如果已有元素没有hash值重复的,直接存入,否则会继续调用equals方法,若equals方法相等则视为重复元素,否则可存入。哈希冲突,使用链表法解决。

    LinkedHashSet是HashSet的子类,该实现类可以保证存入的顺序与遍历的顺序一致。

    TreeSet二叉树结构。可存入的元素排序,关键点:存入的元素必须满足实现Comparable接口(CompareTo方法),否则报错,在构造TreeSet时,也可传入一个实现了Comparator接口的实现类(策略模式。底层判断Comparator是否为空,为空执行默认策略,否则执行新的比较策略)

    Comparator和Comparable比较:实体类实现Comparable接口,使用TreeHashSet/TreeHashMap时,使用默认策略CompareTo方法进行比较,或者在客户端编写代码时需要改变比较策略,则实现一个Comparator的比较策略传入。

    List主要有ArrayList、LinkedList、Vector、Stack等子类

    其中ArrayList底层使用数组实现,查询快,删除慢,线程不安全。

    Vector使用数组实现,查询快,删除慢,方法都加 有syncrolized,线程安全。Vector扩容一倍,ArrayList扩容0.5倍,有利于节省空间。

    Stack是Vector的子类。栈结构

    增强for循环必须有被遍历的目标。目标只能是Collection或者是数组。

    Map接口:

    主要子类有HashMap,LinkedHashMap,TreeMap,HashTable,Properties

    其中,HashMap储存顺序与遍历顺序不一样,LinkedHashMap则可保证顺序一致,TreeMap底层是红黑树,对键值会进行排序,当然要求键的类型实现Comparable

    HashMap与HashTable区别:HashMap允许空值、线程不安全,HashTable不能为空值、线程安全,HashMap把HashTable的contains方法去掉了,加入了containsKey和containsValue,HashTable的子类Properties应用得多。

    Queue接口:

    子接口Dueue,LikedList,优先队列是实现类.优先队列按自然顺序排序或者自己传入一个比较器

    转载请注明原文地址: https://ju.6miu.com/read-12130.html

    最新回复(0)