前言:该文章主要是基础的集合类的源码分析,从个人的理解去分享写的,如有不足,还望指教.
一集合Collection的关系图:
Collection 接口的接口 对象的集合
├ List 子接口 按进入先后有序保存 可重复
│├ LinkedList 接口实现类 链表 插入删除 没有同步 线程不安全
│├ ArrayList 接口实现类 数组 随机访问 没有同步 线程不安全
│└ Vector 接口实现类 数组 同步 线程安全
│ └ Stack
└ Set 子接口 仅接收一次,并做内部排序
├ HashSet
│ └ LinkedHashSet
└ TreeSet
2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。
二,ArrayList
1,存储数据实现原理:用数组实现数据的存储,从构造方法中可以看出:
2,set()和add()方法:set是把值放到某个位置上,add是在list的结尾处新增数据
3,ensureCapacityInternal()方法:校验数组扩容的方法,数组初始化默认容量是10,扩容规律是1.5倍
该方法调用扩容的具体实现是在grow()方法中:
4,ArrayList取值方法:超强for循环,或者是iterator()方法
三,LinkList: implements List<E>, Deque<E>, Cloneable, java.io.Serializable
实现了Deque接口,所以LinkList也可以作为队列来使用:实现的接口方法
1,存储数据原理:链表的方式实现数据的存储的:通过Node内部类:从Node构造器可以看出,这是个双向链表的结构,类似于栈的功能,后进先出,也可以实现队列形式,先进先出的功能
2,add()方法:储存的值放入last链表中,offerFirst()方法的值放在first链表中
三Hashset:
1,实现原理:通过HashMap的key存储set值,构造器可以看出,所以值不可重复,且无序的
2,LinkedHashSet构造器也都是继承HashSet的实现方式,也继承了它的所有特性,但LinkedHashSet却没有具体是实现方法
,可能需要深入去实现,暂时无法理解
总结:1,ArrayList和linklist区别,实现原理不同,一个是数组,一个是链表.前者查询快,删除较慢.后者查询慢,删除快,都不是线程安全的,有序的
Hashset:无序的,不能重复