设计

  • 高性能,基本集合的实现必须是高效的
  • 允许不同类型的集合,并且都能以类似的方式工作,具有高度的操作性
  • 扩展和适应性应该是简单的

    实现

    image.gif
    image.png

    Collection

    Collection 接口 Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。Collection 接口存储一组不唯一,无序的对象。

List

List接口是一个有序的collection,使用此接口可以精确的控制数据存储的位置,它通过索引来访问里面存储的元素,并且允许存入值重复

ArrayList

  • 实现了List接口,实现了可变大小的数组
  • 随机访问数据性能好
  • 非同步
  • 可根据增加的数据,来扩展长度,每次扩展都是当前长度的50%
  • 插入修改效率比较低

    LinkedList

  • 实现了List接口,允许有null值元素,以链表数据结构创建

  • 该类无同步方法,需要自己实现方法同步,可以在创建List的时候构造一个同步的List,List list=Collections.synchronizedList(newLinkedList(...));
  • 查找效率比较低

    set

    Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象。

HashSet

  • 实现了Set接口
  • 不允许重复数据
  • 无序
  • 可以为null,但唯一

    LinkedHashSet

  • 可预知迭代顺序的 Set 接口的哈希表和链接列表实现

    TreeSet

  • 实现了Set接口

  • 排序

    Map

    存储键值对像,提供Key「键」和Value「值」的映射

HashMap

一个散列表,存储内容以键值对方式映射,实现了Map接口,根据键的HashCode值来存储数据,具有很快的存储舒服,最多允许一天记录为null,不支持线程同步

LinkedHashMap

使用元素自然顺序进行排序

TreeMap

ConcurrentHashMap

差异化

List和Map的区别

  • 相同点
    • 都是Java常用·的容器
  • 不同点

    • List是存储单列的集合,Map是Key-value的键值对集合
    • List允许数据重复,Map的Key不允许重复
    • List是有序的,Map是无序的

      List和Set的区别

      Set里面的数据是无法重复的、例如HashSet,在添加一条数据时,会将该数据作为Key值纯存入,存入过程中会循环遍历,进行Hash值的对比和equals()比较,如果不存在则添加HashSet

      ArrayList和LinkedList

  • 相同点

    • 他们都继承了List接口
  • 不同点
    • ArrayList的底层是数组、而LinkedList的底层是双向链表
    • ArrayList是以索引的方式可以立即取出该索引位置的数据,而LinkedList只能从头开始遍历整个链表来取出该数据
    • 对于添加和删除,ArrayList插入或者删除数据时,需要对修改位置后的数据都进行偏移,而LinkedList只需要对插入地方的周围的两个数据的指针进行修改即可

      题外话

      HashMap以对象作为Key

      如果要是以对象作为Map的Key值进行存储,则需要对该类进行重写HashCode和equals()方法,一般我们认为当对象的HashCode和成员变量都相同时,则两个对象相等