Java集合体系

Java集合体系

在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行选择


判断存储的类型(一组对象或一组键值对):

一组对象:「Collection」接口

  • 允许重复:List

    • 增删多:LinkedList 【底层维护了一个双向链表】
    • 改查多:ArrayList 【底层维护 Object类型的可变数组】
  • 不允许重复:Set

    • 无序:HashSet 【维护了一个哈希表 即(数组+单链表)】
      • 插入和取出顺序一致:LinkedHashSet 【双向链表】
    • 排序:TreeSet 【可以指定排序规则】

一组键值对:「Map」接口

  • 键无序:HashMap 【底层是:哈希表 jdk7:数组+链表,jdk8: 数组+链表(红黑树)】
    • 键插入和取出顺序一致:LinkedHashMap
  • 键无序:HashTable【与HashMap相比:键和值都不能为「null」,线程安全】
    • 读取文件 Properties
  • 键排序:TreeMap 【可以指定排序规则】



看到array:就要想到数组,就要想到查询快有角标

看到link:就要想到链表,就要想到增删快,就要想要frist last

看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要重写hashcode方法和equals方法

看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。




集合类底层:

List:

  • ArrayList:数组
  • Vector:数组
  • LinkedList:链表,双向链表
  • Stack:是Vector的子类,数组

Set:

  • HashSet:HashMap
  • TreeSet:TreeMap
  • LinkedHashSet:LinkedHashMap

Map:

  • HashMap:

    • JDK1.7:数组+链表
    • JDK1.8:数组+链表/红黑树
  • TreeMap:红黑树

  • LinkedHashMap:是HashMap的子类,和HashMap一样,比HashMap还要多维护添加的顺序,它的结点类型中多一个next、pre




数组的特点:

优势:

  1. 根据索引可以快速定位,如果没有索引信息,还是按顺序查找,效率不见得高。

缺点:

  1. 创建一个数组必须指定大小,大小一旦确定就不能变,如果要变,就要重新创建数组

    所以,ArrayList、Vector、HashMap等这些底层和数组有关的,都设计到扩容问题。

  2. 数组如果在「中间」要删除元素或插入元素,就要移动后面元素


链表的特点:

优势:

  1. 不需要提前创建数组空间等,来一个元素,new一个结点对象。所以没有扩容问题。
  2. 链表如果在「中间」要删除元素,插入元素,不需要移动元素,只要修改前后元素的next,pre的引用关系

缺点:

  1. 如果你要根据索引操作,或没有索引操作,都是要从头head,或尾last去查找。