集合框架概述

集合框架的概述

  1. 集合、数组都是对多个数据进行存储操作的结构,简称Java容器
  2. 数组在存储多个数据方面的特点
    1. 一旦初始化后,其长度就确定了
    2. 一旦定义好,其类型也确定了,我们只能操作指定类型的数据
  3. 数组在存储多个数据方面的缺点

    1. 一旦初始化后,就不能修改长度
    2. 提供的方法有限,增删不便,且效率不高
    3. 没有现成的获取数据中实际元素个数的方法
    4. 数组存储数据的特定:有序,可重复。

      集合框架

  4. Collection接口:单列集合,用来存储一个一个的数据

    1. List接口:存储有序的、可重复的数据。—“动态”数组
      1. ArrayList、linkedList、vector
    2. Set接口:无序的,不可重复的数据 — 高中讲的集合
      1. HashSet、LinkedHashSet、TreeSet
  5. Map接口:双列集合,用来存储一对一对的数据

    1. HashMap、LinkedHashMap、TreeMap、Hashtable、properties

      Collection接口中定义的方法

  6. add() 添加元素

  7. size() 获取长度
  8. addAll() 添加集合
  9. isEmpty() 判断是否为空
  10. clear() 清空集合元素
  11. contains 是否包含
  12. containsAll(集合)判断是否包含集合中的全部元素
  13. remove() 删除元素
  14. removeAll(集合)删除集合
  15. retainAll(集合)求交集
  16. equals()
  17. hashcode() 输出hash值
  18. toArray()集合转数组
  19. iterator() 返回iterator接口的实例

    使用iterator遍历集合

  1. while(iterator.hasNext()){
  2. iterator.next();
  3. iterator.remove();//移除
  4. }

List接口

  1. ArrayList
    1. 作为List接口的主要实现类,线程不安全,效率高,
    2. 底层使用Object[]存储数据
    3. ArrayList的源码分析
      1. jdk7中,空参构造器数组长度为10,扩容的话是1.5倍
      2. jdk8,空参构造器数组长度为0,先扩容为10,再1.5倍.
    4. List新增的方法
      1. add(index,object)在某个索引处添加数据
      2. addAll(index,Collection) 在某个索引处添加集合
      3. indexOf(Object) 返回某个元素出现的位置
      4. lastIndexOf(Object)返回最后出现的位置
      5. set(index,Object)设置某个角标的元素
      6. subList(start,end)返回start到end的元素
      7. get() 获取元素
      8. remove(index) 删除某个角标的元素
  2. LinkedList
    1. 底层使用的双向链表
    2. 频繁的插入删除效率比ArrayList效率高
    3. LinkedList的源码分析
      1. 内部声明了Node类型的first和last对象.默认值为null
      2. add()时,将对象封装到Node中
      3. Node属性E item\Node next\Node prev
  3. Vector

    1. 线程安全的,效率低,
    2. 底层使用Object[]数组存储
    3. Vectord的源码分析
      1. 和ArrayList相同,只是扩容是二倍

        经典面试题

  4. ArrayList linkedList vector的异同

    1. 同:都实现了List接口,都是有序的可重复的.
    2. 不同点
      1. 见上

        Set接口

都是Collection中的方法
像Set添加的方法需要重写equals()和hashCode()方法

  1. HashSet
    1. 底层数组加链表的方法存储数据,可以存null
    2. 存储无序的,不可重复的
      1. 无序性:不等于随机性,存储的顺序是根据Hash值决定的
      2. 不可重复的: 先根据Hash值找数组的位置,先判断Hash是否相同,在用equals在链表中比较是否相同,不相同尾插
    3. LinkedHashSet
      1. 作为HashSet的子类, 在添加数据的时候,每个数据还维护了两个引用,记录前一个数据和后一个数据,优点是频繁的遍历效率高
  2. TreeSet

    1. 采用红黑树的存储结构
    2. 添加的属性是相同类的对象
    3. 添加的属性实现comparable接口,实现comparaTo方法,就可以输出排序好的数据了.
    4. 比较两个元素是否相等的标准为:comparaTo是否返回0
    5. 上面是自然排序,还有定制排序,需要在构造TreeSet时候传入一个comparator接口的实现类.

      Collections是操作list,set,map的工具类

  3. reverse(list)翻转list

  4. shuffle(list)随机排序
  5. sort(list)对list自然排序
  6. sort(list,comparator)自定义排序
  7. swap(list,int,int)元素交换
  8. max(collection)自然排序最大
  9. max(collection,comparator)自定义排序最大
  10. min()同上
  11. min()同上
  12. frequency(collection,Object)出现次数
  13. copy(list1,list2)复制2到1
  14. replaceAll(list,o1,o2) 用2替换所有1
  15. synchronizedXxx()将指定集合包装成线程同步的集合,

    Map

  16. HashMap : 作为map的主要实现类

    1. 底层数据结构
      1. 1.7:数组加链表
      2. 1.8:数组加链表加红黑树
        1. Hash的默认容量是16
        2. 默认加载因子是0.75
        3. 扩容的临界值 16* 0.75
        4. 链表转换红黑树:链表当前长度>8且数组的长度>64
    2. 线程不安全的,效率高
    3. LinkedHashMap
      1. 在Hash的基础上添加了一对引用,指向前一个和后一个元素,可以按插入顺序遍历,频繁遍历效率高.
      2. 源码中Entry继承了Hash的node,且加了前后位置的Entry
  17. TreeMap
    1. 数据结构:红黑树
    2. 按照key进行排序,key必须是同一个类的对象,,考虑key的自然排序或者定制排序
  18. Hashtable

    1. 不能存储null的key和value
    2. 线程安全的,效率低
    3. properties
      1. 常用来处理配置文件.key和value都是String

        Map中定义的方法

  19. put() 插入

  20. putAll(Map m)m全部插入
  21. remove(key) 指定移除key
  22. clear() 清空
  23. get() 获取
  24. containKey
  25. containValue
  26. size()
  27. isEmpty
  28. equals()
  29. keySet() 返回key的Set
  30. values() 返回value的Collection集合
  31. entrySet() 返回键值对set