Java核心技术学习笔记(五)
一、ArrayList,LinkedList,Vector的相同点与区别
Java集合框架提供多种数据结构,其中ArrayList、LinkedList和Vector是常用列表实现。它们具有共同特性,如实现List接口、有序性和可动态调整大小,但也存在底层数据结构、线程安全性和性能等方面的区别。选择哪种集合取决于具体使用场景。除这三种外,Java还提供了其他集合类,如HashSet、TreeSet和HashMap等
Java中的集合(Collection)框架提供了多种数据结构,用于存储和操作对象集合。其中,ArrayList、LinkedList和Vector是三种常用的列表(List)实现。这些类都实现了List接口,因此它们具有一些共同的特性,但也有一些重要的区别。
相同点:
- 实现List接口:ArrayList、LinkedList和Vector都实现了Java的List接口,这意味着它们具有相同的基本操作,如添加(add)、删除(remove)、获取(get)元素等。
- 有序性:这三种集合都是有序的,即元素的插入顺序与迭代顺序相同。
- 可包含重复元素:ArrayList、LinkedList和Vector都允许存储重复的元素。
- 可动态调整大小:这些集合都可以动态地增长和缩小,以适应不同的数据量。
区别: - 底层数据结构:
ArrayList:底层基于动态数组实现,支持快速的随机访问(get和set操作),但在插入和删除元素时可能涉及到数组元素的移动,因此效率相对较低。
LinkedList:底层基于双向链表实现,插入和删除元素时只需要改变相邻节点的引用,因此效率较高。但随机访问元素时需要遍历链表,效率较低。
Vector:与ArrayList类似,底层也是基于动态数组实现,但Vector是线程安全的,因此在多线程环境下性能更好。然而,由于线程同步的开销,Vector在单线程环境下的性能通常不如ArrayList。 - 线程安全性:
ArrayList:不是线程安全的,如果在多线程环境下使用,需要外部同步。
LinkedList:同样不是线程安全的。
Vector:是线程安全的,因为它在方法调用上加了同步锁,但这也导致了性能上的损失 - 性能:
由于底层数据结构和线程安全性的差异,这三种集合在性能上有所不同。一般来说,ArrayList在随机访问和遍历方面表现较好,LinkedList在插入和删除方面表现较好,而Vector由于线程同步的开销,性能通常不如ArrayList。 - 扩容策略:
ArrayList:在需要扩容时,默认将容量增加到原来的1.5倍,然后再进行必要的截断。
LinkedList:由于基于链表实现,不需要扩容。
Vector:在需要扩容时,默认将容量增加到原来的2倍。此外,Vector还提供了一个增长因子(growth factor)参数,可以在创建时指定。
二、HashSet、LinkedHashSet、TreeSet区别
如果你需要一个访问快速的Set,你应该使用HashSet;当你需要一个排序的Set,你应该使用TreeSet;当你需要记录下插入时的顺序时,你应该使用LinedHashSet。
HashSet是采用hash表来实现的。其中的元素没有按顺序排列,add()、remove()以及contains()等方法都是复杂度为O(1)的方法。
TreeSet是采用树结构实现(红黑树算法)。元素是按顺序进行排列,但是add()、remove()以及contains()等方法都是复杂度为O(log (n))的方法。
它还提供了一些方法来处理排序的set,如first(), last(), headSet(), tailSet()等等。
LinkedHashSet介于HashSet和TreeSet之间。它也是一个hash表,但是同时维护了一个双链表来记录插入的顺序。基本方法的复杂度为O(1)。
HashSet
不能保证元素的排列顺序,顺序有可能发生变化
不是同步的,非线程安全
集合元素可以是null,但只能放入一个null
LinkedHashSet
nkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet中不能有相同元素,可以有一个Null元素,元素严格按照放入的顺序排列。
LinkedHashSet如何保证有序和唯一性?
底层数据结构由哈希表和链表组成。
链表保证了元素的有序即存储和取出一致,哈希表保证了元素的唯一性。
添加、删除操作时间复杂度都是O(1)。
非线程安全
TreeSet
TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。
TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。
向TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
定制排序
自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法
1.TreeSet是中不能有相同元素,不可以有Null元素,根据元素的自然顺序进行排序。
2.TreeSet如何保证元素的排序和唯一性?
底层的数据结构是红黑树(一种自平衡二叉查找树)
3.添加、删除操作时间复杂度都是O(log(n))
4.非线程安全
通过以上特点可以分析出,三者都保证了元素的唯一性,如果无排序要求可以选用HashSet;
如果想取出元素的顺序和放入元素的顺序相同,那么可以选用LinkedHashSet。如果想插入、删除立即排序或者按照一定规则排序可以选用TreeSet。

浙公网安备 33010602011771号