集合

 

一、集合和数组的区别:

  1、数组的长度是固定的。集合的长度是可变的。

  2、集合中存储的元素只能是引用数据类型。

二、集合继承关系:

  

  1、Collection作为集合的根接口,是所有集合类型的父类。

  2、集合类型有很多,常用的只有List和Set。

三、List接口

  1、List接口继承关系:

    

  2、List接口概述:

    List接口中的存储的元素的特点:有序、可重复 。

  3、常用子类

    ArrayList、LinkedList

  4、ArrayList

    1) 特点:ArrayList集合底层采用数组作为存储结构,查询速度快,但是增删速度慢。

    2) ArrayLista.add()方法实现:

 

   

  

  

     当用户调用ArrayList.add()添加一个元素时,java使用ensureCapacityInternal()方法确保ArrayList的容量可以再放下一个元素,ArrayList长度可变的核心在与grow()方法中,当ArrayList先前申请的数组长度oldCapacity不够时

  java会再次申请oldCapacity/2的长度添加至当前数组elementData的后面。

  3)  ArrayList.remove()方法的实现:

    

    

    用户调用ArrayList.remove()删除指定元素流程:找出待删除元素第一次出现的位置(从0开始)firstIndex,将firstIndex后面的元素往前移动一位。由此可见,ArrayList删除元素的效率是很低的。

    注:System.arraycopy用于数组之间的赋值

  4)   ArrayList.get()方法实现:

    

  

    ArrayList通过索引直接获取指定位置的元素,效率高。

 5、LinkedList

  1)  LinkedLis.add()方法实现:

      

    

    

    

    

      LinkedList.add()只是将元素放在last.next位置,时间复杂度低

  2)LinkedList.remove()实现:

    

    

     LinkedList.remove()只是修改了删除元素的直接前驱的next指针和直接后继的perv指针,时间复杂度低。

  3)  LinkedList.get()方法的实现:

    

    

    

    LinkedList.get()先判断要找的元素是在链表的前半段还是后半段,根据结果从前半段或者后半段开始找。

    注:linkedList使用的是双向链表

 

 

四、Set接口:

1、Set接口的继承关系:

   

2、Set集合概述:

  Set集合特点:无序、不可重复

3、常用子类

  HashSet、LinkedHashSet

4、HashSet

  1)HashSet.add()方法实现:

  

    

    

    

    HashSet的底层结构是HashMap,HashSet.add()只是将待添加的元素作为key,PRESENT是一个固定的对象,HashMap保证了key的唯一性。

 

  2)  HashSet.remove()的实现:

    

    HashSet.remove由HashMap.remove实现

 

5、LinkedHashSet(继承HashSet)

  1) LinkedHashSet.add()的实现:

    

   

    LinkedHashSet继承自HashSet,LinkedHashSet.add()实现参考HashSet.add()的实现。LinkedHashSet的其他方法参考HashSet对应方法的实现。

 

 

 

 

 

 

 

     

posted @ 2018-12-24 16:33  XiaoBBai  阅读(122)  评论(0编辑  收藏  举报