菜鸟教程
http://www.runoob.com/java/java-collections.html
TreesSet原理:
https://blog.csdn.net/wangyunpeng0319/article/details/78297445
极客学院常见框架原理分析:
http://wiki.jikexueyuan.com/project/java-collection/linkedhashset.html
Collection是最基本的集合接口,java不提供collection的直接实现类,除map集合外所有集合必须实现Collection接口的子接口,如set接口和list接口。
Set
Set是collection接口下的子接口,特征是set集合中的元素是不能重复的,提供的常见实现类HashSet,TreeSet,LinkedHashSet:
HashSet 底层根据元素的HashCode存放和检索数据,因此不允许重复,可以存放null值,但是也只能存放一个,hashset存放和抓取数据都是随机的因此并不能保证数据存放和检出的顺序是一致的。
LinkedHashSet 具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
TreeSet 属于集的范围,所以它只能存放引用类型,不能用于基本数据类型,实现了set接口,所以它本身不能有重复的元素,当存入自定义的引用类型的时候就必须考虑到元素不可重复的这个特性,换句话说就必须实现Comparable接口,因为在其内部会调用Comparable接口的compareTo方法来比较两个元素的大小,然后根据红黑树进行排序,这就是自然排序。也就是说TreeSet集合中存放的元素都应该是相同类型元素。除了自然排序,TreeSet也可以进行定制排序,TreeSet的自然排序是根据集合元素的大小,TreeSet将他们以升序排列。如果需要实现定制排序,例如降序,则可以使用Comparator接口。该接口里包含一个int compare(T o1, T o2)方法,该方法用于比较o1和o2的大小。 如果需要实现定制排序,则需要在创建TreeSet集合对象时,并提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。
HashSet,TreeSet,LinkedHashSet之间的区别:HashSet只去重,TreeSet去重并排序,LinkedHashSet去重并保留插入顺序
HashSet |
不能保证有序 |
按照hash值存放 |
都不允许重复的元素 |
TreeSet |
有序的 |
按照默认规则排序,也可以自定义 |
List
也是collection接口下的子接口,可以存放重复数据,是按照元素下标的方式存放数据,因此可以直接使用下标来存取数据例如list.get(i)的方式;
Arraylist内部使用动态数组的实现原理,因此使用其默认构造方法创建的长度是10,如果内部容量不够时会自动扩充0.5倍,即当前容量*1.5,也因此arraylist在对数据进行插入和删除时的效率是非常低下的。同时arraylist的是非同步是,即线程是不安全的。
Linkendlist允许插入null值。内部使用双链表的模式对数据进行存储,因此不用考虑容量问题,Linkendlist相比arraylist它的插入和删除的效率是相对高的,但是在对数据进行查询和修改这种需要定位的操作的时候则显的无力,因为它需要拨动指针。Linkendlist没有同步方法,如果涉及多线程访问问题,就必须自己实现访问的同步,解决的方法就是在创建的时候构造一个同步的list,如:
Listlist=Collections.synchronizedList(newLinkedList(...));