Java学习(2)集合:Collection,List,Set及实现类的理解

前言:该文章主要是基础的集合类的源码分析,从个人的理解去分享写的,如有不足,还望指教.

一集合Collection的关系图:

Collection          接口的接口   对象的集合 
├ List                   子接口      按进入先后有序保存   可重复 
│├ LinkedList                接口实现类   链表   插入删除   没有同步   线程不安全 
│├ ArrayList                  接口实现类   数组   随机访问   没有同步   线程不安全 
│└ Vector                      接口实现类   数组                  同步        线程安全 
│   └ Stack
└ Set                   子接口       仅接收一次,并做内部排序

├ HashSet

│   └ LinkedHashSet

└ TreeSet

1、List,Set都是继承自Collection接口

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:无序的,不能重复

猜你喜欢

转载自blog.csdn.net/zxf_0601/article/details/79760727