分享人:李雨航
1.背景介绍
2.知识剖析
3.常见问题
4.编码实战
5.扩展思考
6.参考文献
7.更多讨论
集合框架
没学集合框架之前我们存储多个数据是采用数组实现的,但是我们要创建数组的话先要初始化数组容量
这个时候我们可以使用到集合框架了 List 集合框架接口
List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型, 所以List接口还提供了一些适合于自身的常用方法,List中存储的元素实现类排序,而且可以重复的存储相关元素。
List接口提供的适合于自身的常用方法均与索引有关,这是因为List集合为列表类型,以线性方式存储对象,可以通过对象的索引操作对象。
list集合方法
list接口实现类
List接口的常用实现类有实现类有ArrayList、LinkedList,不常用的有Vector、Stack等,在使用List集合时,通常情况下声明为List类型,实例化时根据实际情况的需要
ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容量,查询元素的速度非常快!
LinkedList是基于链表实现的,从源码可以看出是一个双向链表。
Vector是基于数组实现的,是一个矢量队列,是线程安全的,Vector无论查询和增删都巨慢!
Stack是基于数组实现的,是栈,它继承与Vector,特性是FILO(先进后出)!
动态扩容
ArrayList随机读取的时候采用的是get(index),根据指定位置读取元素,而LinkedList则采用size/2 ,二分法去加速一次读取元素!
list使用场景
1. 当集合中对插入元素数据的速度要求不高,但是要求快速访问元素数据,则使用ArrayList! 2. 当集合中对访问元素数据速度不做要求不高,但是对插入和删除元素数据速度要求高的情况,则使用LinkedList! 3.当集合中有多线程对集合元素进行操作时候,则使用Vector!但是现在Vector现在一般不再使用,如需在多线程下使用,可以用CopyOnWriteArrayList,在java.util.concurrent包下。 4.当集合中有需求是希望后保存的数据先读取出来,则使用Stack。
set集合
Set集合的基本特征是不记录添加顺序,不允许元素重复。最常用的实现类是HashSet.还有不常用的LinkedHashSet,TreeSet,EnumSet
HashSet类直接实现了Set接口, 其底层其实是包装了一个HashMap去实现的。HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。
HashSet按照Hash算法存储集合中的元素,具有很好的存取和查找性能。当向HashSet中添加一些元素时,HashSet会根据该对象的HashCode()方法来得到该对象的HashCode值,然后根据这些HashCode的值来决定元素的位置。
HashSet判断元素重复
HashSet需要同时通过equals和HashCode来判断两个元素是否相等,具体规则是,如果两个元素通过equals为true,并且两个元素的hashCode相等,则这两个元素相等(即重复)。
所以如果要重写保存在HashSet中的对象的equals方法,也要重写hashCode方法,重写前后hashCode返回的结果相等(即保证保存在同一个位置)。 所有参与计算 hashCode() 返回值的关键属性,都应该用于作为 equals() 比较的标准。
重写了equals方法但没有重写hashCode方法,则HashSet可能无法正常工作
https://blog.csdn.net/solafy/article/details/52960777