Collection集合
list集合系列
ArrarList集合
底层基于数组来实现
查询速度快(根据索引查询数据)
删除效率低(可能需要把后面很多的数据往后移)
添加效率极低(添加时可能需要用到扩容和数据后移)
利用无参构造器创建集合时会创建一个默认为0的数组,添加第一个元素之后,底层回创建一个新的长度为10的数组,,在存第十一个数据的时候会对数组进行扩容1.5倍。(当一个数组通过方法把另一个数组中全部元素加进去,则会创建一个相对应长度的数组)
适用场景
根据索引查询数据的同时数据量不是很大,并且需要存储重复元素,又需要频繁的根据索引来查找数据
共有的遍历方法
第三种循环(forEarch())
第二种循环(迭代器循环())
第一种循环(for()循环)
LinkedList集合
底层基于双链表来实现
查询慢(无论是查询哪一个数据都是从头节点开始查询)
但是对头节点和尾节点的增删改查是很快的(对首尾可以进行快速定位)
增删快(在中间数据中添加或者删除一个数据的时候只需要更改头节点和尾节点,不需要移动数据)
特有的方法:(对首尾有特定的方法)
addFrist()
addLast()
getFrist()
getLast()
removeFrist()
removeLast()
应用场景:
可以用来设计队列
可以用来设计栈
进栈(push)
出栈(pop)
增删首尾数据的情况较多
有序可重复有索引
Set集合系列
HashSet集合
基于哈希表实现(数组+链表+红黑树)
1:第一次添加一个数据的时候,会创建一个默认长度为16的数组,默认加载因子为0.75,数组名为table
2:使用元素的哈希值对数组长度求余计算出应存入的位置
3:判断当前位置是否为null,如果是null直接存入,如果不是,则表示铀元素,调用equals方法来比较是否相等,相等就不存,不等才存
适用场景
没有重复元素需要存储,只希望增删改查都快
LinkedHashSet集合
与set集合不一样的地方在于它可以有序
基于哈希表实现(数组+链表+红黑树)但是每个元素都额外多了一个双链表机制来记入他前后元素的位置
适用场景
如果希望记住添加元素的顺序,也没有重复元素需要存储,且希望增删改查都快
TreeSet集合
与set集合不一样的地方在于它可以排序
对于数值类型:Integer,Double,默认按照数值本身大小进行升序排序
对于字符串字符类型:默认按照首字符的编号进行升序排序
对于自定义的类型不能直接进行排序
方法一:让自定义的类实现Comparable接口,重写里面的compareTo方法来指定比较规则
方法二:通过TreeSet集合有参数构造器,可以设置Compartor对象(比较器对象,用来指定比较规则)
底层基于红黑树来实现(不会存相同的数值)
适用场景
要对元素进行排序,没有重复元素需要存储,且希望增删改查都快
无序不重复无索引
常用的API
add()
增加元素
clear()
清除所有元素
remove()
删除指定元素
contains()
判断当前集合中是否包含指定的对象
isEmpty()
判断当前集合是否为空
size()
返回集合中元素个数
toArray()
吧集合中的元素存储到数组中
c.addAll(x)
把x集合中的全部数据倒入c集合中去
获取迭代器的方法
iterator()
hasNext()
解决并发修改异常问题的方法:使用迭代器自带的remove()
使用增强for表达式或者Lambda表达式来遍历集合并且删除数据时,会产生集合的并发修改异常错误,且无法避免
可变参数(参数类型...名称)
好处和特点
可以传一个或者多个参数给这个方法,也可以不传参数给方法。这样可以灵活的接收数据
注意事项
一:传入的可变参数只能有一个
二:可变参数必须放在形参列表的最后面
三:可变参数在方法中实际是一个数组
Collections集合工具类的静态方法
addAll(集合,可变参数)
批量添加元素
shuffle(集合)
打乱list集合中的顺序
sort(集合)
对list集合中的元素进行升序排序
sort(自定义集合,比较规则)
使用Comparable或者Comparator来定义集合中的排序方式
==============================思维导图==================================