集合类

java,util包中提供了一些集合类,这些集合类又被叫做容器,它们提供了不同的存储对象的方式,常用的集合有List集合、Set集合、Map集合。
在这里插入图片描述

List集合

List代表一种线性表的数据结构,List集合有常用的三种实现类Vector、ArrayList、LinkedList。
在这里插入图片描述
Vector

Vector是Java早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,因为效率较低(多了加锁、解锁等操作)。

Vector底层是使用数组来保存数据的,可以根据需要自动增加数组容量。具体实现方式是:默认创建一个大小为10的数组,并将pacityIncrement设置为0;当数组满后,如果pacityIncrement大于0,则将数组的大小扩大为size+pacityIncrement;如果pacityIncrement小于等于0,则将数组容量扩大为原来的2倍。

Vector目前已经被ArrayList代替,不推荐使用。

ArrayList

ArrayList是应用更加广泛的动态数组实现,它与Vector的最大区别在于它不是线程安全的,性能要好很多。

与Vector类似,ArrayList底层也是用数组来保存数据的,当ArrayList数组满时,总是将数组容量扩大为原来的1.5倍

另外,ArrayList使用了transient修饰底层数组,这保证序列化ArrayList对象时不会直接序列化数组,而是通过ArrayList提供的writeObject、readObject方法来实现定制序列化;但对于Vector而言,它没有使用transient修饰底层数组,而且只提供了一个writeObject方法并没有完全实现定制序列化。从序列化机制的角度来看来看,ArrayList的实现要比Vector的实现更加安全。

注意:变量被修饰为transient,表示不能被序列化。transient只能修饰变量而不能修饰类和方法。

Vector和ArrayList底层都是数组实现的,可以通过数组下标进行随机访问,效率较高;但对于插入和删除,除了尾部插入和删除,往往性能较差,因为它要移动后续元素。

LinkedList

LinkedList底层采用一个双向链表实现,是一种链式存储的线性表,它不仅实现了List接口还实现了Deque接口。也就是说,LinkedList既可以当成双向链表使用,也可以当成队列使用,还可以当成栈来使用(Deque代表双端队列,既具有队列的特征,又具有栈的特征)。

由于LinkedList底层是采用双向链表实现,所以LinkedList每次访问某一节点都需要遍历链表,随机访问性能较差。但是插入、删除都只需要改变前后节点的next链的指向,不需要移动后续元素,所以插入、删除的性能较好。

大部分情况下,ArrayList的性能总是优于LinkedList,但如果程序需要经常添加、删除元素,则应考虑使用LinkedList。

Set集合

Set代表一种元素无序、不可重复的集合,Set集合底层是基于Map实现的,常用的实现类有HashSet和TreeSet。
在这里插入图片描述
HashSet

HashSet利用哈希算法,以HashMap为基础实现的,底层采用HashMap来保存所有元素。所有放入HashSet中的集合元素实际上由HashMap的key来保存,而HashMap的value则存储了一个PRESENT,它是一个静态的Object对象。

HashSet的绝大部分方法都是通过调用HashMap的方法来实现的,因此HashSet和HashMap两个集合在实现本质上是相同的。

TreeSet

TreeSet底层采用一个NavigableMap来保存TreeSet集合的元素。但实际上,由于NavigableMap只是一个接口,底层依然是使用TreeMap来包含Set集合中的所有元素。

与HashSet一样,所有放入TreeSet中的集合元素也是TreeMap的key来保存,TreeMap的value存储了一个PRESENT,它是一个静态的Object对象。
TreeSet支持自然顺序访问,但是添加、删除等操作要相对较低效(log(n)时间)。

Map集合

Map是广义Java集合框架中的另外一部分,常用的实现类有HashTable、HashMap和TreeMap。
在这里插入图片描述
HashTable

HashTable也是早期Java提供的一各哈希表实现,它实现了Map接口,另外还扩展了Dictionary类。它是线程安全的,同时不支持null键和null值,由于同步导致的性能开销,现在已经不推荐使用了。

HashMap

HashMap是应用更加广泛的哈希表实现,行为上大致和HashTable一致,主要区别在于HashMap不是同步的,并且支持一个null键和多个null值。通常情况下,HashMap进行put或者get操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选。

TreeMap

TreeMap是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get、put、remove等操作都是O(log(n))的时间复杂度,具体的顺序可以由指定的Comparator来决定,或者根据键的自然顺序来判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值