Java之集合

本文详细比较了Java中的ArrayList、LinkedList、vector以及Set(HashSet,TreeSet,LinkedHashSet)在存取顺序、性能和线程安全性方面的特性,强调了在不同场景下的适用性。
摘要由CSDN通过智能技术生成

一. 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,多一条链表来记录位置,所以是有序的。

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值