集合
一、集合和数组的区别:
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对应方法的实现。