一. List
存取有序,可以存储重复的元素,可以用下标进行元素的操作
1.ArrayList
在Java数组中,长度是固定的,因此在数组被创建后,不能修改长度,这意味着开发者需要实现知道数组的长度。但在一般情况下,只有在运行时才知道数组长度。为了解决这个问题,ArrayList因此而生.底层是使用数组实现,所以查询速度快,增删速度慢。线程不安全。相当于动态数组,在多线程中不建议使用
1.1)ArrayList的扩容机制
如果当前数组为空,则先设置容量为默认值10,此时还未初始化数组
确认实际的容量,如果不够就扩容,扩容函数grow。
首先将容量扩大为原来的1.5倍,如果数组是空数组,则将数组初始化,默认容量为10,如果不是,在判断是够超出最大容量,超过则直接复制最大值,否则赋予心智,复制原来数组到新数组。
2.LinkedList
基于双向链表结构实现的,因为地址不是连续的,都是一个节点和一个节点相连,没差查询都是重头查询,所以查询速度慢,但是增删只是断裂某个节点对整体影响不大,所以增删速度快,提供了特殊的方法,对头尾的元素操作(进行增删查),线程不安全。也可当作堆栈、队列、双端队列,在多线程中不建议使用
3.vector
底层是数组,方法加了synchronized来保证线程安全,所以效率较慢,使用ArrayList替代
总结
对于随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据(可以在上述ArrayList代码中体现)
二. Set
无序、不可重复的单例集合
1. HashSet
底层是哈希表(数组+链表、数组+红黑树),当链表大于8时就会转换成红黑树,当红黑树小于6时就会转换成链表,其实就是HashMap的实现,键存储的是key。值存放的是一个final修饰对象,内部采用了HashMap作为数据存储,HashSet其实就是在操作HashMap的key,HashSet中没有对应同步的操作,因此是线程不安全的。支持null元素(因为hashMap也支持null键和null值)。
2.TreeSet
底层是红黑树,就是TreeMap 的实现,可以实现有序集合,String和Integer可以根据值进行排序,如果是对象需要实现Compartor接口,重写compareTo()方法执行比较规则。
3. LinkedHashSet:实现了HashSet,多一条链表来记录位置,所以是有序的。
标签:Java,HashSet,ArrayList,链表,增删,线程,数组,集合 From: https://blog.csdn.net/DFSYyyds/article/details/136941458