一、Java集合的两种体系

Java集合的两种体系大全 - 图1

Collection接口

  1. 特点: 用来存储单列数据,存储的是一个一个对象。
  2. 子类接口
    1. List接口(动态数组)
      1. 特点:存储有序的、可重复的数据。大小是可以变化的。
      2. 常见实现类
        1. ArrayList
          1. List接口的主要实现类
          2. 特点:线程不安全,但是效率很高
          3. 底层:使用Object[ ]存储

ArrayList的底层源码分析

  1. 2. **LinkedList**
  2. 1. 底层:使用的是双向链表来存储
  3. 2. 用处:对于需要频繁的插入、删除操作,使用此类的效率更高

LinkedList的底层源码分析

  1. 3. Vector
  2. 1. list接口的古老实现类
  3. 2. 底层:也是使用Object[ ] 存储
  4. 3. 常用方法:
  5. 1. 增:add(Object obj)
  6. 2. 删:remove(int index) / remove(Object obj)
  7. 3. 改:set(int index,Object val)
  8. 4. 查:get(int index)
  9. 5. 插:add(int index, Object obj)
  10. 6. 长度:size( )
  11. 7. 遍历
  12. 1. Iterator迭代器遍历
  13. 2. 增强for循环
  14. 3. 普通循环
  1. Set接口(高中的“集合”)=> 可以用来过滤重复数据

    1. 特点:存储无序的,不可重复的数据。
    2. 常见实现类
      1. HashSet
        1. Set接口的主要实现类;线程不安全;可以存储null值
      2. LinkedHashSet
        1. 是HashSet的子类
        2. 可以按照添加时候的顺序进行遍历(对于频繁的遍历操作,效率更高)
          image.png
          image.png
      3. TreeSet
        1. 底层存储:红黑树
        2. 特点:只能存储相同类型的对象
        3. 可以按照存储对象的属性进行特定的排序
        4. 判断元素是否重复,根据的是compareTo方法
        5. 添加元素的时候,会自动进行排序
          image.png
        6. 可以指定自定义排序的方式
          1. 自然排序(实现comparable接口):比较两个对象相同的标准是:compareTo方法返回0,不再是equals( )
            image.png
          2. 定制排序(创建实现了Comparator接口的匿名类的对象,并作为参数传给TreeSet的构造函数)
            image.png
    3. 对于无序和不可重复的理解
      1. 无序性(通过Hash散射存储)
        1. 不等于随机性()
        2. 存储的位置是无序的(并非按照索引的顺序添加的,而是根据对象的hashCode决定的)
      2. 不可重复性
        1. 保证添加的元素按照equals( ) 方法判断时,不可以返回 true
    4. 添加元素的过程(以HashSet为例)

      1. 首先调用元素a对应类的hashCode( )方法,计算哈希值
      2. 通过哈希值,使用某种特定的算法计算出元素在HashSet底层数组中存储的位置
      3. 判断此位置上是否有元素

        1. 如果没有其他元素,那么就直接添加成功。(情况1)
        2. 如果有其他元素
          1. 首先比较两个元素的哈希值
            1. 如果哈希值不同,那么就添加成功 (情况2)
            2. 如果哈希值相同,那么就需要调用equals( )方法来判断
              1. equals一旦返回 true ,那么添加失败
              2. 如果没有返回 true ,那么就添加成功(情况3)
                image.png
      4. 对于情况2情况3:在指定的索引位置上以链表的方式存储

        1. JDK7中,新添加的元素a放到数组中,指向原来的元素
        2. JDK8中,原来的元素不变,指向新添加的元素a
    5. 提供的API
  2. add(E e):将元素e添加到集合coll中
  3. size( ):获取添加的元素的个数
  4. addAll( Collection coll1 ):将coll1中的元素全部添加进来。
  5. isEmpty( ):判断当前集合是否为空(通过size来判断)
  6. clear( ):情况集合里面的所有元素
    image.png
    image.png
  7. contains(Object obj):判断当前集合是否包含obj,包含则返回 true。(根据调用对象的equals方法来进行判断)
  8. containsAll(Collection coll):判断coll集合中的所有元素是不是都在当前集合中(都存在,返回true)
  9. remove(Object obj):删除obj对象
  10. removeAll(Collection col):删除当前集合中col中存在的所有元素
  11. retainAll(Collection col):保留当前集合中在col中也存在的所有元素
  12. hashCode( ):返回当前集合的哈希值
  13. toArray( ):返回一个对象数组
    image.png
  14. iterator():返回迭代器,用来遍历集合中的所有元素。

    Map接口

  1. 特点:双列集合,用来存储一对数据(KEY-VALUE),类似于高中讲的映射。
  2. 常见实现类:
    image.png
    1. HashMap
      1. 特点
        1. Map的主要实现类
        2. 线程不安全,但是效率高
        3. 可以存储为 null 的 key 和 value
      2. 子类
        1. LinkedHashMap
          1. 作用:保证遍历过程中可以按照添加的时候的顺序遍历
      3. 底层
        1. JDK7和以前:数组+链表
        2. JDK8:数组+链表+红黑树
    2. TreeMap
      1. 特点
        1. 是有序的(考虑对 key 的排序)
        2. 保证可以按照添加的 key - value 来进行排序
      2. 底层:红黑树
    3. HashTable
      1. 特点
        1. Map的古老实现类
        2. 线程安全,但是效率比较低
      2. Properties
        1. 用处:常用来处理配置文件
        2. 特点:Key 和 Value 都是 String类型
  3. Map接口中定义的常见方法
    1. 添加 / 修改:Object put(Object key,Object value)
      image.png
    2. 添加一系列:void putAll(Map map)
      image.png
    3. 删除:Object value = map.remove(key);
      函数的返回值是 key 所对应的 value
      如果对应的 key 不存在,那么就返回 null
    4. 清空:map.clear()
      clear 做的只是清空数据,但是 map 仍然还在
    5. 查询 key 对应的 valueObject get(Object key);
    6. 查询是否存在某个 keyboolean containsKey(Object key);
      调用的是 key 所在类的 equals 方法
    7. 查询是否存在某个 valueboolean containsValue(Object key);
    8. 判断是否为空:boolean isEmpty();
      根据的是 map 的 size 来判断是否为空。
  4. Map的遍历
    1. 转换为 set
      1. 遍历 key
        image.png
      2. 遍历 value
        image.png
      3. 遍历 key-value
        image.png
    2. 使用 forEach 直接遍历 map
      image.png